Spring在JDBC上提供了各种抽象方法来调用数据库存储过程。
我们将继续使用前面的示例来解释不同的方式。
假设我们要调用一个名为“MOVE_TO_HISTORY”的存储过程,该存储过程根据某些业务逻辑将一个人从“PERSON”表移动到“PERSON_HISTORY”表。在我们的示例中,我们在嵌入式模式下使用 HSQL 数据库的过程签名。
PROCEDURE MOVE_TO_HISTORY (IN person_id_in INT, OUT status_out BOOLEAN)
以下是不同的方式(代码位于我们之前的示例的 Jdbc 模板中,因此我们可以访问 jdbc 模板和数据源)
- 使用
JdbcTemplate#call(CallableStatementCreator csc, List<SqlParameter> inOutParams)
public void moveToHistoryTable(Person person) { List<SqlParameter> parameters = Arrays.asList( new SqlParameter(Types.BIGINT), new SqlOutParameter("status_out", Types.BOOLEAN)); Map<String, Object> t = jdbcTemplate.call(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { CallableStatement callableStatement = con.prepareCall("{call MOVE_TO_HISTORY (?, ?)}"); callableStatement.setLong(1, person.getId()); callableStatement.registerOutParameter(2, Types.BOOLEAN); return callableStatement; } }, parameters); }
- 使用
SimpleJdbcCall
(此类大大简化了访问存储过程/函数所需的代码)
public void moveToHistoryTable(Person person){ SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate) .withProcedureName("MOVE_TO_HISTORY") . declareParameters( new SqlParameter("peron_id_in", Types.BIGINT), new SqlOutParameter("status_out", Types.BOOLEAN)); Map<String, Object> execute = call.execute(new MapSqlParameterSource("peron_id_in", person.getId())); }
- 使用
StoredProcedure
。这个类在包org.springframework.jdbc.object
中,它允许我们以更面向对象的方式访问数据库。StoredProcedure
是抽象的,所以我们通常必须扩展它或使用现有的实现。这里我们使用一个子类,GenericStoredProcedure
public void moveToHistoryTable(Person person) { StoredProcedure procedure = new GenericStoredProcedure(); procedure.setDataSource(dataSource); procedure.setSql("MOVE_TO_HISTORY"); procedure.setFunction(false); SqlParameter[] parameters = { new SqlParameter(Types.BIGINT), new SqlOutParameter("status_out", Types.BOOLEAN) }; procedure.setParameters(parameters); procedure.compile(); Map<String, Object> result = procedure.execute(person.getId()); }
示例项目
这个完整的示例项目使用StoredProcedure
类从 Spring 调用存储过程。我上面解释的其他方法被注释掉了,以防万一你想自己尝试一下。
示例项目
使用的依赖关系和技术:
- Spring Context 4.2.3.RELEASE: Spring Context.
- Spring JDBC 4.2.3.RELEASE: Spring JDBC.
- HyperSQL Database 2.3.3: HSQLDB - Lightweight 100% Java SQL Database Engine.
- JDK 1.8
- Maven 3.0.4
下载: