Spring 执行存储过程示例

在 Spring 框架中,执行数据库存储过程(Stored Procedure)主要有以下几种常见方式:

  1. JdbcTemplate
  2. NamedParameterJdbcTemplate
  3. SimpleJdbcCall

以下分别展示这三种方式的代码示例。

1. JdbcTemplate 示例

使用 JdbcTemplate 配合 CallableStatement 进行调用:

String procedureCall = "{call proc_name(?, ?)}";
Map<String, Object> inParams = new HashMap<>();
inParams.put("inParam1", 1);

Map<String, Object> outParams = jdbcTemplate.call(con -> {
   CallableStatement callableStatement = con.prepareCall(procedureCall);
   callableStatement.setInt(1, (Integer) inParams.get("inParam1"));
   callableStatement.registerOutParameter(2, Types.INTEGER);
   return callableStatement;
}, outParams);

int result = (int) outParams.get("outParam1");
System.out.println("Result : " + result);

2. NamedParameterJdbcTemplate 示例

使用 NamedParameterJdbcTemplate 支持命名参数的调用:

String procedureCall = "{call proc_name(:inParam1, :outParam1)}";
Map<String, Object> inParams = new HashMap<>();
inParams.put("inParam1", 1);

Map<String, Object> outParams = new HashMap<>();
outParams.put("outParam1", Types.INTEGER);

Map<String, Object> result = namedParameterJdbcTemplate.call(procedureCall, inParams, outParams);
System.out.println("Result : " + result.get("outParam1"));

3. SimpleJdbcCall 示例

使用 SimpleJdbcCall 进行更简洁的声明式调用(推荐):

SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("proc_name");

SqlParameterSource in = new MapSqlParameterSource().addValue("inParam1", 1);
Map<String, Object> out = simpleJdbcCall.execute(in);

int result = (int) out.get("outParam1");
System.out.println("Result : " + result);

说明

  • 适用版本:上述示例基于 Spring JDBC 模块。
  • 技术建议:在标准 Spring Framework 中,SimpleJdbcCall 是官方推荐用于执行存储过程的方式,它提供了更好的元数据读取和参数映射能力。
  • API 注意JdbcTemplateNamedParameterJdbcTemplate 的原生 API 并不直接支持示例中展示的 call 方法签名(通常需配合 ConnectionCallback 或自定义扩展实现)。若在生产环境中使用,请确认项目是否引入了特定的封装工具类,或优先采用 SimpleJdbcCall 以确保兼容性与稳定性。