经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
来源:jb51  时间:2022/1/17 12:17:04  对本文有异议

一、接收一个返回值

使用Map接收返回参数,output参数放在传入的param中

创建表

  1. DROP TABLE IF EXISTS `demo`;
  2. CREATE TABLE `demo` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `name` varchar(255) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;
  7. -- ----------------------------
  8. -- Records of demo
  9. -- ----------------------------
  10. INSERT INTO `demo` VALUES ('1', '测试');

创建存储过程

  1. DROP PROCEDURE IF EXISTS pro;
  2. CREATE PROCEDURE pro (
  3. IN userId INT,
  4. OUT userCount INT
  5. )
  6. BEGIN
  7. DECLARE user_name VARCHAR (64);
  8. SELECT NAME FROM demo WHERE id = userId INTO user_name;
  9. INSERT INTO demo (NAME) VALUES (user_name);
  10. SELECT COUNT(*) FROM demo INTO userCount;
  11. END;

mapper.xml

  1. <select id="procedureTest" parameterMap="pm" statementType="CALLABLE">
  2. CALL pro(#{userId,mode=IN},#{userCount,mode=OUT,jdbcType=INTEGER});
  3. </select>
  4. <parameterMap id="pm" type="java.util.Map">
  5. <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
  6. <parameter property="userCount" jdbcType="INTEGER" mode="OUT"></parameter>
  7. </parameterMap>

service

  1. @Override
  2. public void procedureTest() {
  3. Map<String, Object> param = new HashMap<>();
  4. param.put("userId", "1");
  5. demoMapper.procedureTest(param);
  6. System.out.println("输出结果是:"+param.get("userCount"));
  7. }

输出结果

参数名不一定和存储过程一样,只和传参顺有关,使用下图配置同样可以获取结果

  1. System.out.println("输出结果是:"+param.get("userCount_2"));

注意事项:

1、  存储过程的参数和名称无关,只和顺序有关系

2、  存储过程的output参数,只能通过传入的map获取

3、  存储过程返回的结果集可直接用返回的map接收

4、  存储过程的return结果需要使用?=call procName(?,?)的第一个参数接收,需要指定对应的mode为OUT类型

5、  存储过程对应的数据类型为枚举类型,需要使用大写,如VARCHAR

output是在存储过程中的参数的返回值(输出参数),而ReturnValue是存储过程返回的值(使用return关键字),一个存储过程可以有任意多个依靠参数返回的值,但只有一个ReturnValue。

存储过程主要分成三类:

1、返回记录集的存储过程:执行结果是一个记录集,例如,从数据库中检索出符合某一个或几个条件的记录。

2、返回数值得的存储过程(也可称为标量存储过程),其执行完后返回一个值,例如数据库中执行一个有返回值的函数或命令。

3、行为存储过程,用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

二、接收list结果集

使用list接收

  1. @Override
  2. public void procedureTest() {
  3. Map<String, Object> param = new HashMap<>();
  4. param.put("userId", "1");
  5. List<?> list = demoMapper.procedureTest(param);
  6. System.out.println("输出结果是:" + param.get("userCount_2"));
  7. System.out.println("输出集合:" + list.size());
  8. }
  1. <select id="procedureTest" parameterMap="pm" statementType="CALLABLE" resultMap="rm">
  2. CALL pro(#{userId,mode=IN},#{userCount_2,mode=OUT,jdbcType=INTEGER});
  3. </select>
  4. <parameterMap id="pm" type="java.util.Map">
  5. <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
  6. <parameter property="userCount_2" jdbcType="INTEGER" mode="OUT"></parameter>
  7. </parameterMap>
  8. <resultMap id="rm" type="com.csstj.srm.entity.procedureTestEntity">
  9. <result column="id" property="id"></result>
  10. <result column="name" property="userName"></result>
  11. </resultMap>

三、返回多个结果集

四、第二种配置也可以

  1. CALL s_generatePlan_new (
  2. #{organizationId, mode=IN,jdbcType=VARCHAR},
  3. #{gradeId, mode=IN,jdbcType=VARCHAR},
  4. #{semesterId, mode=IN,jdbcType=VARCHAR},
  5. #{className, mode=IN,jdbcType=VARCHAR},
  6. #{employeeCode, mode=IN,jdbcType=VARCHAR},
  7. #{courseName, mode=IN,jdbcType=VARCHAR},
  8. #{classroomName, mode=IN,jdbcType=VARCHAR},
  9. #{approverId, mode=IN,jdbcType=VARCHAR},
  10. #{createBy, mode=IN,jdbcType=VARCHAR},
  11. #{total,mode=OUT ,jdbcType=VARCHAR})

到此这篇关于mybatis调用mysql存储过程(返回参数,单结果集,多结果集)的文章就介绍到这了,更多相关mybatis调用mysql存储过程内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号