Spring如何使用JdbcTemplate調用存儲過程的三種情況

jopen 10年前發布 | 206K 次閱讀 Spring JEE框架 JDBCTemplate

Spring的SimpleJdbcTemplate將存儲過程的調用進行了良好的封裝,下面列出使用JdbcTemplate調用Oracle存儲過程的三種情況: 

一、無返回值的存儲過程調用 

1、存儲過程代碼:

    create or replace procedure sp_insert_table(param1 in varchar2,param2 in varchar2) as     
       begin    
           insert into table MyTable (id,name) values ('param1 ','param2');    
       end sp_insert_table;    

2、JdbcTemplate調用該存儲過程代碼:
    package com.dragon.test;     
    import org.springframework.jdbc.core.JdbcTemplate;     
    public class JdbcTemplateTest {     
      private JdbcTemplate jdbcTemplate;     
      public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {     
      this.jdbcTemplate = jdbcTemplate;     
      }     
      public void test(){     
         this.jdbcTemplate.execute("call sp_insert_table('100001')");     
      }     
    }     

 

二、有返回值的存儲過程(非結果集)

1、存儲過程代碼:

    create or replace procedure sp_select_table (param1 in varchar2,param2 out varchar2) as     
     begin select into param2 from MyTable where ID = param1 ;   
    end sp_insert_table ;   

2、JdbcTemplate調用該存儲過程代碼:

    public void test() {   
      String param2Value = (String) jdbcTemplate.execute(   
         new CallableStatementCreator() {   
            public CallableStatement createCallableStatement(Connection con) throws SQLException {   
               String storedProc = "{call sp_select_table (?,?)}";// 調用的sql   
               CallableStatement cs = con.prepareCall(storedProc);   
               cs.setString(1, "p1");// 設置輸入參數的值   
               cs.registerOutParameter(2,OracleTypes.Varchar);// 注冊輸出參數的類型   
               return cs;   
            }   
         }, new CallableStatementCallback() {   
             public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {   
               cs.execute();   
               return cs.getString(2);// 獲取輸出參數的值   
         }   
      });   
    }   

三、有返回值的存儲過程(結果集)

1、存儲過程代碼:先創建程序包,因為Oracle存儲過程所有返回值都是通過out參數返回的,列表同樣也不例外,但由于是集合,所以不能用一般的參數,必須要用package:

    create or replace package mypackage as  
        type my_cursor is ref cursor;  
        end mypackage;  
2、存儲過程代碼:可以看到,列表是通過把游標作為一個out參數來返回的。  
    create or replace procedure sp_list_table(param1 in varchar2,param2 out mypackage.my_cursor) is  
        begin  
        open my_cursor for select * from myTable;  
        end sp_list_table;  

3、JdbcTemplate調用該存儲過程代碼:

    public void test() {   
      List resultList = (List) jdbcTemplate.execute(   
         new CallableStatementCreator() {   
            public CallableStatement createCallableStatement(Connection con) throws SQLException {   
               String storedProc = "{call sp_list_table(?,?)}";// 調用的sql   
               CallableStatement cs = con.prepareCall(storedProc);   
               cs.setString(1, "p1");// 設置輸入參數的值   
               cs.registerOutParameter(2, OracleTypes.CURSOR);// 注冊輸出參數的類型   
               return cs;   
            }   
         }, new CallableStatementCallback() {   
            public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {   
               List resultsMap = new ArrayList();   
               cs.execute();   
               ResultSet rs = (ResultSet) cs.getObject(2);// 獲取游標一行的值   
               while (rs.next()) {// 轉換每行的返回值到Map中   
                  Map rowMap = new HashMap();   
                  rowMap.put("id", rs.getString("id"));   
                  rowMap.put("name", rs.getString("name"));   
                  resultsMap.add(rowMap);   
               }   
               rs.close();   
               return resultsMap;   
            }   
      });   
      for (int i = 0; i < resultList.size(); i++) {   
         Map rowMap = (Map) resultList.get(i);   
         String id = rowMap.get("id").toString();   
         String name = rowMap.get("name").toString();   
         System.out.println("id=" + id + ";name=" + name);   
      }   
    }   

作者:佇望碧落 出處:http://blog.csdn.net/cl05300629

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!