1. 程式人生 > >Hibernate核心介面

Hibernate核心介面

一、Configuration類
一個應用程式只建立一個Configuration物件,只存在於系統的初始化階段。
1.常用的Configuration操作方法

若要載入多個自定義的XML檔案,可採用Configuration中提供的addResource方法實現:

    //多次呼叫addResource方法,載入xml對映檔案
    Configuration cfg=new 
    Configuration().addResource("xml1.hbm.xml").addresource("xml2.hbm.xml"
); //多次呼叫addClass方法,直接新增被對映的類,消除對檔名的硬編碼 //在/com/model下尋找xml1.hbm.xml和xml2.hbm.xml檔案,並載入進來 Configuration cfg=new Configuration().addClass(com.model.xml1.class).addClass(com.model.xml2.class); //呼叫setProperty方法動態配置屬性值 Configuration cfg=new Configuration().addClass(com.model.xml1.class
).addClass(com.model.xml2.class). setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect"). setProperty("hibernate.connection.datasource","java:comp/env/jdbc/test");

二、SessionFactory介面
一個應用程式中只有一個SessionFactory例項,且不能改變。
!!但當專案中要操作多個數據庫時,必須為每個資料庫指定一個SessionFactory。
1.常用操作方法

    Configuration config = new Configuration().configure();
    SessionFactory sessionFactory=config.buildSessionFactory();
    //採用openSession()方法建立Session
    Session session1=sessionFactory.openSession();
    //採用getCurrentSession()方法建立Session
    Session session2=sessionFactory.getCurrentSession();
採用openSession()方法建立Session例項時,SessionFactory直接建立一個新的Session例項,使用完成後呼叫
close()方法手動關閉。
採用getCurrentSession()方法建立的Session例項會被繫結到當前執行緒中,在提交(commit)或回滾(rollback)操
作時自動關閉。!!需在hibernate.cfg.xml配置檔案中新增如下配置:
     //使用本地事務
     <property name="hibernate.current_session_context_class">thread</property>
     //使用全域性事務
     <property name="hibernate.current_session_context_class">jta</property>

三、Session介面
Session物件生命週期以Transaction物件的事務開始和結束為邊界。
特點:
(1)非執行緒安全
(2)例項是輕量級的,建立和銷燬不需太多資源
(3)有一個快取(Hibernate的第一級快取),用於存放當前工作單元載入的物件。
物件在生命週期中有三種狀態:瞬時態(Transient)、持久態(Persistent)、遊離態(Detached)
能夠使物件進入持久態的方法包括:
save() :由瞬時態變為持久態;
load()或get() :返回的總是持久態物件;
find() :返回List集合,集合中的物件都是處於持久態;
update()、saveOrUpdate()和lock() :將遊離態物件轉換為持久態物件。
若一個持久態物件與一個瞬時態物件關聯,在允許級聯儲存的情況下,Session會在清理快取時將瞬時態物件
轉換為持久態物件。
將一個物件由持久態轉換為遊離態方法:
close() :若程式中再沒有變數來引用這些遊離態物件,則這些物件就會被垃圾回收而結束其生命週期。
evict() :將快取中的一個持久態物件刪除,使其變為遊離態。當Session的快取中儲存了大量的持久態物件時,
可呼叫evict()從中刪除一些持久態物件以節省記憶體空間。
1.常用操作方法
1.1save()方法
完成以下任務:
(1)將物件加入到快取中,同時標識為Persistent狀態;
(2)根據對映檔案中的配置資訊生成實體物件的唯一識別符號;
(3)生成計劃執行的insert語句。(事務結束或此操作為後續操作的前提情況下,才會執行insert語
句)
save()方法持久化實體物件的程式碼:

        User user = new User();//->瞬時態
        user.setName("Tom");
        user.setPassword("123456");
        Session session=sessionFactory.openSession(); //建立Session例項
        Transaction tx = session.beginTransaction();  //開啟事務
        session.save(user);//->持久態       
        tx.commit();       //提交事務
        session.close();   //關閉Session
        //->遊離態
    如果要對指定了/<generator>/元素的實體物件使用自定義的識別符號作為記錄的主鍵值,可利用Session例項中的
    過載方法save(Object object,Serializable id)來實現。
    對處於Persistent狀態的實體物件,在此呼叫save()方法是沒有意義的。

1.2update()方法
Session例項的update()方法主要完成以下任務:
(1)將user物件加入到快取中,並標識為Persistent狀態;
(2)生成計劃執行的update語句。
update()方法更新資料庫中記錄的方法程式碼:

        User user = new User();//->瞬時態
        user.setName("Tom");
        user.setPassword("123456");
        user.setId("1");    //**必須設定主鍵**
        Session session=sessionFactory.openSession(); //建立Session例項
        Transaction tx = session.beginTransaction();  //開啟事務
        session.update(user);//->持久態       
        tx.commit();       //提交事務
        session.close();   //關閉Session
        //->遊離態

1.3saveOrUpdate()方法
當傳入Transient狀態實體物件時,執行save()操作;當傳入Detached狀態實體物件時,執行update()操作;
傳入Persistent狀態實體物件時,直接返回,不進行任何操作。
當用戶的id屬性為空時,執行save()操作,此時user物件被當作是瞬時態的;當從資料庫獲取的user物件的id
屬性不為空時,執行update()操作。

     String hql="select new User(user name,user age)from User user";//定義HQL語句
     Query query = session.createQuery(hql);//建立Query物件
     List users = query.list();//返回結果集
     //遍歷結果集
     for(int i=0;i<users.length();i++){
         User user = (User) users.get(i);
         user.setName("Jack");
         session.saveOrUpdate(user);//id為null,執行save()
      }
      String hql = "from User user";
      Query query = session.createQuery(hql);//建立Query物件
      List users = query.list();//返回結果集
      //遍歷結果集
      for(int i=0;i<users.length();i++){
         User user = (User) users.get(i);
         user.setName("Jack");
         session.saveOrUpdate(user);//id不為null,執行update()
       }

1.4delete()方法
主要完成以下任務:
(1)若傳入的實體物件不是Persistent狀態,則將需要刪除的物件與Session例項相關聯,使其轉變為
Persistent狀態;
(2)生成計劃執行的delete語句;
delete()方法刪除實體物件的過程程式碼:

     User user = new User();
     user.setId("1");//必須設定主鍵
     Session session = sessionFactory.openSession();
     Transaction tx = session.beginTransaction();
     session.delete(user);
     tx.commit();
     session.close();
 執行刪除操作時,應注意執行順序,尤其是有外來鍵關聯情況下,要避免刪除父物件而忘記刪除子物件情況,否則會引發約
 束衝突。

1.5get()方法
通過識別符號得到指定類的持久化物件。如果物件不存在則返回空。

     Session session = sessionFactory.getCurrentSession();//建立Session例項
     Transaction tx = session.beginTransaction();
     User user = (User)session.get(User.class,"1");//獲取id為"1"的持久化物件
     System.out.println(user.getId());
     tx.commit();
     session.close();

1.6load()方法
與get()方法一樣,都是通過識別符號得到指定類的持久化物件。但要求持久化物件一定存在,否則產生異
常。

     Session session = sessionFactory.getCurrentSession();//建立Session例項
     Transaction tx = session.beginTransaction();
     User user = (User)session.load(User.class,"1");//獲取id為"1"的持久化物件
     System.out.println(user.getId());
     tx.commit();
     session.close();
 get()和load()主要區別:
 (1)查詢記錄不存在時,get()返回null,load()丟擲異常;
 (2)get()直接返回實體類,load()可以返回實體的代理類例項(當xxx.hbm.xml中的<class>元素的lazy屬性值為
     true時)
 (3)load()和get()都是先從Session內部快取中查詢實體物件,如果沒找到,load()會查詢Hibernate的二級快取
     (get()會越過二級快取),若還未找到則傳送一條SQL語句到資料庫中查詢,根據查詢結果生成相應的實體物件。

1.7contains()方法
判斷一個實體物件是否與當前的Session物件相關聯,也可判斷是否處於Persistent狀態。
1.8evict()方法
通過移除快取中實體物件與Session例項之間的關聯關係來清除指定的物件,執行evict()後,實體物件由
Persistent狀態轉變為Detached狀態。

     if(session.contains(user))
         session.evict(user);

1.9clear()方法
清空session的快取。

下面介紹的幾種Sessionf方法分別建立了Query、Criteria以及SQLQuery查詢介面的例項,再通過這些例項來獲
取持久化物件。
1.10createQuery()方法
建立Query查詢介面例項,該例項可以使用HQL語言進行資料庫查詢操作。

      Session session = sessionFactory.getCurrentSession();//建立Session例項
      Transaction tx = session.beginTransaction();
      Query query = session.createQuery("from User");//建立Query例項
      List list = query.list();
      tx.commit();
      session.close();

1.11createCriteria()方法
建立Criteria查詢介面例項,可通過設定條件來執行資料庫查詢操作。

      Session session = sessionFactory.getCurrentSession();//建立Session例項
      Transaction tx = session.beginTransaction();
      Criteria crit = session.createCriteria(User.class);//建立Criteria例項
      crit.setMaxResults(50);
      List users = crit.list();
      tx.commit();
      session.close();

1.12createSQLQuery()方法
建立SQLQuery查詢介面例項。查詢介面通過標準SQL語句執行資料查詢操作。

       Session session = sessionFactory.getCurrentSession();//建立Session例項
       List users = session.createSQLQuery("select {user.*} from User {user}",
                                           "user",User.class).list();
       session.close();

1.13createFilter()方法
用於一個持久化集合或陣列的特殊查詢。查詢字串中可以使用this關鍵字引用集合中當前元素。

     //查詢班級team中成績高於80分的學生集合。
      Collection StudentScore = session.createFilter(team.getStudents(),("where 
                     this.score>?").setParameter(1,new Integer(80)).list());

四、Transaction介面
事務提交:
事務回滾:
事務隔離和隔離級別關係表:
事務隔離和隔離級別關係表
配置檔案中可對隔離級別進行設定:

     <property name="hibernate.connection.isolation">4</property>

五、Query介面
介面在使用HQL語句對資料庫進行操作時,主要包括以下三個步驟:
(1)建立Query例項。Query query=session.createQuery(hql)
(2)設定動態引數。setter方法
(3)執行查詢語句,返回查詢結果。既可以返回List型別的結果,也可返回唯一的物件。
1.常用Query操作方法
1.1setter方法
設定引數時,既可以根據引數名稱來設定,也可根據引數位置來設定。

      Session session = sessionFactory.openSession();//建立Session例項
      Query query = session.createQuery("from user where age>**:userAge**");
      query.setInteger("userAge",25);   //根據名稱設定
      List users = query.list();
      //
      Query query = session.createQuery("from user where age>**?**");
      query.setInteger(0,25);   //根據位置設定
      List users = query.list();
      session.close();

1.2list()方法
執行查詢語句,以List型別返回。Hibernaet會將所有結果集中資料轉換成Java實體物件。
1.3iterator()方法
執行查詢語句返回Iterator物件。讀取時只能按順序方式讀取(不知道結果集中記錄的數目),僅把使用到的
資料轉換成Java實體物件。

     Session session = sessionFactory.openSession();//建立Session例項
     Query query = session.createQuery("from user");
     Iterator iter = query.iterator();
     //遍歷結果集
     while(iter.hasNext()){
         ...
      }
     session.close(); 

1.4uniqueResult()方法
返回唯一結果,可將返回結果直接轉換成相應的物件。

     Session session = sessionFactory.openSession();//建立Session例項
     Query query = session.createQuery("from User where id="1" ");
     User user = (User)query.uniqueResult();
     session.close();

1.5executeUpdate()方法
可支援HQL語句的更新和刪除操作,建議更新時採用。

     Session session = sessionFactory.openSession();//建立Session例項
     Transaction tx = session.beginTransaction();
     Query query = session.createQuery("update User set password='123' ");
     query.executeUpdate();
     tx.commit();
     session.close();

1.6setFirstResult()方法
設定所獲取的第一個記錄的位置,從0(第1個)開始計算.
1.7setMaxResults()方法
設定結果集的最大記錄數,實現分頁功能時非常有用。

     Session session = sessionFactory.openSession();//建立Session例項
     Transaction tx = session.beginTransaction();
     Query query = session.createQuery("from User");
     int currentPage = xxx;//當前頁數,第1頁開始計算
     int pageSize = xx;//每頁記錄數
     query.setFirstResult((currentPage-1)*pageSize);
     query.setMaxResults(pageSize);
     List users = query.list();
     tx.commit();
     session.close();

2.1實體查詢
2.2屬性查詢
2.3實體的更新和刪除
2.4HQL的聚集函式
2.5分組和排序
2.6子查詢
六、Criteria介面