1、接口
/**
* 调用存储过程
*
* @param procName 存储过程名. 如:testProcParam、mypack.testProcParam
* @param inParams 输入参数映射对象. 格式为:索引号->值
* @param outTypes 输出参数类型映射对象. 格式为:索引号->类型
* @return Map<Integer, Object> 输出结果映射对象. 格式为:索引号->值
*/
public Map<Integer, Object> callProcedure(String procName,
Map<Integer, Object> inParams, Map<Integer, Integer> outTypes);
2、实现方法
public Map<Integer, Object> callProcedure(final String procName,
final Map<Integer, Object> inParams, final Map<Integer, Integer> outTypes) {
return (Map<Integer, Object>) getHibernateTemplate().executeWithNativeSession(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
// 输出参数结果
Map<Integer, Object> resultMap = new HashMap<Integer, Object>();
// 参数个数
int paramCount = 0;
// 存放问号的字符串. 如?或?,?...
String questionMark = "";
// 计算问号个数
if (MapUtils.isNotEmpty(inParams)) {
paramCount += inParams.size();
}
if (MapUtils.isNotEmpty(outTypes)) {
paramCount += outTypes.size();
}
// 设置问号字符串, 以逗号隔开
for (int i = 0; i < paramCount; i++) {
questionMark += "?,";
}
if (!"".equals(questionMark)) questionMark = questionMark.substring(0, questionMark.length() - 1);
// 获取数据库连接
Connection con = session.connection();
// 创建调用存储过程的CallableStatement对象
String sql = "{call " + procName + "(" + questionMark + ")}";
CallableStatement cstmt = con.prepareCall(sql);
// 设置输入参数
if (MapUtils.isNotEmpty(inParams))
for (Map.Entry<Integer, Object> entry : inParams.entrySet()) {
cstmt.setObject(entry.getKey(), entry.getValue());
}
// 注册输出参数
if (MapUtils.isNotEmpty(outTypes))
for (Map.Entry<Integer, Integer> entry : outTypes.entrySet()) {
cstmt.registerOutParameter(entry.getKey(), entry.getValue());
}
// 执行存储过程
cstmt.execute();
// 获取输出参数结果
if (MapUtils.isNotEmpty(outTypes))
for (Map.Entry<Integer, Integer> entry : outTypes.entrySet()) {
resultMap.put(entry.getKey(), cstmt.getObject(entry.getKey()));
}
return resultMap;
}
});
}
3、使用
String procName = "PACK_TASK.PROC_SOFTWORE_UPDATE_ANALYZE"; // 存储过程名
Map<Integer, Object> inParams = new HashMap<Integer, Object>(); // 输入参数. 格式为:索引号->值
Map<Integer, Integer> outTypes = new HashMap<Integer, Integer>(); // 输出参数类型. 格式为:索引号->类型
// 设置输入参数
inParams.put(1, taskId);
// 设置输出类型
outTypes.put(2, Types.INTEGER);
outTypes.put(3, Types.VARCHAR);
// 调用存储过程
Map<Integer, Object> resultMap = softwareResultRepository.callProcedure(procName, inParams, outTypes);
// 获取输出参数值
resultMap.get(2);
resultMap.get(3);