JdbcTemplate调用存储过程的返回结果处理方式有两种:
- 通过CallableStatement获取输出参数和返回结果
这需要使用JdbcTemplate的call()方法和CallableStatementCreator接口,步骤如下:
- 定义CallableStatementCreator实现,在createCallableStatement()方法中构造CallableStatement,并注册输出参数
- 执行call(),传入CallableStatementCreator
- 通过CallableStatement获取输出参数和返回结果
示例:
public class UserCallableStatementCreator implements CallableStatementCreator {
public CallableStatement createCallableStatement(Connection con) throws SQLException {
String sql = "{call get_user_name(?)}";
CallableStatement cs = con.prepareCall(sql);
cs.registerOutParameter(1, Types.VARCHAR);
return cs;
}
}
CallableStatementCreator csc = new UserCallableStatementCreator();
jdbcTemplate.call(csc);
String name = cs.getString(1); // 获取输出参数
- 通过SqlOutParameter和SqlReturnResultSet定义输出参数和返回结果
这需要直接使用JdbcTemplate的call()方法,然后通过Map接收输出参数和ResultSet,步骤如下:
- 定义SqlOutParameter定义输出参数
- 定义SqlReturnResultSet定义返回的ResultSet
- 执行call(),传入定义好的输出参数和返回结果
- 从Map中获取输出参数,和ResultSet结果
示例:
SqlOutParameter out = new SqlOutParameter("name", Types.VARCHAR);
SqlReturnResultSet rs = new SqlReturnResultSet("rs", Types.VARCHAR);
Map<String, Object> map = jdbcTemplate.call(sql, out, rs);
String name = (String) map.get(out.getName());
ResultSet resultSet = (ResultSet) map.get(rs.getName());
所以,JdbcTemplate提供了两种处理存储过程返回结果的方式:
- 通过CallableStatement:更加面向过程,需要构造CallableStatement,但可以处理IN参数
- 通过SqlOutParameter和SqlReturnResultSet:通过Map接收,更加面向对象,但只能处理OUT参数和返回ResultSet
根据具体需求选择不同的方式,都可以简化处理存储过程的返回结果,不再需要自己去获取输出参数或处理ResultSet。