1. 程式人生 > >理解hibernate hibernate工作原理

理解hibernate hibernate工作原理

      Hibernate是一個開放原始碼的物件關係對映框架。
      Hibernate對JDBC進行了非常輕量級的物件封裝,它將POJO(Plain Ordinary Java Object:簡單的java物件,實際就是普通JavaBean)與資料庫表建立對映關係,是一個全自動的orm(Object Relational Mapping:物件關係對映)框架,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。這樣就不需要和複雜的sql打交道,只要像操作物件一樣的操作它就可以了(把關係資料庫的欄位在記憶體中對映成物件的屬性)。
      Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成資料持久化的重任。

ORM工具簡化了資料建立,資料處理和資料訪問。它是將物件對映到資料庫中儲存的資料(表)的程式設計技術。
這裡寫圖片描述

hibernate工作原理:
1、呼叫Configuration類,通過Configuration config = new Configuration().configure();讀取並解析hibernate.cfg.xml配置檔案
2、通過hibernate.cfg.xml中的<mapping resource="com/xxx/Xxx.hbm.xml"/>讀取並解析對映資訊
3、通過SessionFactory sessionfactory = config.buildSessionFactory();通過讀取的這些配置資訊建立一個sessionfactory物件
4、Session session = sessionfactory.openSession();通過sessionfactory生成一個Sesssion物件
5、Transaction ts = session.beginTransaction();通過session物件建立並啟動事務Transation
6、通過Session物件的get()、sava()、update()、delete()和saveOrupdate()等方法對PO進行載入,儲存,更新,刪除等操作;
7、在查詢的情況下,可通過Session物件生成一個Query物件,然後利用Query物件執行查詢操作。如果沒有異常,Transaction物件將提交這些操作結果到資料庫中,否則會回滾事務。
這裡寫圖片描述

Hibernate是如何連線資料庫?
主要是通過hibernate.cfg.xml配置檔案中的配置。在這個檔案中定義了資料庫進行連線所需要的資訊,包括JDBC驅動、使用者名稱、密碼、資料庫方言等,configuration類藉助dom4j的XML解析器解析設定環境,然後使用這些環境屬性來生成 SessionFactory。這樣這個sessionFactory生成的session就能成功獲得資料庫的連線。
hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory> <!-- 連線資料庫的基本配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///student?characterEncoding=utf-8</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 配置方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 顯示sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 格式化顯示SQL --> <property name="format_sql">true</property> <!-- 告訴主配置檔案,在載入該配置檔案的時候,載入對應的對映檔案 --> <mapping resource="org/danni/model/entity/Admin.hbm.xml" /> <mapping resource="org/danni/model/entity/Department.hbm.xml" /> <mapping resource="org/danni/model/entity/Employee.hbm.xml" /> </session-factory> </hibernate-configuration>

Hibernate框架有很多優點:
1、開源和輕量級: Hibernate框架是根據LGPL許可證和輕量級的開源工具。
2、快速效能: Hibernate框架的效能很快,因為快取在Hibernate框架內部使用。 hibernate框架中有兩種型別的快取:一級快取和二級快取。一級快取預設是啟用的。
3、資料庫獨立查詢: HQL(Hibernate查詢語言)是面向物件的SQL版本。 它生成資料庫獨立查詢。 所以你不需要編寫資料庫特定的查詢語句。 在Hibernate之前,如果專案更改了資料庫,我們需要更改SQL查詢,從而導致維護變得非常複雜。
4、自動建立表: Hibernate框架提供了自動建立資料庫表的功能。 因此,無需手動在資料庫中建立表。
5、簡化複雜連線: 在hibernate框架中可輕鬆獲取多個表中的資料。
6、提供查詢統計和資料庫狀態: Hibernate支援查詢快取,並提供有關查詢和資料庫狀態的統計資訊。

hibernate核心介面
session:負責對持久化物件CRUD操作
sessionFactory:負責初始化hibernate,建立session物件
configuration:負責配置並啟動hibernate,建立SessionFactory
Transaction:負責事物相關的操作
Query和Criteria介面:負責執行各種資料庫查詢

1、會話工廠(SessionFactory介面)
SessionFactory是ConnectionProvider的會話和客戶端工廠。 它擁有資料的二級快取(可選)。SessionFactroy介面負責初始化Hibernate。它充當資料儲存源的代理,org.hibernate.SessionFactory介面提供了工廠方法來獲取Session的物件。
需要注意的是SessionFactory並不是輕量級的,因為一般情況下,一個專案通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個資料庫指定一個SessionFactory。

2、會話(Session)
Session物件提供應用程式和儲存在資料庫中的資料之間的介面。 它是一個短生命週期的物件幷包裝JDBC連線。 它是事務,查詢和標準的工廠。 它擁有一級快取(強制性)資料。 org.hibernate.Session介面提供插入,更新和刪除物件的方法。 它還提供了事務,查詢和標準的工廠方法。

3、事務(Transaction介面)
Transaction介面負責事務相關的操作,一般在Hibernate的增刪改中出現, org.hibernate.Transaction介面提供事務管理的方法。但是使用Hibernate的人一般使用Spring去管理事務。

4、連線提供者(ConnectionProvider)
它是一個JDBC連線工廠。 它從DriverManager或DataSource抽象出來的應用程式。 它是一個可選項。

5、Configuration介面:
Configuration物件用於配置並根啟動Hibernate。Hibernate應用通過Configuration例項來指定物件—關係對映檔案的位置或者動態配置Hibernate的屬性,然後建立SessionFactory例項。
我們可以檢視Configuration的原始碼,它的configure()方法是這樣實現的:

public Configuration configure() throwsHibernateException {  
    configure("/hibernate.cfg.xml" );//此處指定了ORM檔案的位置  
    return this;  
}