Spring JDBC StoredProcedure类调用数据库存储过程

Spring在JDBC上提供了各种抽象方法来调用数据库存储过程。

我们将继续使用前面的示例来解释不同的方式。

假设我们要调用一个名为“MOVE_TO_HISTORY”的存储过程,该存储过程根据某些业务逻辑将一个人从“PERSON”表移动到“PERSON_HISTORY”表。在我们的示例中,我们在嵌入式模式下使用 HSQL 数据库的过程签名。

PROCEDURE MOVE_TO_HISTORY (IN person_id_in INT, OUT status_out BOOLEAN)

以下是不同的方式(代码位于我们之前的示例的 Jdbc 模板中,因此我们可以访问 jdbc 模板和数据源)

  1. 使用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);
    }
  2. 使用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()));
    }
  3. 使用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

下载:

https://www.logicbig.com/tutorials/spring-framework/spring-data-access-with-jdbc/spring-call-stored-procedure/stored-procedure-call-example.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值