• Springboot Mybatis 、JPA 调用存储过程,实战教程


    前言

    学习是自己的事。

    但是跟着我学习,也未尝不可。

    话少货干, 直接开搞。

    正文

    本篇内容 :

    1. mybatis 怎么调用 存储过程 

    存储过程样例 两种 :

    ① 返回 对象的

    ② 返回单个值的


    2. JPA 怎么调用 存储过程


    存储过程样例 两种 :

    ① 返回 对象的

    ② 返回单个值的
     

    PART 1 mybatis 调用存储过程

    表一张:



     

    存储过程2个:

    第一个是返回 list,传入一个参数 :

     代码:

    1. CREATE DEFINER=`mytoor`@`%` PROCEDURE `testA`(IN `name` VARCHAR(20))
    2. BEGIN
    3. SELECT * FROM USER WHERE userName=name;
    4. END

    第二个是插入(传入 2个值),返回(一个值)影响行数 :

     代码:

    1. CREATE DEFINER=`mytoor`@`%` PROCEDURE `ADDTEST`(IN `name` varchar(32),IN `age` int(11))
    2. BEGIN
    3. insert into user set userName=name,userAge=age;
    4. select ROW_COUNT();
    5. END


    mapper:

    怎么写 ,就跟平常写正常的CRUD一样就好:

     代码:

    1. List playQueryProc(String name);
    2. int playAddProc(@Param("name") String name, @Param("age")Integer age);

    mapper.xml :
     

    代码:
     

    controller 调用示例:

     代码:
     

    1. @GetMapping("/procTest")
    2. public void procTest() {
    3. List userList = mapper.playQueryProc("AA");
    4. System.out.println(userList.toString());
    5. int effectNum = mapper.playAddProc("JCCC", 19);
    6. System.out.println(effectNum);
    7. }

    给数据库表先弄一个模拟数据, 提供给 第一个查询存储过程调用:

     然后调用一下示例接口:

    可以看到调用成功:

    2个存储过程都能正常调用 :

    PART 2 JPA调用存储过程

    表 :
     

     存储过程一个 :

    JPA的就举这么一个例子, 即有传入参数的, 然后返回参数里面同时有 返回单个值,和返回查询对象list的。
     
     这样大家就足矣依葫芦画瓢了。



      

    接下来是 JPA 调用存储过程的方式, 注意点了!

     
     首先是看我们的实体 User ,我们在这个User上 使用 相关注解去配置 存储过程:

    1. @Data
    2. @Entity // 该注解声明一个实体类,与数据库中的表对应
    3. @NamedStoredProcedureQueries({
    4. @NamedStoredProcedureQuery(name = "testA", procedureName = "testA",
    5. resultClasses = { User.class },
    6. parameters = {
    7. @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class),
    8. @StoredProcedureParameter(mode = ParameterMode.OUT, name = "num", type = Integer.class)
    9. }),
    10. })
    11. public class User {
    12. @Id
    13. @GeneratedValue(strategy = GenerationType.IDENTITY) // 自动生成
    14. private Integer id;
    15. private String userName;
    16. private String userAge;
    17. }

    代码简析:


    关注点 :


    ① 我们正常来说,配置多个存储过程是存在的, 用了

    @NamedStoredProcedureQueries

    这是一个数组,里面可以 单独去 定义一个个存储过程的 相关配置。

    ② 对存储过程的一些相关 对应配置 ,用了 

    @NamedStoredProcedureQuery

    比如我们这次的示例  存储过程名称(数据库里创建的) testA  

     procedureName = "testA"

    然后传入的参数 是一个 name 

    mode = ParameterMode.IN :   代表传入 

    name = "name"  :                    代表我传入的参数key

    type = String.class :                代表我传入参数的类型

     @StoredProcedureParameter(mode = ParameterMode.IN, name = "name", type = String.class)

    然后返回参数,有一个是 我们示例故意返回的单个值 (count sql返回的)

    @StoredProcedureParameter(mode = ParameterMode.OUT, name = "num", type = Integer.class

    然后还有我们里面涉及到查询,返回了一个list的 ,这个不需要使用 @StoredProcedureParameter,

    我们用的

     resultClasses = { User.class }

    OK, 接下来看 怎么调用 。

    JPA 其实有2种方式 :

    ① 配合 注解 

      @Procedure 去使用  我这里不推荐。 

    ② 使用  EntityManager entityManager ,拿出返回结果 StoredProcedureQuery 。

    本篇示例用的 后者 这种, 我觉得这种用起来舒服方便更多。

    事不宜迟, 看剑!

    1. /**
    2. * @Author: JCccc
    3. * @Description:
    4. * @Date: 2022/8/4 23:21
    5. */
    6. @RestController
    7. public class UserController {
    8. @Autowired
    9. EntityManager entityManager;
    10. @GetMapping("/procTest")
    11. public void procTest() {
    12. StoredProcedureQuery result = test("AA");
    13. Integer nums = (Integer)result.getOutputParameterValue("num");
    14. List resultList = result.getResultList();
    15. System.out.println(resultList.toString());
    16. System.out.println(nums);
    17. }
    18. public StoredProcedureQuery test(String name) {
    19. StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("testA");
    20. store.setParameter("name", name);
    21. store.execute();
    22. return store;
    23. }
    24. }

    简析:

    数据库内模拟一条数据 :

    老样子,apifox调用一波接口:

    打个断点看看啥玩意 :

    这里面包含我们这个存储过程返回的所有东西:
     

    可以看到调用返回结果:


    好了,就到这吧。

    可以看到 JPA 调用,我讲的是比较细致的, 原因有两个:

    第一个是 : 确实麻烦一点,mybatis的调用相对精简很多

    第二个是 :

    群里面反馈的,我觉得有意义,有必要  。


    大家看文章的时候,如果发现控制台的打印输出时间, 可以忽视, 哈哈 。我作息不规律~

    学习是自己的事。

    但是跟着我学习,也未尝不可。

    有想法的欢迎交流,加我~

  • 相关阅读:
    [FSCTF 2023] web题解
    linux yum安装mysq8
    【编程题】【Scratch二级】2019.09 制作蝙蝠冲关游戏
    Android入门第14天-AndroidStudio本机开发环境中gradle、sdk以及AVD目录的迁移
    小白也能看懂的国内外 AI 芯片概述
    【Linux】自动化构建工具-make/Makefile&&第一个小程序
    用jQuery向FCKEditor插件取值、赋值
    洛谷刷题入门篇:顺序结构
    sass的常用语法总结
    13、Efficient Geometry-aware 3D Generative Adversarial Networks
  • 原文地址:https://blog.csdn.net/qq_35387940/article/details/126177767