Hibernate相關API總結

本文總結了Hibernate7個核心API:Configuration、SessionFactory、Session、Transaction、Query、Criteria、SQLQuery


 

目錄

Configuration:配置對象

SessionFactory:Session工廠對象

 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 languagehibernate提供查詢語言,這個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);
    }
			

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章