Hibernate 簡(jiǎn)介
1. 前言
大家好!本節(jié)課將和大家一起學(xué)習(xí)鼎鼎有名的 Hibernate 框架。
本節(jié)課程將向大家介紹:
- Hibernate 的功能 、特點(diǎn);
- Hibernate 產(chǎn)生的背景;
- 并初步探討編寫 Jdbc 框架的基礎(chǔ)構(gòu)建思路。
2. Hibernate 是什么

簡(jiǎn)而言之:
- Hibernate 是一個(gè) Java Jdbc 框架,用來簡(jiǎn)化 Java Jdbc 操作;
- Hibernate 也是一個(gè)ORM 框架,可以自動(dòng)完成關(guān)系數(shù)據(jù)庫中關(guān)系型數(shù)據(jù)到 Java 對(duì)象型數(shù)據(jù)的映射;
- 當(dāng)然,還可以說是一個(gè)持久化框架。
以上說法其實(shí)是對(duì)完成同一件事情不同角度的詮釋。
Hibernate 的出現(xiàn)就是想讓開發(fā)者的編碼工作變得簡(jiǎn)單,這個(gè)簡(jiǎn)單指不需要在非核心邏輯編寫上花費(fèi)太多時(shí)間。
3. Hibernate 的發(fā)展歷史
喝水不忘挖井人,先了解下 Hibernate 的發(fā)展歷程。
故事的大致情節(jié)就是澳大利亞墨爾本一位名為 Gavin King 的 27 歲的程序員嫌棄原有的 Jdbc 編碼工作方式太過無聊、無腦。于是就買了一本 SQL 編程的書籍在不長的時(shí)間內(nèi)寫了這么一個(gè)叫 Hibernate 的框架。
Hibernate 一出江湖,便一鳴驚人如此而已;
Hibernate 承載了一個(gè)程序員的勵(lì)志故事。
Hibernate 由最初的 1.0 版本演變到了現(xiàn)在 6.x 版本(官網(wǎng)最新顯示),功能越來越強(qiáng)大,體積當(dāng)然也越來越強(qiáng)大。
至于你愛不愛它,還是要看項(xiàng)目的需要。
故事講完,繼續(xù)!
4. Hibernate 的特點(diǎn)
和 Hibernate 類似的框架很多,比如 Mybatis 之類。但是 Hibernate 在江湖上的地位一直都比較穩(wěn)定,追捧之人眾多。當(dāng)然,各喜所愛!在每一個(gè)程序員的心里都會(huì)有自己的白馬王子。
Hibernate 特點(diǎn)如下:
- 完全面向?qū)ο蟛僮鳎?/strong> 操作過程可以忘記 Jdbc API 帶來的傷痛;
- 操作簡(jiǎn)單: 復(fù)雜的查詢也只需幾行代碼,可以全身心去做核心業(yè)務(wù)邏輯;
- 沒有反射就沒有框架: 操作簡(jiǎn)單的代價(jià)是底層封裝代碼的負(fù)重前行,Hibernate 適合業(yè)務(wù)邏輯復(fù)雜的場(chǎng)景,不適合數(shù)據(jù)量很大的應(yīng)用;
- Hibetnate 提供了專業(yè)級(jí)生產(chǎn)環(huán)境中的事務(wù)、緩存、并發(fā)等多種容錯(cuò)、高性能、高穩(wěn)定性的解決方案。產(chǎn)品上線后,可減少開發(fā)者的后顧之憂,不用擔(dān)心什么時(shí)候會(huì)有只 Bug 突然爬出來;
- 簡(jiǎn)單易學(xué),操作方便,學(xué)習(xí)成本較低。還有……還有……就是 Hiberate 提供一種框架設(shè)計(jì)思想,其開發(fā)理念對(duì)開發(fā)者可產(chǎn)生思想層面影響。
5. Hibernate 與其它框架的比較
-
更適合現(xiàn)代開發(fā)理念: 產(chǎn)品的生命周期決定產(chǎn)品的市場(chǎng)價(jià)值,快速迭代開發(fā)是主流。Hibernate 能讓開發(fā)者高度關(guān)注項(xiàng)目的核心業(yè)務(wù)邏輯,而不因重復(fù)繁雜的數(shù)據(jù)庫連接操作影響產(chǎn)品的迭代周期;
-
說到 Hibetnate,就會(huì)談到與之齊名的 MyBatis,MyBatis 以半開發(fā)模式吸引開發(fā)者,讓開發(fā)者在開發(fā)過程具有一定的把控感。但是,在數(shù)據(jù)庫操作大的情況下書寫SQL語句并不是一件輕松之事;對(duì)業(yè)務(wù)量多、數(shù)據(jù)庫操作相對(duì)較少的情況,書寫些常規(guī)性SQL想必也帶來不了成就感。不如 Hibernate 來的簡(jiǎn)單直接;
-
Hibernate 提供多元化的操作模式。純粹主義者能以完全面向?qū)ο蠓绞讲僮鳎?strong>Hibernate 也提供了原生SQL操作模式,適合對(duì)原生 SQL 語句鐘情者;對(duì)于復(fù)雜的數(shù)據(jù)操作,也支持存儲(chǔ)過程調(diào)用。應(yīng)有盡有,總能找到自己喜歡的感覺。
專業(yè)的角度,無論哪一種 Jdbc 框架,其要解決的問題都是一樣的,其核心原則和思想是一樣的。Hibetnate 是一個(gè)封裝的嚴(yán)絲合縫的開源框架,其內(nèi)在的代碼架構(gòu)和代碼實(shí)現(xiàn)模式對(duì)于學(xué)習(xí)者無疑是一座寶藏。這點(diǎn)其它框架就無法與其一比。
6. Jdbc 框架形成過程
6.1 什么是持久化
要真正了解、認(rèn)識(shí) Hibernate, 先切換一下鏡頭,回到?jīng)]有Hibernate 之前的世界,一起來了解框架的演變過程(有需求才會(huì)有市場(chǎng)嘛)。
現(xiàn)在是提問時(shí)間:
程序的本質(zhì)是什么?
-----------------------我是等待你答案的中劃線-----------------------
程序的本質(zhì)是解決現(xiàn)實(shí)中的問題,解決問題之前,先解決第一個(gè)問題,用計(jì)算機(jī)建模并保存現(xiàn)實(shí)生活中的信息,這個(gè)過程叫信息數(shù)據(jù)化。
然后,按需求對(duì)數(shù)據(jù)進(jìn)行邏輯處理并產(chǎn)生結(jié)果數(shù)據(jù)。程序是從數(shù)據(jù)到數(shù)據(jù)的過程,當(dāng)然,算法功底很重要。
程序運(yùn)行時(shí)的數(shù)據(jù)是保存在內(nèi)存中的,叫臨時(shí)數(shù)據(jù)或叫瞬時(shí)數(shù)據(jù)。
程序運(yùn)行過程產(chǎn)生的數(shù)據(jù)有些是需要永久性保存的,選擇介質(zhì)較多,一般會(huì)選擇保存在數(shù)據(jù)庫中,Java 程序員可以使用 Jdbc Api 和數(shù)據(jù)庫進(jìn)行交互。
把程序中的數(shù)據(jù)寫回?cái)?shù)據(jù)庫這個(gè)過程也可稱為數(shù)據(jù)持久化過程。
6.2 Java Jdbc 框架演變之路
先回顧一下純手工 Jdbc 操作流程:
- 加載由不同廠商遵循 Jdbc 規(guī)范開發(fā)的驅(qū)動(dòng)類。關(guān)于 Jdbc 驅(qū)動(dòng)類開發(fā)不是這里要講的,可查閱相關(guān)資料;
Class.forName("對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)類名");
- 建立 Java 程序和數(shù)據(jù)庫系統(tǒng)的連接。本質(zhì)是進(jìn)程和進(jìn)程的網(wǎng)絡(luò)連接;
Connection conn = DriverManager.getConnection("url","用戶名","密碼");
- 確定數(shù)據(jù)清單。數(shù)據(jù)庫只認(rèn) SQL 語句,你需要數(shù)據(jù)庫幫你做什么樣的數(shù)據(jù)操作,需要傳送 SQL 指令給數(shù)據(jù)庫;
String sql="使用sql語法描述數(shù)據(jù)需求";
- 需要一個(gè)信使。創(chuàng)建一個(gè)語句處理對(duì)象充當(dāng)信使,任務(wù)就是上傳下達(dá);
PreparedStatement preparedStatement=conn.prepareStatement(sql);
- 信使工作,把程序中的數(shù)據(jù)搬運(yùn)到數(shù)據(jù)庫,或把數(shù)據(jù)庫數(shù)據(jù)搬運(yùn)到程序;
preparedStatement.各種方法();
- 數(shù)據(jù)搬運(yùn)過來后,Java 代碼要用呀!Java 語言有什么特點(diǎn)?面向?qū)ο髥??搬運(yùn)過來的數(shù)據(jù)是符合關(guān)系數(shù)據(jù)庫特點(diǎn)的數(shù)據(jù),于是開始手工數(shù)據(jù)格式轉(zhuǎn)換、封裝;
省略若干代碼,心里希望表結(jié)構(gòu)中字段不要太多!此時(shí)的苦只有自己知道?。?br> 7. 最后把封裝成 OOP 的數(shù)據(jù)交付給 Java 業(yè)務(wù)代碼使用,各種資源關(guān)閉。
在編碼時(shí),只要涉及到和數(shù)據(jù)交互行為。好吧,把前面的幾個(gè)步驟再走一遍。發(fā)現(xiàn)沒有,其實(shí)你在做大量的重復(fù)工作,好好的腦力活生生變成了體力活。
怎么辦?難道要承受這種編程生活的折磨嗎,當(dāng)然不!
通過模板方法解決 Jdbc 訪問中的重復(fù)性問題。
其實(shí),Jdbc 編程是一個(gè)模板化的操作過程,針對(duì)不同的數(shù)據(jù)請(qǐng)求操作其中只有 2 個(gè)地方是不一樣的。
- 數(shù)據(jù)清單不一樣。每一次、不同數(shù)據(jù)需求的 Jdbc 操作請(qǐng)求,SQL 語句是不一樣的。
- 另一個(gè)不一樣是從關(guān)系數(shù)據(jù)庫中讀出來的數(shù)據(jù)封裝成對(duì)應(yīng)的目標(biāo)對(duì)象類型是不一樣的。
知道這些就好辦,可以把 Jdbc 代碼操作封裝成一個(gè)模板方法。在模板方法中預(yù)留 2 個(gè)參數(shù):
- 傳入 SQL 語句;
- 傳入一個(gè)用于封裝結(jié)果集中的數(shù)據(jù)到 OOP 對(duì)象的方法。
按照這個(gè)思路,屬于你的 Jdbc 簡(jiǎn)易框架就要誕生了。有點(diǎn)激動(dòng)吧!
如下是查詢模板方法代碼參考:
/**
*通用 jdbc 查詢數(shù)據(jù)模板方法
*connection:連接對(duì)象,可由外部傳入,也可由內(nèi)部方法創(chuàng)建
*sql:傳過來的 SQL語句
*rsh:自定義結(jié)果集處理接口,其中有封裝結(jié)果集數(shù)據(jù)的方法
*args:SQL中參數(shù)值
*/
public <T> T query(Connection connection, String sql, ResultSetHandler<T> rsh, Object... args) throws SQLException {
// 建立連接
if (connection == null)
connection = this.dataSource.getConnection();
if (sql == null)
throw new SQLException("SQL語句不正確");
// 預(yù)處理語句
PreparedStatement preStatement = connection.prepareStatement(sql);
// SQL指定參數(shù)值
fillStatement(preStatement, args);
// 結(jié)果集
ResultSet rs = preStatement.executeQuery();
// 結(jié)果處理規(guī)范
T result = rsh.handle(rs);
// 資源關(guān)閉
this.close(connection, preStatement, rs);
return result;
}
調(diào)用上面方法時(shí),傳遞一條 SQL 語句,傳遞一個(gè)實(shí)現(xiàn)了 ResultSetHandler 接口的對(duì)象(此對(duì)象提供方法完成數(shù)據(jù)映射工作)就可以了。
我們編寫的模板方法與 Hibernate 相比較:
- Hibernate 會(huì)自動(dòng)構(gòu)建生成 SQL 語句。復(fù)雜的 SQL 也不是問題;
- 自動(dòng)完成了關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)到 Java 對(duì)象的封裝。
所以說Hibernate 是一個(gè)全自動(dòng)化的 ORM 持久化框架。
當(dāng)然 Hibernate 可不僅只完成數(shù)據(jù)庫數(shù)據(jù)的訪問,還會(huì)考慮性能、事務(wù)等生產(chǎn)環(huán)境中的諸多現(xiàn)實(shí)問題,這些會(huì)在本課程后面慢慢展開。
7. 學(xué)習(xí)基礎(chǔ)
學(xué)習(xí) Hibernate 分 2 個(gè)層次:
- 把 Hibernate 當(dāng)成一個(gè)工具, 掌握其應(yīng)用。只需要學(xué)習(xí)者具有一定的 JAVA 基礎(chǔ)知識(shí)即可;
- 了解 Hibernate 底層運(yùn)行機(jī)制,對(duì)其運(yùn)行過程進(jìn)行調(diào)優(yōu),則需要學(xué)習(xí)者具有反射、網(wǎng)絡(luò)編程、多線程等相關(guān)知識(shí)的儲(chǔ)備。
8. 小結(jié)
好了!到了總結(jié)時(shí)間:
本章節(jié)幫助大家初步了解 Hibernate 框架的作用。和原生態(tài)Jdbc 操作相比較,可發(fā)現(xiàn) Hibernate 解決了 Jdbc 操作中的 SQL 語句生成問題、關(guān)系數(shù)據(jù)庫中數(shù)據(jù)自動(dòng)映射問題。
Hibernate通過提供統(tǒng)一的接口方式讓用戶以面向?qū)ο蟮姆绞酵该鞯?、?jiǎn)單地使用Jdbc連接數(shù)據(jù)庫。
讓開發(fā)者從繁瑣無太多技術(shù)含量的編碼中解脫出來,用更多的心思和時(shí)間完成核心業(yè)務(wù)邏輯。