Mybatis中使用存储过程实践

存储过程没有返回值,不要尝试接收存储过程返回值:

-- 正确;
deviceImagesExtendDao.getCheckedDeviceCount(map);

-- 之后代码直接使用map即可。如果需要返回值,map里面有对应的inout型或out型参数。

-- 错误;
Map<String, Object> checkedDeviceCount = deviceImagesExtendDao.getCheckedDeviceCount(map);

-- checkedDeviceCount  将会为null !!!

【1】带有in /out 参数

存储过程实例如下:

create PROCEDURE get_user_count(in sex_id INT,OUT user_count INT)

BEGIN
 
	IF sex_id = 0 THEN
	SELECT COUNT(*) FROM p_user WHERE p_user.sex="女" into user_count;
	ELSE
	SELECT COUNT(*) FROM p_user WHERE p_user.sex="男" INTO user_count;
	END IF;
END

Navicat 下 调用存储过程 :

set @user_count = 0;
CALL get_user_count(1,@user_count);
SELECT @user_count;

result as follows :

这里写图片描述


【2】xml配置

<!--注意这里statementType="CALLABLE"-->
<select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
	call get_user_count(?,?)
</select>

<!-- type --java.util.Map-->
<parameterMap type="java.util.Map" id="getUserCountMap">
	<!-- mod distinguish the in or out  or inout -->
	<parameter property="sexId"  jdbcType="INTEGER" mode="IN"/>
	<parameter property="userCount" jdbcType="INTEGER" mode="OUT"/>
</parameterMap>

或者xml配置如下:

<!-- 设置 statmentType callable-->
<select id="getUserCount" parametertype="hashmap" statementType="CALLABLE" resultType="hashmap">
		{call get_user_count(
			#{sexId,jdbcType=INTEGER,mode=IN},
			#{userCount,jdbcType=INTEGER,mode=OUT}
		)}
</select>

|
这里需要说明一下xml配置与存储过程参数注意事项 :

  • ① 如果两个参数不同类型,务必按照存储过程参数类型次序进行xml配置;

  • ② 如果两个参数同样类型,将会按照xml配置依次传参;mybatis或者mysql不会按照jdbcType给你自动甄别。

  • ③ select标签可以不加resultType,即使加了也不会有返回值接收(存储过程无返回值)


【3】代码测试

@Test
public void getUserCount(){
	
	SqlSession session = MybatisUtils.getFactory().openSession();
	String statement = "com.web.mapper.userMapper.getUserCount";
	Map<String, Integer> paramMap = new HashMap<String, Integer>();
	paramMap.put("sexId", 0);
	paramMap.put("userCount", 1);
	
	Integer userCount = session.selectOne(statement,paramMap);
	/* commit by yourself*/
	session.commit();
	System.out.println("effect rows.."+userCount);
	System.out.println("存储过程输出结果。。。"+paramMap.get("userCount"));
	session.close();
}

result as follows :

 effect rows..null
 /*存储过程无返回值,当然是null !!!*/
存储过程输出结果。。。3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值