本文按自底向上的顺序分享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
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐