JdbcTemplate中如何使用SimpleJdbcCall进行存储过程的调用?

JdbcTemplate除了可以通过call()方法调用存储过程外,还提供了SimpleJdbcCall类来更方便地执行存储过程。
使用SimpleJdbcCall调用存储过程的主要步骤如下:

  1. 创建SimpleJdbcCall对象,指定存储过程名称:
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("get_user");
  1. 设置IN参数和OUT参数:
SqlParameterSource in = new MapSqlParameterSource()
    .addValue("id", 1);

call.declareParameters(in);  // 设置IN参数  

SqlReturnResultSet rs = new SqlReturnResultSet("name", Types.VARCHAR);
call.declareParameters(rs);  // 设置OUT参数 
  1. 执行call(),传入IN参数,并获取OUT参数 ResultSet:
Map<String, Object> out = call.execute(in);  
ResultSet rs = (ResultSet) out.get("name");  
rs.next();
String name = rs.getString(1);
  1. OUT参数通过ResultSet返回,从out Map中取出。
    一个完整示例:
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("get_user");

SqlParameterSource in = new MapSqlParameterSource()  
    .addValue("id", 1);
call.declareParameters(in);   

SqlReturnResultSet rs = new SqlReturnResultSet("name", Types.VARCHAR);
call.declareParameters(rs);   

Map<String, Object> out = call.execute(in);
ResultSet nameRs = (ResultSet) out.get("name");
nameRs.next();
String name = nameRs.getString(1);
System.out.println(name);  // John

相比直接使用call()方法,SimpleJdbcCall的优点是:

  1. 简化了存储过程调用,隐藏了底层JDBC细节
  2. 支持定义参数(IN、OUT)以及返回值(ResultSet)
  3. 返回Map容易处理多个OUT参数和结果集