原文鏈接http://zhhll.icu/2020/08/12/%E6%A1%86%E6%9E%B6/hibernate/hibernate%E7%AE%80%E4%BB%8B/
hibernate簡介
ORM
ORM(Object Relation Mapping)對象關系映射
思想:將關系數據庫中表中的記錄映射為對象,以對象的形式展現,可以把對數據庫的操作轉化為對對象的操作。
采用元數據來描述對象-關系映射細節,元數據通常采用XML格式,存放在專門的對象-關系映射文件中。
hibernate
hibernate是一個老牌的ORM框架,通過hbm.xml映射文件維護Java和數據庫表之間的關系,還可以屏蔽不同數據庫產品的SQL語句的差異。
-
提供Criteria條件查詢,完全不需要考慮數據庫底層如何實現、SQL如何編寫
-
還提供了HQL語言,hibernate會根據實際配置的數據庫方言,將HQL語句生成對應的SQL語句。
使用這兩種方式都可以幫助上層程序屏蔽掉底層數據庫的差異,增強程序的可移植性。
但是數據庫結構比較復雜時,hibernate生成的SQL語句會比較復雜,而且會讓生成的SQL語句使用正確的索引也比較困難,會導致出現大量慢查詢的情況。(Mybatis半自動化的映射方式可以解決性能問題)
hibernate核心接口
Configuration接口
用於配置hibernate,通過configuration實例來獲得對象-關系映射文件中的元數據,以及動態配置hibernate屬性,創建SessionFactory實例
// 對應的hibernate基本配置信息和對象關系映射信息
Configuration configuration = new Configuration();
// 找的hibernate.cfg.xml配置文件
configuration.configure();
SessionFactory接口
一個SessionFactory實例對應一個數據存儲源,應用從SessionFactory中獲得Session實例
// 4.0之前不需要使用serviceRegistry 直接構建sessionFactory configuration.buildSessionFactory()
// 4.0之后創建serviceRegistry,所有的配置和服務都要在該對象中注冊才可以生效
// 4.3之前使用該方式new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
SessionFactory的特點
-
線程安全,同一個實例可以被應用的多個線程共享
-
重量級,不能隨意的創建和銷毀,如果應用只訪問一個數據庫,只需要創建一個SessionFactory實例,多個數據庫的話,需要為每個數據庫創建一個單獨的SessionFactory實例
-
需要很大的緩存來存放預定義的SQL語句及映射元數據等。用戶可以為SessionFactory配置一個緩存插件,稱為二級緩存,用來存放讀取過的數據,
Session接口
Session被稱為持久化管理器,它提供了和持久化相關的操作,如保存、更新、刪除、加載和查詢對象,是hibernate運作的中心,所有持久化對象必須在session管理下才可以進行持久化操作。生命周期很短,相當於JDBC的connection,對connection進行了包裝。
Session的特點:
-
不是線程安全的,應避免多個線程共享同一個Session實例
-
Session是輕量級的,創建和銷毀不需要消耗太多資源
Session有一個緩存,是Hibernate的一級緩存,存放被當前工作單元加載的對象。每個Session實例都有自己的緩存,這個Session實例的緩存只能被當前工作單元訪問
Transaction接口
Transaction接口是Hibernate的數據庫事務接口,對底層的事務接口做了封裝
Query和Criteria接口
這兩個接口是Hibernate的查詢接口。Query實例包裝了一個HQL查詢語句,Criteria接口完全封裝了基於字符串形式的查詢語句,擅長執行動態查詢
事件處理接口
當程序通過Hibernate來加載、保存、更新或刪除對象時,會觸發Hibernate的攔截器及事件監聽器做出相應的處理:
-
事件及事件監聽接口:在Hibernate中,針對每種事件都有相應的事件監聽器,如加載對象會觸發org.hibernate.event.LoadEvent事件,該事件由org.hibernate.event.LoadEventListener監聽器處理。保存對象觸發org.hibernate.event.SaveEvent事件,該事件由org.hibernate.event.SaveEventListener監聽器處理
-
攔截器:實現org.hibernate.Interceptor接口,Interceptor實現類負責響應持久化類的實例被加載、保存、更新或刪除的事件
Hibernate可擴展接口
- 定制主鍵的生成策略:IdentifierGenerator接口
- 定制本地SQL方言:Dialect抽象類
- 定制緩存機制:Cache和CacheProvicer接口
- 定制JDBC連接管理:ConnectionProvder接口
- 定制事務管理:TransactionFactory、Transaction和TransactionManagerLookup接口
- 定制屬性訪問策略:PropertyAccessor接口
- 創建代理:ProxyFactory接口
- 定制客戶化映射類型:UserType和CompositeUserType接口
由於本身的博客百度沒有收錄,博客地址http://zhhll.icu