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


注:原文 《Spring如何使用JdbcTemplate調用存儲過程的三種情況

 

 

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

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

 

1、存儲過程代碼:

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

 

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

 

  1 package com.dragon.test;
  2 import org.springframework.jdbc.core.JdbcTemplate;
  3 public class JdbcTemplateTest {
  4   private JdbcTemplate jdbcTemplate;
  5   public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  6   this.jdbcTemplate = jdbcTemplate;
  7   }
  8   public void test(){
  9      this.jdbcTemplate.execute("call sp_insert_table('100001')");
 10   }
 11 }

 

 

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

 

1、存儲過程代碼:

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

 

 

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

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

 

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

 

1、存儲過程代碼

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

  1 create or replace package mypackage as
  2     type my_cursor is ref cursor;
  3     end mypackage;

 

存儲過程代碼:可以看到,列表是通過把游標作為一個out參數來返回的。 

  1 create or replace procedure sp_list_table(param1 in varchar2,param2 out mypackage.my_cursor) is
  2     begin
  3     open my_cursor for select * from myTable;
  4     end sp_list_table;

 

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

 

  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 }

 

 

 

 

——————————————————————————————————————————————————————————————————————————————————————


免責聲明!

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



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