淺談對象關系映射框架Hibernate
一、什么是hibernate
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,它可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的JavaEE架構中取代CMP,完成數據持久化的重任。
ORM(對象關系映射)思想,所謂的ORM就是利用描述對象和數據庫表之間的映射元數據,自動把Java應用程序的對象,持久化到關系型數據庫的表中。通過操作Java對象,就可以完成對數據庫的操作,可以把ORM理解為關系型數據庫和對象的一個紐帶,開發人員只需要關注紐帶一端映射的對象即可。
二、Hibernate優勢
1. Hibernate對JDBC訪問數據庫的代碼做了一個輕量級的封裝,大大簡化了數據訪問層的繁瑣操作,減少代碼的復雜度,和減少內存消耗,加快了運行速度
2. Hibernate是一個基于JDBC的主流框架,是一個優秀ORM實現,很大程度上簡化了DAO層操作
3. Hibernate性能較好,靈活性較高,它可以支持一對一、一對多、多對多
4. 可擴展性強,當本身功能不夠時,可以自行編碼進行擴展
三、Hibernate下載
1、下載Hibernate框架
點擊上方進入官網下載,目前最新開發版本為6.0,建議先下載5.6穩定版進行使用,新版本可能存在不確定因素。
點擊進去后選擇zip archive即可下載
2、hibernate解壓后的目錄
四、創建Hibernate項目
1、創建工程
修改項目文件編碼格式
在打開IDEA時點擊configure 點setting 然后找到file Encodings 將編碼全改成UTF-8 然后打勾
創建普通的java工程項目
2、導入jar包
在項目目錄下新建lib目錄,將下面的jar包導入lib目錄
導入hibernate核心jar包
導入數據庫驅動jar包
導入日志包
創建一個包,把這些jar包放進去,并將全部應用到整個項目依賴庫 當前面出現的小箭頭 就說明成功了
3、創建實體類
package com.hbnu.pojo; public class User { //hibernate 要求實體類必須要有一個唯一屬性值 private int uid; //id號 private String username;//用戶名 private String address;//地址 public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "uid=" + uid + ", username='" + username + '\'' + ", address='" + address + '\'' + '}'; } }
五、Hibernate配置文件
1、映射關系配置文件
映射關系配置文件路徑沒有限制,官方建議將映射配置文件和實體類放在同一路徑下
映射關系配置文件名稱沒有限制,但后綴為.xml,官方建議映射關系配置文件命名為:實體類名.hbm.xml
2、核心配置文件
核心配置文件路徑必須在src目錄下
核心配置文件名稱必須為hibernate.cfg.xml
hibernate在工作時,會直接加載核心配置文件,不會直接加載映射關系配置文件
六、hibernate運行測試
package test; import com.hbnu.pojo.User; import com.hbnu.util.HibernateUtils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class HibernateTest { /** * 添加數據到表中 */ @Test public void insertData(){ //1. 加載hibernate配置文件(解析核心配置文件) Configuration configure = new Configuration().configure(); //2. 根據配置對象configure構建會話工廠 SessionFactory sessionFactory = configure.buildSessionFactory(); //3. 根據會話工廠創建會話對象 Session session = sessionFactory.openSession(); //4. 通過調用會話對象的相關方法執行數據庫的CRUD操作 User user = new User(); user.setUsername("123456"); user.setAddress("huangshi"); session.save(user); //操作Java中的對象,保存對象中的數據到數據庫表中 //5. 關閉會話和會話工廠 session.close(); sessionFactory.close(); }
七、Hibernate執行過程
1. 通過Configuration對象加載hibernate核心配置文件,間接加載映射關系配置文件
2. 通過Configuration對象構建會話工廠SessionFactory
3. 通過會話工廠SessionFactory對象創建會話對象Session
4. 通過調用會話對象Session的相關方法執行數據庫的CRUD操作
5. 關閉會話對象和會話工廠
核心相關API
Hibernate的API一共有6個,分別為:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通過這些接口,可以對持久化對象進行存取、事務控制。
Session
Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同于JSP應用中的HttpSession。這里當使用session這個術語時,其實指的是Hibernate中的session,而以后會將HttpSession對象稱為用戶session。
1. session對象類似于JDBC中的Connection
2. session對象有操作數據庫的相關方法
添加 save()
修改 update()
刪除 delete()
根據主鍵id查詢 get(id)
3. session是單線程的
SessionFactory
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個數據庫指定一個SessionFactory。sessionFactory對象的創建是通過Configruation對象,根據配置文件的配置信息創建會話工廠,同時在創建會話工廠的過程中自動創建數據庫表,這個過程是比較耗資源的。在hibernate項目中,建議一個項目只創建一次SessionFactory對象,可以通過工具類來實現
package com.hbnu.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static Configuration configuration; private static SessionFactory sessionFactory; static { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } public static SessionFactory getSessionFactory() { return sessionFactory; } }
Transaction
Transaction 接口是一個可選的API,可以選擇不使用這個接口,取而代之的是Hibernate 的設計者自己寫的底層事務處理代碼。 Transaction 接口是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。之所以這樣設計是能讓開發者能夠使用一個統一事務的操作界面,使得自己的項目可以在不同的環境和容器之間方便地移植。
Query
Query接口讓你方便地對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。Query經常被用來綁定查詢參數、限制查詢記錄數量,并最終執行查詢操作。
Criteria
Criteria接口與Query接口非常類似,允許創建并執行面向對象的標準化查詢。值得注意的是Criteria接口也是輕量級的,它不能在Session之外使用。
Configuration
Configuration 類的作用是對Hibernate 進行配置,以及對它進行啟動。在Hibernate 的啟動過程中,Configuration 類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。雖然Configuration 類在整個Hibernate 項目中只扮演著一個很小的角色,但它是啟動hibernate 時所遇到的第一個對象。
九、主鍵生成策略
increment
適用于long、short或int類型主鍵,由Hibernate提供自動遞增的方式生成唯一標識符,每次增量為1。只有當沒有其他進程向同一張表中插入數據時才可以使用,不能再多線程環境下使用
identity
適用于long、short或int類型主鍵,采用底層數據庫本身提供的主鍵生成標識符。在DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL數據庫中可以使用該生成器,該生成器要求在數據庫中把主鍵定義成為自增類型。Oracle沒有自動增長
sequence
適用于long、short或int類型主鍵,Hibernate根據底層數據庫序列生成標識符。條件是數據庫支持序列。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence,MySQL這種不支持sequence
native(掌握)
根據底層數據庫對自動生成標識符的能力來選擇identity、sequence、hilo三種生成器中的一種,適合跨數據庫平臺開發
uuid(掌握)
Hibernate采用128位的UUID算法來生成標識符。該算法能夠在網絡環境中生成唯一的字符串標識符,其UUID被編碼為一個長度為32位的十六進制字符串。按照開放軟件基金會(OSF)制定的標準計算,用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字,uuid長度大,占用空間大,跨數據庫,不用訪問數據庫就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。
assigned
由Java程序負責生成標識符,Hibernate不管理主鍵,用戶手動設置主鍵的值。如果不指定id元素的generator屬性,則默認使用該主鍵生成策略
十、對象的CRUD
1、查詢數據庫
/** * *查詢數據庫表中的信息 */ @Test public void queryData(){ SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session =sessionFactory.openSession(); //調用seesion中的方法查詢數據庫表 User user = session.get(User.class,1); System.out.println(user); session.close();; sessionFactory.close(); }
可以看出hibernate此時的優勢就是自動生成sql語句,查詢到了數據庫里的數據
2、修改數據庫
先查詢要修改的數據,再修改數據,只要我們改變數據庫中的數據,則必須添加事務
/** * * 修改數據庫表中的信息 */ @Test public void updateData(){ SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); Session session =sessionFactory.openSession(); Transaction transaction =session.beginTransaction(); //先查詢數據,再修改數據 只要我們對數據庫中的數據改變 則必須添加事務 User user = session.get(User.class, 1); user.setAddress("wuhan"); user.setUsername("yang"); session.update(user); transaction.commit();//提交事務 session.close();; sessionFactory.close(); }
3.刪除數據庫的數據
/** * 刪除數據表中信息 */ @Test public void deleteData(){ SessionFactory sessionFactory =HibernateUtils.getSessionFactory(); Session session =sessionFactory.openSession(); Transaction transaction =session.beginTransaction(); User user = session.get(User.class,1); session.delete(user); transaction.commit(); //關閉資源 sessionFactory.close(); session.close(); }
總結
Hibernate是關于Java對象和關系數據庫之間的聯系的話,也就是我們MVC中的數據持久層->在編寫程序中的DAO層...
感恩能與大家在華為云遇見!希望能與大家一起在華為云社區共同成長。
JAR Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。