JdbcTemplate除了可以通过call()方法调用存储过程外,还提供了SimpleJdbcCall类来更方便地执行存储过程。
使用SimpleJdbcCall调用存储过程的主要步骤如下:
- 创建SimpleJdbcCall对象,指定存储过程名称:
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("get_user");
- 设置IN参数和OUT参数:
SqlParameterSource in = new MapSqlParameterSource()
.addValue("id", 1);
call.declareParameters(in); // 设置IN参数
SqlReturnResultSet rs = new SqlReturnResultSet("name", Types.VARCHAR);
call.declareParameters(rs); // 设置OUT参数
- 执行call(),传入IN参数,并获取OUT参数 ResultSet:
Map<String, Object> out = call.execute(in);
ResultSet rs = (ResultSet) out.get("name");
rs.next();
String name = rs.getString(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的优点是:
- 简化了存储过程调用,隐藏了底层JDBC细节
- 支持定义参数(IN、OUT)以及返回值(ResultSet)
- 返回Map容易处理多个OUT参数和结果集