本文總結了Hibernate7個核心API:Configuration、SessionFactory、Session、Transaction、Query、Criteria、SQLQuery
目錄
-
Configuration:配置對象
Configuration主要用於Hibernate框架加載映射文件
Configuration類的作用是對Hibernate進行配置,以及對它進行啓動。在Hibernate的啓動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然後創建一個SessionFactory對象。雖然Configuration類在整個Hibernate項目中扮演着一個很小的角色,但它是啓動hibernate時所遇到的第一個對象。
在使用Hibernate時,首先要創建Configuration實例,Configuration實例主要用於啓動、加載、管理hibernate的配置文件信息。
Configuration config = new Configuration();
config.configure();
到src下面找到名稱hibernate.cfg.xml配置文件,創建對象,把配置文件放到對象裏面。
-
SessionFactory:Session工廠對象
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個SessionFactory。
SessionFactory接口負責Hibernate的初始化和建立Session對象。它在Hibernate中起到一個緩衝區作用,Hibernate可以將自動生成的SQL語句、映射數據以及某些可以重複利用的數據放在這個緩衝區中。同時它還保存了對數據庫配置的所有映射關係,維護了當前的二級緩存。
在覈心配置文件中,數據庫配置方面:
<!-- hibernate幫創建表,需要配置之後
update: 如果已經有表,更新,如果沒有,創建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
具體實現(寫工具類,寫靜態代碼塊實現,因爲靜態代碼塊在類加載時候執行,執行一次)
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//靜態代碼塊實現
static {
//加載核心配置文件
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
-
Session:
Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的Session不同於JSP應用中的HttpSession。這裏當使用Session這個術語時,其實是指Hibernate中的Session,而以後會將HttpSession對象稱爲用戶Session。
Session是應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate運作的中心,它的主要功能是爲持久化對象提供創建、讀取和刪除的能力,所有持久化對象必須在Session的管理下才能進行持久化操作。
獲取Session對象的操作(兩種操作)
//2 獲取session,創建的是一個新的Session實例,需手動關閉
Session session = sessionFactory.openSession();
//2 獲取session,綁定在了當前線程中,自動關閉
Session session = sessionFactory.getCurrentSession();
調用session裏面不同的方法實現crud操作
(1)添加 save方法
(2)修改 update方法
(3)刪除 delete方法
(4)查詢 get方法(根據主鍵查詢)
(5)createQuery、createSQLQuery方法(用於數據庫操作對象)
(6)createCriteria方法(條件查詢)
-
Transaction
Transaction接口是一個可選的API,可以選擇不使用這個接口,取而代之的是Hibernate的設計者自己寫的底層事務處理代碼。Transaction接口是對實際事物實現的一個抽象,這些實現包括JDBC的事物、JTA中的UserTransaction、甚至可以是CORBA事物。之所以這樣設計是讓開發者能夠使用一個統一事物的操作界面,使得自己的項目可以在不同的環境和容器之間方便移植。
Transaction接口主要用於管理事物,它是Hibernate的數據庫事物接口,且對底層的事務接口進行了封裝。
事務開啓的實現:
Transaction tx = session.beginTransaction();
事務管理的常用方法:(事務的提交與回滾)
// 提交事務
tx.commit();
// 回滾事務
tx.rollback();
-
Query
Query代表面向對象的一個Hibernate查詢操作。在Hibernate中,通常使用session.createQuery()方法接受一個HQL語句,然後調用Query的list()或uniqueResult()方法執行查詢。
HQL語句:hibernate query language,hibernate提供查詢語言,這個hql語句和普通sql語句很相似
區別:
——使用sql操作表和表字段
——使用hql操作實體類和屬性
使用Query對象查詢:
//1 創建Query對象
//方法裏面寫hql語句
Query query = session.createQuery("from User");
//2 調用query對象裏面的方法得到結果
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
-
Criteria
使用這個對象查詢操作,但是使用這個對象的時候,不需要寫語句,直接調用方法實現。
2. 實現過程
(1)創建criteria對象
(2)調用對象裏面的方法得到結果
//1 創建criteria對象
//方法裏面參數是實體類class
Criteria criteria = session.createCriteria(User.class);
//2 調用方法得到結果
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
-
SQLQuery
使用hibernate時候,調用底層sql實現
2. 實現過程
(1)創建對象
(2)調用對象的方法得到結果
//1 創建對象
//參數普通sql語句
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
//調用sqlQuery裏面的方法
//返回list集合,默認裏面每部分數組結構
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
//返回的list中每部分是對象形式,設置將數據放到參數表示的實體中去
sqlQuery.addEntity(User.class);
//調用sqlQuery裏面的方法
List<User> list = sqlQuery.list();
for (User user : list) {
System.out.println(user);
}