面向java環境的對象/關系數據庫映射工具。
1.開源的持久層框架.
2.ORM(Object/Relational Mapping)映射工具,建立面向對象的域模型和關系數據模型之間的映射.
3.連接java應用和數據庫的中間件.
4.對JDBC進行封裝,負責java對象的持久化.
5.在分層結構中處於持久化層,封裝對數據庫的訪問細節,使業務邏輯層更專注於實現業務邏輯
Hibernate作用
Hibernate是Java應用和關系數據庫之間的橋梁,它負責Java對象和關系數據之間的映射。 Hibernate內部封裝了通過JDBC訪問數據庫的操作,向上層應用提供了面向對象的數據訪問API。對象-關系映射(ORM,即Object-Relation Mapping).
指單個組件中負責所有實體域對象的持久化,封裝數據訪問細節。
對象-關系映射的概念
面向對象概念
面向關系概念
類
表
對象
表的行(記錄)
屬性
表的列(字段)
ORM中間件的使用方法
采用元數據來描述對象-關系映射細節,元數據通常采用xml格式,並存放在專門的對象-關系映射文件中。只要配置了持久化類與表的映射關系,orm中間件在運行時就能夠參照映射文件的信息,把域對象持久化到數據庫中。
public void deleteCustomer(Customer c){ Session session = getSession(); session.delete(c); }
執行步驟如下:
1.運用反射機制,獲得Customer對象的Customer.class類。
2.參照映射文件得到Customer類對應的表的信息,以及和Customer類關聯的類以及相應的表信息。
3.根據以上信息生成SQL語句。
4.調用JDBC API,執行該語句。
1.提供訪問數據庫操作(session,transaction,query)
2.配置hibernate接口(configuratioin)
3.回調接口(Interceptor,Lifecycle,Validatable)
4.用於擴展的功能接口(UserType,CompositeUserType, IdentifierGenerator)
Hibernate對JDBC做了輕量級的封裝。所謂輕量級是指Hibernate並沒有完全封裝JDBC,java應用既可以通過HibernateAPI來訪問數據庫,還可直接通過JDBC API訪問數據庫。
Hibernate核心接口
1.Configuration
配置hibernate,根啟動hibernate,創建sessionFactory對象。
2 .sessionFactory
負責創建Session對象,可以通過Configuration對象創建SessionFactory對象。
SessionFactory 對象中保存了當前的數據庫配置信息和所有映射關 系以及 預定義的SQL語句。同時,SessionFactory還負責維護Hibernate的二級緩存。
SessionFactory對象的創建會有較大的開銷,而且SessionFactory對象采取了線程安全的設計方式,因此在實際中SessionFactory對象可以盡量的共享,在大多數情況下,一個應用中針對一個數據庫可以共享一個SessionFactory實例
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
3.Session
使用最廣泛,也被稱為持久化管理器,它提供和持久化相關的操作。增、刪、改、查等。不是線程安全的,因此,一個Session對象只可以由一個線程使用。避免多個線程共享。輕量級的,創建和銷毀不需要消耗太多資源。Session中有一個緩存,稱為一級緩存。存放當前工作單元加載的對象。
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
4.Transaction hibernate數據庫事務接口
將應用代碼從底層的事務實現中抽象出來——這可能是一個JDBC事務,一個JTA用戶事務或者甚至是一個公共對象請求代理結構(CORBA)——允許應用通過一組一致的API控制事務邊界。
使用Hibernate進行操作時(增、刪、改)必須顯示的調用Transaction(默認:autoCommit=false)
Transaction tx = session.beginTransaction();
5.Query和Criteria接口
都是查詢接口,query實例包裝了HQL查詢語句,hql是面向對象的,他引用類名及類的屬性名,而不是表名和字段名。Criteria接口完全封裝了基於字符串形式的查詢語句,比query接口更面向對象,他擅長執行動態查詢。sessoin接口的find方法也具有數據查詢功能,但他只是執行一些簡單的hql查詢語句的快捷方式,遠沒有query接口功能強大。
回調接口
1.Lifecycle和Validatable接口:lifecycle接口能使持久化類響應被加載、保存和刪除事件。Validatable接口使持久化類的接口被保存之前進行數據驗證。這種方式強迫持久化類實現特定接口,使hibernate API滲透到持久化類中,會影響可移植性,不值得推薦。
2.Interceptor:不必由持久化類來實現。可定義專門實現該接口的類,負責響應持久化類的實例被加載、保存、更新或刪除的事件。
Hibernate映射類型接口
1.PrivateType類:映射java基本數據類型,包括ByteType、ShortType、IntegerType、LongType、FloatType、DoubleType、CharactorType、BooleanType。
2.DateType:映射java日期類型。
3.BinaryType:映射Byte[]類型。
Query.setParameter(“name”,”name”,Hibernate.STRING)
可供擴展的接口
hibernate提供的多數功能是可配置的,允許用戶選擇適當的內置策略。如可配置如下數據庫方言:
hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
hibernate.dialect=net.sf.hibernate.dialect.OracleDialect
hibernate.dialect=net.sf.hibernate.dialect.SybaseDialect
如果hibernate內置的策略不能滿足需求時,允許用戶自定義實現接口或擴展特定的類。Hibernate的擴展點包括:
主鍵生成策略:IdentifierGenerator
sql方言:Dialect抽象類
緩存機制:cache和cacheprovider接口
jdbc連接管理器:connectionprovider等
Hibernate的運行過程如下:
1、應用程序先調用Configuration類,該類讀取Hibernate配置文件及映射文件中的信息,
2、並用這些信息生成一個SessionFactory對象,
3、然後從SessionFactory對象生成一個Session對象,
4、並用Session對象生成Transaction對象;
A、可通過Session對象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對PO進行加載、保存、更新、刪除、等操作;
B、在查詢的情況下,可通過Session對象生成一個Query對象,然後利用Query對象執行查詢操作;如果沒有異常,Transaction對象將提交這些操作到數據庫中。
小結