mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
一、接收一个返回值
使用Map接收返回参数,output参数放在传入的param中
创建表
DROP TABLE IF EXISTS `demo`;
CREATE TABLE `demo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of demo
-- ----------------------------
INSERT INTO `demo` VALUES ('1', '测试');
创建存储过程
DROP PROCEDURE IF EXISTS pro;
CREATE PROCEDURE pro (
IN userId INT,
OUT userCount INT
)
BEGIN
DECLARE user_name VARCHAR (64);
SELECT NAME FROM demo WHERE id = userId INTO user_name;
INSERT INTO demo (NAME) VALUES (user_name);
SELECT COUNT(*) FROM demo INTO userCount;
END;
mapper.xml
<select id="procedureTest" parameterMap="pm" statementType="CALLABLE">
CALL pro(#{userId,mode=IN},#{userCount,mode=OUT,jdbcType=INTEGER});
</select>
<parameterMap id="pm" type="java.util.Map">
<parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
<parameter property="userCount" jdbcType="INTEGER" mode="OUT"></parameter>
</parameterMap>
service
@Override
public void procedureTest() {
Map<String, Object> param = new HashMap<>();
param.put("userId", "1");
demoMapper.procedureTest(param);
System.out.println("输出结果是:"+param.get("userCount"));
}
输出结果
参数名不一定和存储过程一样,只和传参顺有关,使用下图配置同样可以获取结果
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接收
@Override
public void procedureTest() {
Map<String, Object> param = new HashMap<>();
param.put("userId", "1");
List<?> list = demoMapper.procedureTest(param);
System.out.println("输出结果是:" + param.get("userCount_2"));
System.out.println("输出集合:" + list.size());
}
<select id="procedureTest" parameterMap="pm" statementType="CALLABLE" resultMap="rm">
CALL pro(#{userId,mode=IN},#{userCount_2,mode=OUT,jdbcType=INTEGER});
</select>
<parameterMap id="pm" type="java.util.Map">
<parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
<parameter property="userCount_2" jdbcType="INTEGER" mode="OUT"></parameter>
</parameterMap>
<resultMap id="rm" type="com.csstj.srm.entity.procedureTestEntity">
<result column="id" property="id"></result>
<result column="name" property="userName"></result>
</resultMap>
三、返回多个结果集
四、第二种配置也可以
CALL s_generatePlan_new (
#{organizationId, mode=IN,jdbcType=VARCHAR},
#{gradeId, mode=IN,jdbcType=VARCHAR},
#{semesterId, mode=IN,jdbcType=VARCHAR},
#{className, mode=IN,jdbcType=VARCHAR},
#{employeeCode, mode=IN,jdbcType=VARCHAR},
#{courseName, mode=IN,jdbcType=VARCHAR},
#{classroomName, mode=IN,jdbcType=VARCHAR},
#{approverId, mode=IN,jdbcType=VARCHAR},
#{createBy, mode=IN,jdbcType=VARCHAR},
#{total,mode=OUT ,jdbcType=VARCHAR})
到此这篇关于mybatis调用mysql存储过程(返回参数,单结果集,多结果集)的文章就介绍到这了,更多相关mybatis调用mysql存储过程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341