实战|SpringBoot jpa 调用 MySQL 存储过程
作者:写程序的小王叔叔
- 2022 年 6 月 30 日
本文字数:3877 字
阅读完需:约 13 分钟

1、基础配置
###########################################################datasource 配置MYSQL数据源;########################################################## 数据库spring.jpa.database = MYSQLspring.jpa.show-sql = truespring.datasource.url=jdbc:mysql://IP:3306/vcoo_food?useUnicode=true&characterEncoding=UTF-8spring.datasource.username=root#spring.datasource.password=rootspring.datasource.password=123456########################################################spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.tomcat.max-active=100spring.datasource.tomcat.max-idle=200spring.datasource.tomcat.initialSize=20# Hibernate ddl auto (create, create-drop, update)spring.jpa.properties.hibernate.hbm2ddl.auto=updatespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialectspring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
#这个东西建议有,不知道为什么,放他之后,请求数据库的一些问题自动就没了spring.cache.ehcache.config=classpath:ehcache.xml
复制代码
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <cache name="SysUsers" maxEntriesLocalHeap="200" timeToLiveSeconds="600"> </cache></ehcache>
复制代码
2、代码配置
entity.java
@Entity@Table(name = "prod_sale_master") //表名@Component/***********配置存储过程地方***************************/@NamedStoredProcedureQueries({//一个实体类涉及多个存储过程时,注意配置的格式@***({}) @NamedStoredProcedureQuery(//配置单个存储过程name="p_prod_sale_make" ,//springboot jpa 调用的名字procedureName = "p_prod_sale_make" ,//mysql调用存储过程的名字 parameters = {//要传的参数 //in表示传入 out表示传出或者说是返回值//name表示存储过程要用的参数名称//type表示要传入参数的类型@StoredProcedureParameter(mode=ParameterMode.IN,name="v_rec_emp",type=String.class), @StoredProcedureParameter(mode=ParameterMode.IN,name="v_mem_card",type=String.class), @StoredProcedureParameter(mode=ParameterMode.IN,name="v_Room_Code",type=String.class), @StoredProcedureParameter(mode=ParameterMode.IN,name="v_Mem_Cnt",type=Integer.class), @StoredProcedureParameter(mode=ParameterMode.OUT,name="v_Err_Msg",type=String.class) }), @NamedStoredProcedureQuery(name="p_chg_room" ,procedureName = "p_chg_room" , parameters = { @StoredProcedureParameter(mode=ParameterMode.IN,name="v_Bill_Code",type=String.class), @StoredProcedureParameter(mode=ParameterMode.IN,name="v_Room_Code",type=String.class), @StoredProcedureParameter(mode=ParameterMode.OUT,name="v_Err_Msg",type=String.class) }) })})/*****************************************/public class ProdSaleMaster {//实体名 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="rec_id")//建议个数据库的名字一样 全部对应 无论大小写 private Integer rec_id;//序号 @Column(name="bill_code") /////set()/get() }复制代码
serviceImpl.java
@Autowiredprivate EntityManager entityManager;
@Override public Object saveProdSaleMaster(String v_rec_emp, String v_mem_card, String v_Room_Code, int v_Mem_Cnt) { Result resultLogin = new Result(); try {/**************存储过程使用配置地方***********************************************///StoredProcedureQuery 创建存储过程仓库//createStoredProcedureQuery(name) - 》 name表示 springboot jpa配置的名称:见entity.java的name//registerStoredProcedureParameter表示存储过程中注册的参数//ParameterMode 其中的in/out和entity.java中配置一样
StoredProcedureQuery storedProcedureQuery = this.entityManager.createStoredProcedureQuery("p_prod_sale_make"); storedProcedureQuery.registerStoredProcedureParameter("v_rec_emp", String.class, ParameterMode.IN); storedProcedureQuery.registerStoredProcedureParameter("v_mem_card", String.class, ParameterMode.IN); storedProcedureQuery.registerStoredProcedureParameter("v_Room_Code", String.class, ParameterMode.IN); storedProcedureQuery.registerStoredProcedureParameter("v_Mem_Cnt", Integer.class, ParameterMode.IN); storedProcedureQuery.registerStoredProcedureParameter("v_Err_Msg", String.class, ParameterMode.OUT);
// setParameter 给存储过程配置你要传入的参数 storedProcedureQuery.setParameter("v_rec_emp",v_rec_emp); storedProcedureQuery.setParameter("v_mem_card", v_mem_card); storedProcedureQuery.setParameter("v_Room_Code",v_Room_Code); storedProcedureQuery.setParameter("v_Mem_Cnt", (int) v_Mem_Cnt);//存储过程执行调用 storedProcedureQuery.execute();//getOutputParameterValue 存储过程执行后,返回的结果,直接取就可以,返回类型只有一个Object类型 Object v_User_Rht = storedProcedureQuery.getOutputParameterValue("v_Err_Msg");/*****************************************************************/ return v_User_Rht; } catch (Exception e) { resultLogin.setStatus(0); resultLogin.setData(null); resultLogin.setMessage("请求失败!"); e.printStackTrace(); return resultLogin; }finally { this.entityManager.close(); } }复制代码
存储过程 if - else if - else 嵌套
模板
BEGIN
IF 条件 THEN
IF 条件 THEN
ELSEIF 条件 THEN
ELSEIF 条件 THEN
ELSE
END If;
ELSE IF 条件 THEN
ELSEIF 条件 THEN
ELSEIF 条件 THEN
ELSE
END If; END IF END复制代码
举例分析
CREATE DEFINER = 'root'@'localhost'PROCEDURE logistics.p_scan_task(IN v_billId varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci, IN v_courierUserId varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci, OUT v_Err_Msg varchar(255))BEGIN DECLARE v_BillStatus varchar(255); DECLARE v_Userid varchar(255); DECLARE v_status varchar(255);
DECLARE v_pay_status varchar(255); DECLARE v_pay_cost varchar(255);
SELECT bill_status,courier_user_id,status,pay_status, pay_cost FROM platform_lading_bill WHERE bill_id=v_billId INTO v_BillStatus, v_Userid, v_pay_status , v_pay_cost;
IF v_pay_status = '1' THEN IF v_BillStatus='3' AND v_status='0' AND v_Userid IS NULL THEN UPDATE platform_lading_bill SET bill_status='7', status='1' , courier_user_id=v_courierUserId WHERE bill_id=v_billId ; SET v_Err_Msg = CONCAT('{"state":0,"msg":"Посылка готова, скоро отправиться!"}');##取件成功,准备派送 ELSEIF v_BillStatus='7' AND v_status='1' AND v_Userid IS NOT NULL AND v_Userid = v_courierUserId THEN UPDATE platform_lading_bill SET bill_status='8', status='1' , courier_user_id=v_courierUserId WHERE bill_id=v_billId ; SET v_Err_Msg = CONCAT('{"state":0,"msg":"Уже отправлена, пользователь получил!"}') ;##派送已完成,用户已收货 ELSEIF v_BillStatus='10' AND v_Userid IS NOT NULL AND v_Userid = v_courierUserId THEN SET v_Err_Msg = CONCAT('{"state":0,"msg":"Пользователь отказал в получении!"}') ;##用户已拒收 ELSE SET v_Err_Msg = CONCAT('{"state":0,"msg":"Правильно отсканируйте трекинг-номер!"}') ;##请正确扫描物流单号 END IF; ELSE SET v_Err_Msg = CONCAT('{"state":0,"msg":"未支付","data":{"billInfo":[{"courierUserId":"',v_courierUserId,'","pay_cost":"',v_pay_cost,'","pay_status":"',v_pay_status,'"}]}}') ;##未支付 END IF;END复制代码
转载声明:本文为博主原创文章,未经博主允许不得转载
⚠️注意 ~
💯本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问❓可以在评论区留言💬或私信留言💬,尽我最大能力🏃♀️帮大家解决👨🏫!
如果我的文章有帮助到您,欢迎点赞+关注✔️鼓励博主🏃,您的鼓励是我分享的动力🏃🏃🏃~
划线
评论
复制
发布于: 刚刚阅读数: 3
版权声明: 本文为 InfoQ 作者【写程序的小王叔叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/d7cc903f2fe9a4590dc22de39】。文章转载请联系作者。
写程序的小王叔叔
关注
用博客的方式写代码 2022.06.11 加入
Java开发工程师-【CSDN】Java领域新星创作者-51CTO明日之星认证-阿里云星级博主认证-稀土掘金分享博主










评论