Dao层调用存储过程分两种情况,有输出参数 和没有输出参数。
处理没有输出参数时
public void dataBackup(final String filePath,final String fileName) throws DAOException {
Session session = sessionFactory.getCurrentSession();
session.doWork(new Work() {
public void execute(Connection conn) throws SQLException {
CallableStatement call = conn.prepareCall("{call 存储过程名(?,?)}");
call.setString(1, fileName); //输入参数1
call.setString(2, filePath + fileName);//输入参数2
call.executeQuery();
call.close();
}
});
}
处理待输出参数时
public Integer judgeQualified(final Integer compressionTestId) throws DAOException {
Session session = sessionFactory.getCurrentSession();
final Map<String, Integer> map = new HashMap<String, Integer>();
session.doWork(new Work() {
public void execute(Connection conn) throws SQLException {
CallableStatement call = null;
try {
call = conn.prepareCall("{call get_test_result(?,?)}");
call.setInt(1, compressionTestId);
call.registerOutParameter(2, Types.INTEGER);
call.executeQuery();
map.put("states", call.getInt(2));// 返回值
} catch (Exception e) {
map.put("states", 4);
e.printStackTrace();
} finally {
if (call != null) {
call.close();
}
}
}
});
Integer states = map.get("states") == null ? 4 : Integer.parseInt(map.get("states").toString());
return states;
}
由于使用内部对象无法使用变量赋值,所有通过构造map的方式取出存储过程的输出值。这样就可以成功调到输出值了。