JdbcTemplate中如何进行存储过程的返回结果处理?

JdbcTemplate调用存储过程的返回结果处理方式有两种:

  1. 通过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);  // 获取输出参数
  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提供了两种处理存储过程返回结果的方式:

  1. 通过CallableStatement:更加面向过程,需要构造CallableStatement,但可以处理IN参数
  2. 通过SqlOutParameter和SqlReturnResultSet:通过Map接收,更加面向对象,但只能处理OUT参数和返回ResultSet

根据具体需求选择不同的方式,都可以简化处理存储过程的返回结果,不再需要自己去获取输出参数或处理ResultSet。