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介面