久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Hibernate3.x調(diào)用存儲過程(轉(zhuǎn))

 毀滅號 2010-10-12
原文出處:http://tech.it168.com/j/d/2007-05-14/200705141007843.shtml

摘要:本文以詳盡的實例展示了hibernate3.x中調(diào)用存儲過程各步驟,從建立測試表,、存儲過程的建立,、工程的建立以及類的編寫和測試一步一步引導用戶學習hibernate3.x中調(diào)用存儲過程的方法.

如果底層數(shù)據(jù)庫(eg. Oracle,、mysql,、sqlserver)等支持存儲過程,,可通過存儲過程執(zhí)行批量刪除,、更新等操作,。本文以實例說明在hibernate3.x中如何調(diào)用存儲過程。

  說明:本例hibernate所用版本為3.0,,mysql所用版本為5.0,,所用數(shù)據(jù)庫驅(qū)動為mysql-connector-java-5.0.4-bin.jar,。

一.             建表與初始化數(shù)據(jù)

在mysql的test數(shù)據(jù)庫中建立一張新表:tbl_user,建表語句如下:
Sql代碼 復制代碼
  1.  DROP TABLE IF EXISTS `user`;   
  2.   
  3. CREATE TABLE `tbl_user` (   
  4.   
  5.   `userid` varchar(50) NOT NULL,   
  6.   
  7.   `namevarchar(50) default '',   
  8.   
  9.   `blog` varchar(50) default '',   
  10.   
  11.   PRIMARY KEY (`userid`)   
  12.   
  13. ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;  



建表成功后,,在該表中插入如下4條初始數(shù)據(jù),對應的sql語句如下:

Sql代碼 復制代碼
  1. INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('ant''螞蟻''http://www./qixiangnj');   
  2.   
  3. INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('beansoft''bean''http://www./beansoft');   
  4.   
  5. INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('sterning''似水流年''http://www./sterning');   
  6.   
  7. INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('tom''tom' , 'http://www./tom');  



二.             建立存儲過程

為測試hibernate3.x中存儲過程的調(diào)用,,我們在user表中建立getUserList,、createUser、updateUser和deleteUser這四個存儲過程,,在mysql中建立存儲過程的語句如下:

1. 獲得用戶信息列表的存儲過程--getUserList

Sql代碼 復制代碼
  1. DROP PROCEDURE IF EXISTS `getUserList`;   
  2.   
  3. CREATE PROCEDURE `getUserList`()   
  4.   
  5. begin  
  6.   
  7.      select * from tbl_user;   
  8.   
  9. end;  



2. 通過傳入的參數(shù)創(chuàng)建用戶的存儲過程--createUser

Sql代碼 復制代碼
  1. DROP PROCEDURE IF EXISTS `createUser`;   
  2.   
  3. CREATE PROCEDURE `createUser`(IN userid varchar(50), IN name varchar(50), IN blog varchar(50))   
  4.   
  5. begin  
  6.   
  7.     insert into tbl_user values(userid, name, blog);   
  8.   
  9. end;  




3. 通過傳入的參數(shù)更新用戶信息的存儲過程--updateUser

Sql代碼 復制代碼
  1. DROP PROCEDURE IF EXISTS `updateUser`;   
  2.   
  3. CREATE PROCEDURE `updateUser`(IN nameValue varchar(50), IN blogValue varchar(50), IN useidValue varchar(50))   
  4.   
  5. begin  
  6.   
  7.     update tbl_user set name = nameValue, blog = blogValue where userid = useridValue;   
  8.   
  9. end;  




4. 刪除用戶信息的存儲過程--deleteUser

Sql代碼 復制代碼
  1. DROP PROCEDURE IF EXISTS `deleteUser`;   
  2.   
  3. CREATE PROCEDURE `deleteUser`(IN useridValue int(11))   
  4.   
  5. begin  
  6.   
  7.     delete from tbl_user where userid = useridValue;   
  8.   
  9. end;  


三.             編程前準備工作

1.    建立工程

在進入代碼編寫前,,建立新的java工程proc, 目錄結(jié)構(gòu)如下:

proc

   -lib

    -bin

    -src

      -com

        -amigo

          -proc

            -model

2.    引入所需包

   將hibernate3.0的包以及其相關包放入編譯路徑中,,另注意:還需將mysql的數(shù)據(jù)庫驅(qū)動jar包mysql-connector-java-5.0.4-bin.jar放入編譯路徑中,。



四.             編碼與測試

在準備工作完成后,進入編碼與測試階段,,本例演示了在hibernate3.0中調(diào)用mysql的存儲過程的方法,。

1、hibernate的配置文件

在hibernate的配置文件中包含數(shù)據(jù)庫的連接信息,,以及加入OR mapping的xml格式的映射文件,,該文件如下(部分內(nèi)容略):
……
Xml代碼 復制代碼
  1. <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  
  2.   
  3. <property name="connection.username">root</property>  
  4.   
  5. <property name="connection.password">root</property>  
  6.   
  7. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  8.   
  9. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  10.   
  11. <property name="show_sql">true</property>  
  12.   
  13. <mapping resource="com/amigo/proc/model/User.hbm.xml"/>   

    ……

2、OR Mapping文件

產(chǎn)生的OR Mapping文件有User.java以及其對應的hibernate映射文件User.hbm.xml,。其中User.java的內(nèi)容如下:
Java代碼 復制代碼
  1. package com.amigo.proc.model;   
  2.   
  3.     
  4.   
  5. /** *//**  
  6.  
  7.  * 用戶信息對象  
  8.  
  9.  */  
  10.   
  11. public class User implements java.io.Serializable {   
  12.   
  13.     private static final long serialVersionUID = 1L;   
  14.   
  15.     /** *//** 用戶id*/  
  16.   
  17.     private String userid;   
  18.   
  19.     /** *//** 用戶姓名*/  
  20.   
  21.     private String name;   
  22.   
  23.     /** *//** 用戶blog*/  
  24.   
  25.     private String blog;   
  26.   
  27. //省略get/set方法   
  28.   
  29. }  


User.hbm.xml文件的內(nèi)容如下:
Xml代碼 復制代碼
  1. <?xml version="1.0"?>  
  2.   
  3. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  4.   
  5. "http://hibernate./hibernate-mapping-3.0.dtd">  
  6.   
  7.     
  8.   
  9. <hibernate-mapping package="com.amigo.proc.model">  
  10.   
  11.     <class name="User" table="tbl_user">  
  12.   
  13.         <id name="userid" column="userid">  
  14.   
  15.             <generator class="assigned"/>  
  16.   
  17.         </id>  
  18.   
  19.         <property name="name" column="name" type="string" />  
  20.   
  21.         <property name="blog" column="blog" type="string" />  
  22.   
  23.     </class>  
  24.   
  25.        
  26.   
  27.     <sql-query name="getUserList" callable="true">  
  28.   
  29.         <return alias="user" class="User">  
  30.   
  31.             <return-property name="userid" column="userid"/>  
  32.   
  33.             <return-property name="name" column="name"/>  
  34.   
  35.             <return-property name="blog" column="blog" />  
  36.   
  37.         </return>  
  38.   
  39.         {call getUserList()}   
  40.   
  41.     </sql-query>  
  42.   
  43. </hibernate-mapping>  


在該文件中需注意<sql-query…></sql-query>中的這段代碼,,調(diào)用的存儲過程在其中定義,并定義了調(diào)用存儲過程后將記錄組裝成User對象,,同時對記錄的字段與對象的屬性進行相關映射,。

3.    管理hibernate的session以及事務的類HibernateSessionFactory

該類包括打開session等方法,主要用于管理hibernate的session和事務,。該類的內(nèi)容如下(部分內(nèi)容略):


Java代碼 復制代碼
  1. package com.amigo.proc;   
  2.   
  3. import java.io.ByteArrayOutputStream;   
  4.   
  5. import java.io.OutputStreamWriter;   
  6.   
  7.     
  8.   
  9. import org.hibernate.HibernateException;   
  10.   
  11. import org.hibernate.Session;   
  12.   
  13. import org.hibernate.SessionFactory;   
  14.   
  15. import org.hibernate.Transaction;   
  16.   
  17. import org.hibernate.cfg.Configuration;   
  18.   
  19. /** *//**  
  20.  
  21.  * Hibernate相關控制  
  22.  
  23.  */  
  24.   
  25. public class HibernateSessionFactory {   
  26.   
  27.     /** *//** Hibernate配置文件 */  
  28.   
  29.     private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";   
  30.   
  31.     
  32.   
  33.     /** *//** 存儲一個單獨的session實例 */  
  34.   
  35.     private static final ThreadLocal threadLocal = new ThreadLocal();   
  36.   
  37.     
  38.   
  39.     /** *//** Hibernate配置相關的一個實例 */  
  40.   
  41.     private static Configuration configuration = null;   
  42.   
  43.     
  44.   
  45.     /** *//** Hibernate SessionFactory的一個實例 */  
  46.   
  47.     private static SessionFactory sessionFactory;   
  48.   
  49.     
  50.   
  51.     /** *//** Hibernate的字符編碼集*/  
  52.   
  53.     private static String charSet;   
  54.   
  55.     /** *//** 若Hibernate未設置字符編碼集時,,采用的字符編碼集*/  
  56.   
  57.     private static final String encoding = (new OutputStreamWriter(   
  58.   
  59.             new ByteArrayOutputStream())).getEncoding();   
  60.   
  61.     
  62.   
  63.     /** *//**  
  64.  
  65.      * 默認構(gòu)造函數(shù)  
  66.  
  67.      */  
  68.   
  69.     public HibernateSessionFactory() {   
  70.   
  71.     }   
  72.   
  73.     
  74.   
  75.     /** *//**  
  76.  
  77.      * 打開Hibernate的數(shù)據(jù)庫連接  
  78.  
  79.      */  
  80.   
  81.     public static final synchronized void open() {   
  82.   
  83.         if (sessionFactory != null)   
  84.   
  85.             return;   
  86.   
  87.         try {   
  88.   
  89.             sessionFactory = getConfiguration().buildSessionFactory();   
  90.   
  91.             charSet = configuration.getProperty("hibernate.connection.charSet");   
  92.   
  93.             if (charSet == null)   
  94.   
  95.                 charSet = encoding;   
  96.   
  97.             return;   
  98.   
  99.         } catch (Throwable throwable) {   
  100.   
  101.             throw new ExceptionInInitializerError(throwable);   
  102.   
  103.         }   
  104.   
  105.     }   
  106.   
  107.     
  108.   
  109.     /** *//**  
  110.  
  111.      * 配置Hibernate數(shù)據(jù)庫,并將其打開  
  112.  
  113.      */  
  114.   
  115.     private static synchronized void configure() throws HibernateException {   
  116.   
  117.         if (sessionFactory == null) {   
  118.   
  119.             if (configuration == null) {   
  120.   
  121.                 getConfiguration().configure(CONFIG_FILE_LOCATION);   
  122.   
  123.             }   
  124.   
  125.             open();   
  126.   
  127.         }   
  128.   
  129.     }   
  130.   
  131.     
  132.   
  133.     /** *//**  
  134.  
  135.      * 獲得配置實例  
  136.  
  137.      */  
  138.   
  139.     public static synchronized final Configuration getConfiguration() {   
  140.   
  141.         if (configuration == null) {   
  142.   
  143.             configuration = new Configuration();   
  144.   
  145.         }   
  146.   
  147.         return configuration;   
  148.   
  149.     }   
  150.   
  151.     
  152.   
  153.     /** *//**  
  154.  
  155.      * 功能說明:獲得SessionFactory  
  156.  
  157.      */  
  158.   
  159.     public static final SessionFactory getSessionFactory() {   
  160.   
  161.         return sessionFactory;   
  162.   
  163.     }   
  164.   
  165.     
  166.   
  167.     /** *//**  
  168.  
  169.      * 功能說明:獲得session  
  170.  
  171.      */  
  172.   
  173.     public static final Session getSession() throws HibernateException {   
  174.   
  175.         configure();   
  176.   
  177.         Session session = null;   
  178.   
  179.         if (threadLocal.get() == null) {   
  180.   
  181.             session = getSessionFactory().openSession();   
  182.   
  183.             threadLocal.set(session);   
  184.   
  185.         } else {   
  186.   
  187.             try {   
  188.   
  189.                 session = (Session)threadLocal.get();   
  190.   
  191.             } catch(Exception ex) {   
  192.   
  193.                 session = getSessionFactory().openSession();   
  194.   
  195.                 threadLocal.set(session);   
  196.   
  197.             }   
  198.   
  199.         }   
  200.   
  201.         return session;   
  202.   
  203.     }   
  204.   
  205.     //其余方法略   
  206.   
  207. }  

4. hibernate調(diào)用存儲過程的測試類

本類是該例的核心類,,在本類中,,以實例清楚地說明了在hibernate中如何調(diào)用存儲過程,例示了hibernate調(diào)用查詢,、更新,、插入和刪除這四類存儲過程的方法,該類的內(nèi)容如下:

Java代碼 復制代碼
  1. package com.amigo.proc;   
  2.   
  3.     
  4.   
  5. import java.sql.CallableStatement;   
  6.   
  7. import java.sql.Connection;   
  8.   
  9. import java.sql.PreparedStatement;   
  10.   
  11. import java.util.List;   
  12.   
  13.     
  14.   
  15. import com.amigo.proc.model.User;   
  16.   
  17.     
  18.   
  19. import org.hibernate.Session;   
  20.   
  21. import org.hibernate.Transaction;   
  22.   
  23.     
  24.   
  25. /** *//**  
  26.  
  27.  * hibernate調(diào)用存儲過程  
  28.  
  29.  * @author Amigo Xie([email protected])  
  30.  
  31.  * @since 2007/04/30  
  32.  
  33.  */  
  34.   
  35. public class ProcTest {   
  36.   
  37.     
  38.   
  39.     /** *//**  
  40.  
  41.      * @param args  
  42.  
  43.      */  
  44.   
  45.     public static void main(String[] args) throws Exception {   
  46.   
  47.         ProcTest proc = new ProcTest();   
  48.   
  49.         Session session = HibernateSessionFactory.getSession();   
  50.   
  51.         proc.testProcQuery(session);   
  52.   
  53.         proc.testProcUpdate(session);   
  54.   
  55.         System.out.println("update successfully");   
  56.   
  57.            
  58.   
  59.         proc.testProcInsert(session);   
  60.   
  61.         System.out.println("insert successfully");   
  62.   
  63.            
  64.   
  65.         proc.testProcDelete(session);   
  66.   
  67.         System.out.println("delete successfully");   
  68.   
  69.         session.close();   
  70.   
  71.     }   
  72.   
  73.        
  74.   
  75.     /** *//**  
  76.  
  77.      * 測試實現(xiàn)查詢的存儲過程  
  78.  
  79.      * @throws Exception  
  80.  
  81.      */  
  82.   
  83.     private void testProcQuery(Session session) throws Exception {   
  84.   
  85.         //查詢用戶列表   
  86.   
  87.         List list = session.getNamedQuery("getUserList").list();   
  88.   
  89.         for (int i = 0; i < list.size(); i++) {   
  90.   
  91.             User user = (User) list.get(i);       
  92.   
  93.             System.out.print("序號: " + (i+1));   
  94.   
  95.             System.out.print(", userid: " + user.getUserid());   
  96.   
  97.             System.out.print(", name: " + user.getName());   
  98.   
  99.             System.out.println(", blog: " + user.getBlog());   
  100.   
  101.         }   
  102.   
  103.     }   
  104.   
  105.        
  106.   
  107.     /** *//**  
  108.  
  109.      * 測試實現(xiàn)更新的存儲過程  
  110.  
  111.      * @throws Exception  
  112.  
  113.      */  
  114.   
  115.     private void testProcUpdate(Session session) throws Exception {   
  116.   
  117.         //更新用戶信息   
  118.   
  119.         Transaction tx = session.beginTransaction();    
  120.   
  121.         Connection con = session.connection();    
  122.   
  123.         String procedure = "{call updateUser(?, ?, ?)}";    
  124.   
  125.         CallableStatement cstmt = con.prepareCall(procedure);    
  126.   
  127.         cstmt.setString(1"陳xx");   
  128.   
  129.         cstmt.setString(2"http://www./sterningChen");   
  130.   
  131.         cstmt.setString(3"sterning");   
  132.   
  133.         cstmt.executeUpdate();    
  134.   
  135.         tx.commit();   
  136.   
  137.     }   
  138.   
  139.     
  140.   
  141.     /** *//**  
  142.  
  143.      * 測試實現(xiàn)插入的存儲過程  
  144.  
  145.      * @throws Exception  
  146.  
  147.      */  
  148.   
  149.     private void testProcInsert(Session session) throws Exception {   
  150.   
  151.         //創(chuàng)建用戶信息   
  152.   
  153.         session.beginTransaction();   
  154.   
  155.         PreparedStatement st = session.connection().prepareStatement("{call createUser(?, ?, ?)}");   
  156.   
  157.         st.setString(1"amigo");   
  158.   
  159.         st.setString(2"阿蜜果");   
  160.   
  161.         st.setString(3"http://www.w/amigoxie");   
  162.   
  163.         st.execute();   
  164.   
  165.         session.getTransaction().commit();    
  166.   
  167.     }   
  168.   
  169.        
  170.   
  171.     /** *//**  
  172.  
  173.      * 測試實現(xiàn)刪除的存儲過程  
  174.  
  175.      * @throws Exception  
  176.  
  177.      */  
  178.   
  179.     private void testProcDelete(Session session) throws Exception {   
  180.   
  181.         //刪除用戶信息   
  182.   
  183.         session.beginTransaction();   
  184.   
  185.         PreparedStatement st = session.connection().prepareStatement("{call deleteUser(?)}");   
  186.   
  187.         st.setString(1"amigo");   
  188.   
  189.         st.execute();   
  190.   
  191.         session.getTransaction().commit();   
  192.   
  193.     }   
  194.   
  195. }  

   在本類中,,調(diào)用查詢類存儲過程時,,調(diào)用session.getNamedQuery("…")方法來獲得User.hbm.xml中配置的查詢存儲過程,。在其余的存儲過程調(diào)用的測試中,首先通過hibernate的session獲得connection,,然后調(diào)用connection對象的相應方法來實現(xiàn)存儲過程的調(diào)用。

該類的執(zhí)行結(jié)果如下:

Hibernate: {call getUserList()}

序號: 1, userid: ant, name: 螞蟻, blog: http://www./qixiangnj

序號: 2, userid: beansoft, name: bean, blog: http://www./beansoft

序號: 3, userid: sterning, name: 似水流年, blog: http://www./sterning

序號: 4, userid: tom, name: tom, blog: http://www./tom

update successfully

insert successfully

delete successfully

五.總結(jié)
   本例提出了在hibernate3中調(diào)用mysql的存儲過程的實現(xiàn)方案,,從本例可以看出,,hibernate提供了在*.hbm.xml中配置調(diào)用存儲過程,并通過向用戶提供session.getNamedQuery(“…”)方法來調(diào)用配置的調(diào)用查詢相關的存儲過程的方法,,另外,,hibernate還提供了取得sql的connection的方法,從而能夠通過connection中存儲過程調(diào)用相關的方法來實現(xiàn)存儲過程的調(diào)用,。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多