Spring JdbcTemplate 調用存儲過程


 遇到調用存儲過程的業務,以前有用過,但不是用Spring的 JdbcTemplate去做的,這次是在一個已經有的SpringMVC框架的項目下寫處理存儲過程的。

參考網絡中的方法,在實際操作中遇到兩個問題:

1 存儲過程的參數問題 ,原本以為只要傳對應的入參就可以,即每個入參占用一個?,在報錯后檢查發現,出參也要占用一個?;

2連接數據庫,這個是開始沒有注意,但很快就發現了。

完成這個存儲過程調用的代碼

  int  param2Value = (Integer ) jdbcTemplate.execute(new CallableStatementCreator()
        {
            public CallableStatement createCallableStatement(Connection con) throws SQLException
            {
                String storedProc = sql;// 調用的sql   
                CallableStatement cs = con.prepareCall(storedProc);
                cs.setString(1, obj[0] + "");
                cs.setInt(2, Integer.parseInt(obj[1] + ""));
                cs.setString(3, obj[2] + "");
                cs.setString(4, obj[3] + "");
                cs.setString(5, obj[4] + "");
                cs.setInt(6, Integer.parseInt(obj[5] + ""));
                cs.setLong(7, Long.parseLong(obj[6] + "") );
                // 注冊輸出參數的類型      
                cs.registerOutParameter(8, OracleTypes.NUMBER);
                return cs;
            }
        }, new CallableStatementCallback()
        {
            public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException
            {
                cs.execute();
                return cs.getInt(8);// 獲取輸出參數的值   
            }
        });
      return param2Value;
      }
      catch (Exception e)
      {
          e.printStackTrace();
          return -1;
      }

trycatch 非必須的。

其中 jdbcTemplate要設置其獲取oracle數據庫的連接,也就是讀取配置。

private JdbcTemplate jdbcTemplate;
 
    /**
     * 設置數據源
     * @param  dataSource       數據源對象
     * @return void             無返回對象
     * @author 鄒建松 2014-07-14
     */
    @Resource(name="baseDataSource")
    public void setJdbcTemplate(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

baseDataSource 是配置文件xml里的

 

以上是有返回參數,即是有出參數的。

沒有出參的如下

    public void test(){   
        try
        {
            this.jdbcTemplate.execute("call p_create_student_test('123')");    
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
            
          }

 

還有一種情況就是有結果集的,這種我還沒有用過,參考網絡的

  1. public void test() {   
  2.   List resultList = (List) jdbcTemplate.execute(   
  3.      new CallableStatementCreator() {   
  4.         public CallableStatement createCallableStatement(Connection con) throws SQLException {   
  5.            String storedProc = "{call sp_list_table(?,?)}";// 調用的sql   
  6.            CallableStatement cs = con.prepareCall(storedProc);   
  7.            cs.setString(1, "p1");// 設置輸入參數的值   
  8.            cs.registerOutParameter(2, OracleTypes.CURSOR);// 注冊輸出參數的類型   
  9.            return cs;   
  10.         }   
  11.      }, new CallableStatementCallback() {   
  12.         public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {   
  13.            List resultsMap = new ArrayList();   
  14.            cs.execute();   
  15.            ResultSet rs = (ResultSet) cs.getObject(2);// 獲取游標一行的值   
  16.            while (rs.next()) {// 轉換每行的返回值到Map中   
  17.               Map rowMap = new HashMap();   
  18.               rowMap.put("id", rs.getString("id"));   
  19.               rowMap.put("name", rs.getString("name"));   
  20.               resultsMap.add(rowMap);   
  21.            }   
  22.            rs.close();   
  23.            return resultsMap;   
  24.         }   
  25.   });   
  26.   for (int i = 0; i resultList.size(); i++) {   
  27.      Map rowMap = (Map) resultList.get(i);   
  28.      String id = rowMap.get("id").toString();   
  29.      String name = rowMap.get("name").toString();   
  30.      System.out.println("id=" + id + ";name=" + name);   
  31.   }   
  32. }  

還有就是用別的方法調用存儲過程,如

public void updateStudentIncludeType(User bean) {
        Connection con = getConnection();
        CallableStatement csmt = null;
        Student student = (Student) bean.getDetails();
        try {
            /*
             * v_student_id in number,--學生ID v_student_name in varchar,--學生姓名
             * v_sex in number,--性別 v_student_no in number,--學號 v_duty in
             * varchar,--職務 v_phonenumber in varchar,--聯系電話 v_school_org_id in
             * number,--組織ID v_school_org in number,--組織 v_card_id in
             * varchar,--考勤卡號
             */
            csmt = con.prepareCall("{CALL P_MODIFY_STUDENT_AND_TYPE(?,?,?,?,?,?,?,?,?,?,?)}");
            csmt.setLong(1, student.getUserId());
            csmt.setString(2, student.getStudentName());
            csmt.setLong(3, student.getSex());
            csmt.setString(4, student.getStudentNo());
            csmt.setString(5, student.getDuty());
            csmt.setString(6, student.getLinkDn());
            csmt.setLong(7, student.getOrgId());
            csmt.setLong(8, Long.parseLong(student.getSchool_id()));
            csmt.setString(9, student.getCard());
            csmt.setInt(10, student.getStudentType());
            csmt.registerOutParameter(11, Types.INTEGER);
            csmt.executeUpdate();
            if (csmt.getInt(11) == 1) {
                throw new DaoException("修改學生信息失敗!");
            }
            if (csmt.getInt(11) == 2) {
                throw new DaoException("考勤卡號重復,請重輸!");
            }
            if (csmt.getInt(11) == 3) {
                throw new DaoException("學生學號重復,請重輸!");
            }
        } catch (SQLException e) {
            throw new DaoException("系統維護中,請稍后再試!", e);
        } finally {
            JdbcUtils.closeStatement(csmt);
            closeConnectionIfNecessary(con);
        }
        
    }

用到jar包

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM