小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

oracle存儲(chǔ)過(guò)程備忘以及在Hibernate中使用存儲(chǔ)過(guò)程

 Ethan的博客 2011-11-07

oracle存儲(chǔ)過(guò)程備忘以及在Hibernate中使用存儲(chǔ)過(guò)程

   Oracle存儲(chǔ)過(guò)程主要用來(lái)處理復(fù)雜業(yè)務(wù)邏輯,把應(yīng)用系統(tǒng)中的這些邏輯(代碼,如java形式)放到數(shù)據(jù)庫(kù)(pl/sql形式)中執(zhí)行??梢酝ㄟ^(guò)存儲(chǔ)過(guò)程來(lái)執(zhí)行批量更新。存儲(chǔ)過(guò)程直接在數(shù)據(jù)庫(kù)中運(yùn)行,執(zhí)行效率更高。
    在Oracle數(shù)據(jù)庫(kù)中可以定義一個(gè)名為batchUpdateStudent()的存儲(chǔ)過(guò)程,代碼如下:
Java代碼 復(fù)制代碼 收藏代碼
  1. create or replace procedure batchUpdateStudent(p_age in number) as   
  2. begin   
  3. update STUDENT set AGE=AGE+1 where AGE>p_age;   
  4. end;  

   以上存儲(chǔ)過(guò)程有一個(gè)參數(shù)p_age,代表學(xué)生的年齡,應(yīng)用程序可按照以下方式調(diào)用存儲(chǔ)過(guò)程:
Java代碼 復(fù)制代碼 收藏代碼
  1. //hibernater 不支持直接更新或刪除的存儲(chǔ)過(guò)程,可以繞過(guò)Hibernate,   
  2. //而在Hibernate中直接使用JDBC   
  3.   
  4. tx = session.beginTransaction();   
  5. Connection con=session.connection();   
  6.   
  7. String procedure = "{call batchUpdateStudent(?) }";   
  8. CallableStatement cstmt = con.prepareCall(procedure);   
  9. cstmt.setInt(1,0); //把年齡參數(shù)設(shè)為0   
  10. cstmt.executeUpdate();   
  11. tx.commit();  


  使用存儲(chǔ)過(guò)程來(lái)查詢(xún)  
   Hibernate3引入了對(duì)存儲(chǔ)過(guò)程查詢(xún)的支持。存儲(chǔ)過(guò)程必須返回一個(gè)結(jié)果集,作為Hibernate能夠使用的第一個(gè)外部參數(shù)。下面是一個(gè)Oracle9i和更高版本的存儲(chǔ)過(guò)程例子。
   
Java代碼 復(fù)制代碼 收藏代碼
  1. Create or REPLACE FUNCTION selectAllEmployments        
  2. RETURN    SYS_REFCURSOR        
  3.    AS        
  4.       st_cursor    SYS_REFCURSOR;        
  5.    BEGIN        
  6.      OPEN st_cursor FOR        
  7.      Select EMPLOYEE,EMPLOYER,        
  8.      STARTDATE, ENDDATE,        
  9.      REGIONCODE, EID, VALUE, CURRENCY        
  10.      FROM EMPLOYMENT;        
  11.      RETURN st_cursor;        
  12. END;     

   在Hibernate里要要使用這個(gè)查詢(xún),你需要通過(guò)命名查詢(xún)來(lái)映射它.
  
Java代碼 復(fù)制代碼 收藏代碼
  1. <sql-query    name="selectAllEmployees_SP"    callable="true">      
  2.            <return    alias="emp"    class="Employment">      
  3.                    <return-property    name="employee"    column="EMPLOYEE"/>      
  4.                    <return-property    name="employer"    column="EMPLOYER"/>                              
  5.                    <return-property    name="startDate"    column="STARTDATE"/>      
  6.                    <return-property    name="endDate"    column="ENDDATE"/>                              
  7.                    <return-property    name="regionCode"    column="REGIONCODE"/>                              
  8.                    <return-property    name="id"    column="EID"/>                                                      
  9.                    <return-property    name="salary">        
  10.                            <return-column    name="VALUE"/>      
  11.                            <return-column    name="CURRENCY"/>                              
  12.                    </return-property>      
  13.            </return>      
  14.            {    ?    =    call    selectAllEmployments()    }      
  15.    </sql-query>     


   注意存儲(chǔ)過(guò)程當(dāng)前僅僅返回標(biāo)量和實(shí)體.現(xiàn)在不支持<return-join>和<load-collection> 
Java代碼 復(fù)制代碼 收藏代碼
  1. <hibernate-mapping package="com.unmi.vo"> <class name="Test" table="TEST"/>          
  2.   
  3. <sql-query callable="true" >    
  4.   
  5. <return alias="aa" > <return-property name="oborqt" column="OBORQT"/>   
  6.   
  7. <return-property column="MOORQT"/> <return-property name="roschn" column="ROSCHN"/>   
  8.   
  9. <return-property column="PLANDATE"/>    
  10.   
  11. <return> { ? = call selectAllUsers() } </sql-query>    
  12.   
  13. </hibernate-mapping>  


   { ? = call selectAllUsers() } 也可以寫(xiě)成{ call selectAllUsers() }, 如果有參數(shù)就寫(xiě)成 { ? = call selectAllUsers(?,?,?) } 代碼中對(duì)query設(shè)置相應(yīng)位置上的值就OK Java調(diào)用關(guān)鍵代碼如下
Java代碼 復(fù)制代碼 收藏代碼
  1. Session session = HibernateUtil.currentSession();   
  2.   
  3. Query query = session.getNamedQuery("selectAllUsers");    
  4.   
  5. List list = query.list();   
  6.   
  7. System.out.println(list);  

   要求你的存儲(chǔ)過(guò)程必須能返回記錄集,否則要出錯(cuò) 如果你的存儲(chǔ)過(guò)程是完成非查詢(xún)?nèi)蝿?wù)就應(yīng)該在配置文件用以下三個(gè)標(biāo)簽
Java代碼 復(fù)制代碼 收藏代碼
  1. <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>   
  2.   
  3. <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>    
  4.   
  5. <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>  




  簡(jiǎn)單的Hibernate調(diào)用oracle存儲(chǔ)過(guò)程方式:
Java代碼 復(fù)制代碼 收藏代碼
  1. this.pnumberManager.getHibernateTemplate().execute(   
  2.                 new HibernateCallback() ...{   
  3.                     public Object doInHibernate(Session session)   
  4.                             throws HibernateException, SQLException ...{   
  5.                         CallableStatement cs = session   
  6.                                 .connection()   
  7.                                 .prepareCall("{call modifyapppnumber_remain(?)}");   
  8.                         cs.setString(1, foundationid);   
  9.                         cs.execute();   
  10.                         return null;   
  11.                     }   
  12.                 });  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多