JdbcTemplate調儲存過程

XIAJSDJW發表於2018-07-24

使用spring JdbcTemplate均不用手動關閉連線

//JdbcTemplate  執行儲存過程,不含事物。

ComboPooledDataSource ds = (ComboPooledDataSource )res.get("ds"); //連線池獲取
       JdbcTemplate jt = new JdbcTemplate(ds);
        String param2Value = jt.execute(
                 new CallableStatementCreator() {
                    public CallableStatement createCallableStatement(Connection connection) throws SQLException {
                       String storedProc = "{call  RL.TESTPROC(?,?,?)}";// 呼叫的sql 
                       CallableStatement cs = connection.prepareCall(storedProc);
                       //cs.setString(1, "p1");// 設定輸入引數的值
                       cs.registerOutParameter(1, Types.INTEGER);
                       cs.registerOutParameter(2, Types.VARCHAR);// 註冊輸出引數的型別
                       cs.registerOutParameter(3, Types.VARCHAR);
                       return cs;
                    }
                 }, new CallableStatementCallback<String>() {
                     public String doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
                       cs.execute();
                       
                       String t1 = cs.getString(1);
                       String t2 = cs.getString(2);
                       String t3 = cs.getString(3);
                       return cs.getString(2);// 獲取輸出引數的值 
                 }
              });


        
        //JdbcTemplate 執行儲存過程包含事物,回滾

ComboPooledDataSource ds = (ComboPooledDataSource )res.get("ds"); //連線池獲取
        TransactionDefinition def = new DefaultTransactionDefinition(); 
        DataSourceTransactionManager transactionManager=new DataSourceTransactionManager(ds);
        TransactionStatus status = transactionManager.getTransaction(def); 
        JdbcTemplate jt = new JdbcTemplate(ds);
        try {
            String updstr=" INSERT INTO RL.FHDK_PARM_USR "
                    + " VALUES( 'TTTTS',9 ) ";
            jt.update(updstr);
            
            int param2Value = jt.execute(
                     new CallableStatementCreator() {
                        public CallableStatement createCallableStatement(Connection connection) throws SQLException {
                           String storedProc = "{call  RL.TESTPROC(?,?,?)}";// 呼叫的sql 
                           CallableStatement cs = connection.prepareCall(storedProc);
                           //cs.setString(1, "p1");// 設定輸入引數的值
                           cs.registerOutParameter(1, Types.INTEGER);
                           cs.registerOutParameter(2, Types.VARCHAR);// 註冊輸出引數的型別
                           cs.registerOutParameter(3, Types.VARCHAR);
                           return cs;
                        }
                     }, new CallableStatementCallback<Integer>() {
                         public Integer doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
                           cs.execute();
                           
                           int t1 = cs.getInt(1);
                           String t2 = cs.getString(2);
                           String t3 = cs.getString(3);
                           return t1;// 獲取輸出引數的值 
                     }
                  });
            
            if(param2Value==-1){
                throw new Exception("執行過程失敗!");
            }
            transactionManager.commit(status);
        }catch(Exception e){
             transactionManager.rollback(status);
             System.out.println(e.getMessage());
        }
        

相關文章