在工作中经常会有需要通过java去调用存储过程的情况,实际工作中可能会有N多个存储过程,各自实现相应的业务场景,而我们需要在不同的地方知道调用某个存储过程,比如从前端请求某个存储过程,或者别的业务模块通过接口调用某个存储过程,那么能不能写个通用的方法去完成,答案是肯定的,此处以mysql为例,废话不多上代码:
mapper类定义方法
public interface SysUtilMapper {
/**
*
* @param param 存储过程参数,包括存储过程名称 输入输入参数表达式 输入参数值
* @return
*/
Map<String,Object> callProcedure(Map<String,Object> param);
}
Mapper.xml 定义
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.*.*.mapper.SysUtilMapper">
<!-- 存储过程调用 -->
<select id="callProcedure" parameterType="java.util.Map" statementType="CALLABLE" resultType="java.util.Map">
{call ${procName} (${paramExp})}
</select>
</mapper>
Service定义
@Service
public class SysUtilService {
@Autowired
private SysUtilMapper utilMapper;
public Map<String,Object> callProcedure(Map<String,Object> param){
return utilMapper.callProcedure(param);
}
}
接下来就是调用了
/**
*
* @param prcoName存储过程名称
* @return
*/
@ApiOperation(value = "存储过程调用", notes = "存储过程调用")
@PostMapping("/doCallProc")
@ResponseBody
public AjaxResult doCallProc(@RequestParam String prcoName)
{
log.info("执行存储过程调用");
//存储过程调用
Map<String,Object> procParam=new HashMap<>();
//存储过程名称
procParam.put("procName",prcoName);
//存储过程参数 如果是带有输入输出参数的存储过程 拼接参数字符串:一个参数 '# {paramName,mode=modeType,jdbcType=Type}'
// modeType: IN OUT Type:VARCHAR 等
//同时 有入参的话 map在插入 参数名:参数值 的键值对
procParam.put("paramExp","#{in_value,mode=IN,jdbcType=VARCHAR},#{out_code,mode=OUT,jdbcType=VARCHAR},#{out_desc,mode=OUT,jdbcType=VARCHAR}");
procParam.put("in_value","测试输入值");
Map<String,Object> result=utilService.callProcedure(procParam);
System.out.println("执行结果"+result.get("out_code")+result.get("out_desc"));
}
方法中外部输入的只有存储过程名称,当然输入参数也可从外部输入,相应增加即可。
至此,大功告成!