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

-- 正确;
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 :

Mybatis中使用存储过程实践_存储过程


【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