SpringBoot jpa调用MySQL存储过程

简介: 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


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

⚠️注意 ~

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

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

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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
438 10
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
555 15
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
3673 45
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
603 5
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
841 0
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
394 5
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
681 1
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
424 8

推荐镜像

更多