最近需要频繁使用到存储过程,然而 Jdbc 与 JdbcTemplate 原生的调用实在是有些繁杂,所以我抽空封装了一个通用的工具类,能拿到结果集与输出参数。代码如下:
存储过程操作模板类
package zze.workinglog.utils;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.CallableStatementCallback;import org.springframework.jdbc.core.JdbcTemplate;import java.lang.reflect.Field;import java.sql.*;import java.util.*;public class ProcTemplate { private JdbcTemplate jdbcTemplate; public ProcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * 执行存储过程 * @param procName 存储过程名称 * @param outArgInfo 输出参数及参数类型 * @param inArgInfoArr 输入参数及参数值 * @return 结果集封装为 List 返回 */ public List exec(String procName, Map outArgInfo, Object... inArgInfoArr) { // 校验入参个数必须为偶数 if (!isEven(inArgInfoArr.length)) { throw new RuntimeException("一个入参必须对应一个值"); } if (outArgInfo != null) { // 校验输出参数类型必须为 SQLType Collection
使用
// 定义一个存放输出参数信息的 Map ,泛型必须为 Map ,如果没有输出参数则可直接传 nullMap outArgInfo = new HashMap<>();// 向输出参数 Map 中添加输出参数信息,key 是存储过程对应输出参数名称,值是 java.sql.Types 中的成员变量outArgInfo.put("remark", Types.VARCHAR);// 执行存储过程,返回值为将结果集包装的 List,输出参数值直接返回到 outArgInfo// param1:存储过程名称// param2:输出参数 Map 对象// param3-n:输入参数与其值,如 "id",1,"name","zhang",...List list = procTemplate.exec("proc_testOutputParam", outArgInfo, "intUserID", 22340);// 输出参数值直接从 outArgInfo 中拿到System.out.println(outArgInfo.get("remark"));