SpringBoot jpa调用MySQL存储过程

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: SpringBoot jpa调用MySQL存储过程

主页:写程序的小王叔叔的博客欢迎来访👀

支持:点赞收藏关注



1、文件配置

########################################################
###datasource  配置MYSQL数据源;
########################################################
## 数据库
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.datasource.url=jdbc:mysql://IP:3306/food?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
#spring.datasource.password=root
spring.datasource.password=123456
########################################################
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.tomcat.max-active=100
spring.datasource.tomcat.max-idle=200
spring.datasource.tomcat.initialSize=20
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
#这个东西建议有,不知道为什么,放他之后,请求数据库的一些问题自动就没了
spring.cache.ehcache.config=classpath:ehcache.xml

image.gif

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>

image.gif

image.gif

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()
}

image.gif

serviceImpl.java

@Autowired
private 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();
    }
  }

image.gif

存储过程 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

image.gif

举例

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

image.gif


转载声明:本文为博主原创文章,未经博主允许不得转载

⚠️注意 ~

💯本期内容就结束了,如果内容有误,麻烦大家评论区指出

如有疑问❓可以在评论区留言💬或私信留言💬,尽我最大能力🏃‍♀️帮大家解决👨‍🏫!

如果我的文章有帮助,欢迎点赞+关注✔️鼓励博主🏃,您的鼓励是我分享的动力🏃🏃🏃~


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
1月前
|
存储 关系型数据库 MySQL
Mysql基础第二十六天,使用存储过程
Mysql基础第二十六天,使用存储过程
28 0
Mysql基础第二十六天,使用存储过程
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】9、存储过程
【MySQL 数据库】9、存储过程
205 0
|
8天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
17天前
|
存储 SQL 关系型数据库
mysql存储过程示例
mysql存储过程示例
11 0
|
23天前
|
JavaScript Java 关系型数据库
基于 java + Springboot + vue +mysql 大学生实习管理系统(含源码)
本文档介绍了基于Springboot的实习管理系统的设计与实现。系统采用B/S架构,旨在解决实习管理中的人工管理问题,提高效率。系统特点包括对用户输入的验证和数据安全性保障。功能涵盖首页、个人中心、班级管理、学生管理、教师管理、实习单位管理、实习作业管理、教师评分管理、单位成绩管理和系统管理等。用户分为管理员、教师和学生,各自有不同的操作权限。
|
1月前
|
Java 关系型数据库 MySQL
【项目】手把手带你用 SpringBoot、Uniapp、MySql 开发一个简单的活动报名项目
【项目】手把手带你用 SpringBoot、Uniapp、MySql 开发一个简单的活动报名项目
150 1
|
2月前
|
Java 关系型数据库 MySQL
docker 部署springboot项目,连接mysql容器
docker 部署springboot项目,连接mysql容器
103 0
|
SQL NoSQL Java
|
Java 应用服务中间件 Maven
传统maven项目和现在spring boot项目的区别
Spring Boot:传统 Web 项目与采用 Spring Boot 项目区别
357 0
传统maven项目和现在spring boot项目的区别