程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle存儲過程入門,oracle存儲過程

oracle存儲過程入門,oracle存儲過程

編輯:Oracle教程

oracle存儲過程入門,oracle存儲過程


http://www.360doc.com/content/14/0728/16/7662927_397682668.shtml


如何使用Mybaits調用數據庫中的存儲過程,下面以Oracle數據庫的為例:

 1.在數據庫中創建以下的存儲過程:

 

java代碼:
 
  1. create or replace procedure pro_hello(p_user_name in varchar2,p_result out varchar2) is  
  2. begin  
  3.   p_result := 'hello,' || p_user_name;  
  4. end;  


 

2.編寫SQL映射文件mapper.xml:

 

java代碼:
 
  1. <select id="proHello" statementType="CALLABLE">  
  2. <![CDATA[  
  3.     {call pro_hello (#{p_user_name,mode=IN,jdbcType=VARCHAR},#{result,mode=OUT,jdbcType=VARCHAR})}  
  4. ]]>  
  5. </select>  


 

3.編寫JAVA代碼調用存儲過程

 

java代碼:
 
  1. public class ProcedureTest {  
  2.           
  3.          public static void main(String[] args) throws IOException {  
  4.             String resource = "mybatis.cfg.xml";  
  5.             Reader reader = Resources.getResourceAsReader(resource);  
  6.             SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);  
  7.          
  8.             SqlSession session = ssf.openSession();  
  9.          
  10.            try {  
  11.                  Map<String, String> param = new HashMap<String, String>();  
  12.                  param.put("p_user_name", "zhangsan");  
  13.                  String returnValue = (String) session.selectOne("User.proHello", param);  
  14.                  System.out.println("message=" + param.get("p_user_name"));  
  15.                  System.out.println("result=" + param.get("result"));  
  16.                  System.out.println("returnValue=" + returnValue);  
  17.    
  18.            } catch (Exception e) {  
  19.                 e.printStackTrace();  
  20.            } finally {  
  21.               session.close();  
  22.           }  
  23.        }  
  24. }  


 

4.執行Java代碼,控制台輸出結果如下:

 

java代碼:
 
  1. 2012-03-07 20:36:32,406 DEBUG [java.sql.PreparedStatement] -==>  Executing: {call pro_hello(?,?)}  
  2. 2012-03-07 20:36:32,406 DEBUG [java.sql.PreparedStatement] -==> Parameters: zhangsan(String)  
  3. message=zhangsan  
  4. (mybatis 調用存儲過程另一種實現)Mybatis默認查詢存儲過程的返回值是使用參數傳來傳去的,從參數裡獲取返回值總讓我感覺怪怪的,特別是在使用接口做Dao的時候,破壞了Dao接口方法的統一性。
  5. 然後就有了mybatis-callable,獲得方式如下:

    ? 1 2 3 4 5 6 7 8 9 <dependencies>   ...     <dependency>         <groupId>com.github.miemiedev</groupId>         <artifactId>mybatis-callable</artifactId>         <version>1.0</version>     </dependency>  ... </dependencies>

     

     

    配置是這樣的:

    ? 1 2 3 4 5 6 7 8 9 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration         PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"         "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration>     <plugins>         <plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor">        </plugin>     </plugins> </configuration>

     

    創建一個查詢,需要注意的是只有statementType為CALLABLE時攔截器才會起作用:

    ? 1 2 3 4 5 6 7 8 9 <select id="query2" statementType="CALLABLE">     <![CDATA[         {call test_proc2(             #{acResult,mode=OUT,jdbcType=CURSOR,javaType=ResultSet, resultMap=hashMap},             #{userType},             #{branchCode}         )}     ]]> </select>

     

    然後Dao或許是這樣的,接口也是一樣的:

    ? 1 2 3 4 5 6 7 public List<Map<String, Object>> query2(String userType, String branchCode){     Map<String, Object> params = new HashMap<String, Object>();     params.put("userType",userType);     params.put("branchCode",branchCode);     //存儲過程只返回一個游標,則使用selectList返回List     return getSqlSession().selectList("db.table.user.query2", params); }

     

    ===========================================

    返回單個參數但是不是游標的話就這樣

    ? 1 2 3 4 5 6 7 8 9 <select id="query3" statementType="CALLABLE">     <![CDATA[         {call test_proc3(             #{retCode,mode=OUT,jdbcType=INTEGER},             #{userType},             #{branchCode}         )}     ]]> </select>

     

    ? 1 2 3 4 5 6 7 public Integer query3(String userType, String branchCode){     Map<String, Object> params = new HashMap<String, Object>();     params.put("userType",userType);     params.put("branchCode",branchCode);     //存儲過程只有一個返回值,並且不是游標,則使用selectOne     return getSqlSession().selectOne("db.table.user.query3", params); }

     

    ===========================================

    返回多個參數,裡面啥都有:

    ? 1 2 3 4 5 6 7 8 9 10 <select id="query" statementType="CALLABLE">     <![CDATA[         {call test_proc(             #{retCode,mode=OUT,jdbcType=INTEGER},                             #{acResult,mode=OUT,jdbcType=CURSOR,javaType=ResultSet, resultMap=hashMap},             #{userType},             #{branchCode}         )}     ]]> </select>

     

    ? 1 2 3 4 5 6 7 public Map<String, Object> query(String userType, String branchCode){     Map<String, Object> params = new HashMap<String, Object>();     params.put("userType",userType);     params.put("branchCode",branchCode);     //存儲過程只有一個返回值,並且不是游標,則使用selectOne     return getSqlSession().selectOne("db.table.user.query", params); }

     

    Map中包含所有存儲過程輸出的結果,Key是存儲過程的參數名,按需來取就行了。

    =============================================

    上面看上去規則有點麻煩,其實用接口做的話就不用考慮是selectList還是selectOne了,直接接收返回值就可以。

    =============================================

    自己定義結果集的話參考一下SimpleResultHandler的實現就行了,反正把自己實現的按照下面這麼配就行了。不配resultHandler的話默認就是SimpleResultHandler了。

    ? 1 2 3 <plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor">     <property name="resultHandler" value="com.github.miemiedev.mybatis.callable.handler.SimpleResultHandler"/> </plugin>

     

     

    完。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved