本文按自底向上的顺序分享MyBatis如何调用存储过程
1. xxxMapper.xml
<select id="storeProcedure" statementType="CALLABLE" parameterType="java.util.Map" resultType="java.util.Map">
{CALL 存储过程名(
#{param1,mode=IN,jdbcType=VARCHAR},
#{param2,mode=OUT,jdbcType=INTEGER},
#{param3,mode=OUT,jdbcType=VARCHAR})
}
</select>
注意,由于有返回值,所以需要传入一个map集合,返回结果也要是一个Map集合。
如果没有返回值,只需要像普通的语句一样传参数或对象即可。
2. mapper层:xxxMapper 接口
void storeProcedure(Map<String, Object> hashMap);
3. service层:xxxServiceImpl.java
public void test(){
try{
Map<String, Object> hashMap = new HashMap<>();
// 设置输入参数的value,输出参数value设置为null
hashMap.put("param1",value);
hashMap.put("param2",null);
hashMap.put("param3",null);
// 调用存储过程
xxxMapper.storeProcedure(hashMap);
// 获取返回值
Integer param2=(Integer)hashMap.get("param2");
String param3=(String)hashMap.get("param3");
} catch (Exception e){
e.printStackTrace();
}
}
存储过程返回值参数对应的value传入null即可,最终通过get("参数名")即可获得结果。
常见问题:
大家自行根据存储过程的定义自行判断传入参数能否为空,本例中传空值将会报错:
org.springframework.dao.DataIntegrityViolationException:
### Error querying database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'param1' cannot be null
更多推荐
MyBatis如何调用存储过程
发布评论