Hibernate 初體驗(yàn)之持久化對(duì)象
1. 前言
本節(jié)課程讓我們一起體驗(yàn) Hibernate 的魅力!編寫第一個(gè)基于 Hibernate 的實(shí)例程序。
在本節(jié)課程中,你將學(xué)到 :
- Hibernate 的版本發(fā)展史;
- 持久化對(duì)象的特點(diǎn)。
為了更好地講解這個(gè)內(nèi)容,這個(gè)初體驗(yàn)案例分上下 2 個(gè)章節(jié)來(lái)講解。
2. Hibetnate 體系結(jié)構(gòu)

如圖可知,應(yīng)用程序可以通過(guò) Hibernate 為用戶提供的接口 API 通知 Hibernate 內(nèi)部組件對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)進(jìn)行一系列操作。
在操作之前,先做些準(zhǔn)備工作。
3. 使用 Hibernate 編寫第一個(gè)程序
3.1 持久化對(duì)象
Hibernate 是以 Java 面向?qū)ο缶幊痰姆绞讲僮鲾?shù)據(jù)庫(kù)。使用之前先要定義一個(gè)對(duì)象,這個(gè)對(duì)象叫持久化對(duì)象。
為什么叫持久化對(duì)象?不急!一步步來(lái),慢慢掀起它神秘面紗。
先一起來(lái)看看這個(gè)持久化對(duì)象的定義。這個(gè)所謂的持久化對(duì)象長(zhǎng)得和普通的 Java 對(duì)象沒(méi)有什么不同:
文章中淡化了對(duì)象和類的區(qū)別。
public class Student {
//學(xué)生編號(hào)
private Integer stuId;
//學(xué)生姓名
private String stuName;
//此處省略其它屬性……
public Student(){
super();
}
public Student(Integer stuId,String stuName){
this.stuId=stuId;
this.stuName=stuName;
//省略代碼……
}
//省略各種get set方法
}
關(guān)于這個(gè)對(duì)象定義有幾點(diǎn)需要說(shuō)明:
- 這個(gè)類的結(jié)構(gòu)需要對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)中某一張表的表結(jié)構(gòu);
- 可用類中的屬性封裝表中對(duì)應(yīng)字段數(shù)據(jù)(數(shù)據(jù)類型保持一致);
- 所有屬性提供 get 和 set 方法,類定義中提供一個(gè)無(wú)參的構(gòu)造方法。且不要在這個(gè)類中提供任何業(yè)務(wù)邏輯代碼。是的!這是一個(gè)符合 JavaBean 規(guī)范的普通 Java 類(POJO)。
你定義的,你心里知道。但是,Hibernate 不知道這個(gè)類是干嘛用!
所以,你必須通過(guò)元數(shù)據(jù)說(shuō)明告訴 Hibernate:
- 這個(gè)類結(jié)構(gòu)對(duì)應(yīng)那個(gè)表結(jié)構(gòu)
- 這個(gè)類的屬性對(duì)應(yīng)表中的那個(gè)字段(還需附加類型說(shuō)明等 N 多信息)
加上元數(shù)據(jù)說(shuō)明,這樣,Hibernate 就能夠使用這個(gè)對(duì)象操作數(shù)據(jù)中的數(shù)據(jù)了!
智能化是有前提條件的!Hibernate 再聰明也需要指引!
此時(shí)這個(gè) POJO (普通 Java 類 POJO : Plain Ordinary Java Object,不包含業(yè)務(wù)邏輯代碼的值對(duì)象)對(duì)象可換上一個(gè)更貼切的名字:持久化對(duì)象(PO:persistent object)。
你也應(yīng)該要小結(jié)一下: PO = POJO + 元數(shù)據(jù)說(shuō)明
此處稍加提醒下,元數(shù)據(jù)說(shuō)明方法有兩種:
- XML;
- 注解。
3.2 XML 映射
現(xiàn)在流行使用注解方式告訴 Hibernate 你操作的對(duì)象對(duì)應(yīng)數(shù)據(jù)庫(kù)中的那張表及更多關(guān)聯(lián)信息。
對(duì) XML 映射大家也需要了解一下,萬(wàn)一你以后工作的企業(yè)里有一群懷舊的叔叔呢!
本章節(jié)中的案例使用 XML 映射方式,后面的內(nèi)容講解還是要跟上潮流,使用注解方式。
命名為 Student.hbm.xml 文件中部分內(nèi)容如下 (完整的文檔結(jié)構(gòu)說(shuō)明可查看官方文檔):
<Hibernate-mapping>
<class name="com.po.Student" table="student" schema="scott" >
<id name="stuId" type="java.lang.Integer">
<column name="stuId" precision="11" scale="0" />
<generator class="increment"></generator>
</id>
<property name="stuName" type="java.lang.String">
<column name="stuName" length="20" unique="true" />
</property>
<!--其它屬性映射-->
</class>
</Hibernate-mapping>
上面這個(gè) XML 文件中的內(nèi)容,語(yǔ)義上非常明確。為了加深理解,再解釋一下 Xml 中相應(yīng)元素:
- class: 類與表的映射關(guān)系;
- id: 類中的那個(gè)屬性對(duì)應(yīng)表中的主鍵字段,只能有一個(gè)。這個(gè)屬性也可叫做標(biāo)識(shí)屬性。
- property: 通過(guò)子元素 column 一起說(shuō)明類中的其它屬性分別對(duì)應(yīng)表中的那個(gè)字段,可以有多個(gè)。
通過(guò) XML 元素屬性或子元素所提供的附加信息越多,就可以讓 Hibernate 清晰地明白自己的任務(wù),否則某些環(huán)節(jié)它就要靠猜了!
編碼規(guī)范提示: 盡可能保持 Java 類中屬性命名和表中字段命名相同!
有了前面的工作。已經(jīng)足夠讓 Hibernate 在進(jìn)入數(shù)據(jù)庫(kù)系統(tǒng)時(shí)生成正確的 SQL 語(yǔ)句,也足夠讓 Hibernate 把從數(shù)據(jù)庫(kù)中帶出來(lái)的數(shù)據(jù)映射成正確 Java 對(duì)象。
4. 主配置文件
何謂主配置文件?其作用是什么?
一句話概括:為 Hibetnater 的數(shù)據(jù)庫(kù)操作工作做行程計(jì)劃。
如:
- 指定訪問(wèn)的具體數(shù)據(jù)庫(kù),串門可別竄岔了;
- 操作時(shí)依賴的映射文件在那里;
- 在操作過(guò)程其它一系列設(shè)置安排。
也可以說(shuō),開發(fā)者可以通過(guò)此文檔和 Hibernate 的內(nèi)部組件進(jìn)行互動(dòng)。 Hibetnate.cfg.xml 是主配置文件的默認(rèn)命名,當(dāng)然,你可以改成其它名稱!
好吧,現(xiàn)在通過(guò)此文件告訴 Hibernate 兩個(gè)信息:
- 你要遠(yuǎn)行的地方叫 MySql (本課程選用 MySql 為項(xiàng)目數(shù)據(jù)庫(kù));
- 你要依賴的映射文件叫 Student.hbm.xml。
<hibernate-configuration>
<session-factory>
<!-- 訪問(wèn)MySql數(shù)據(jù)庫(kù)的基本連接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property : name="connection.url">jdbc:mysql://localhost:3306/myhibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">abc123</property>
<!— 數(shù)據(jù)庫(kù)連接池會(huì)在后面講解,這里先給自己一個(gè)預(yù)習(xí)機(jī)會(huì)-->
<property name="connection.pool_size">1</property>
<!-- SQL 方言 -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- 是否顯示Hibetnate自動(dòng)生成的SQL語(yǔ)句 -->
<property name="show_sql">true</property>
<!—映射文件的位置-->
<mapping resource="com/mk/po/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
文件中的內(nèi)容一目了然,有幾點(diǎn)需要強(qiáng)調(diào)說(shuō)明:
-
數(shù)據(jù)源的目的是告訴 Hibetnate 去哪家關(guān)系數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)。配置時(shí)一般會(huì)涉及到數(shù)據(jù)庫(kù)連接池,可先作為自己預(yù)習(xí)內(nèi)容,此章節(jié)不講;
-
dialect 方言如同大家都講普通話,因出生地區(qū)域不同,普通話中或多或少都會(huì)有本地方言。SQL 是關(guān)系數(shù)據(jù)系統(tǒng)的統(tǒng)一語(yǔ)言,每一種具體的關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品中的 SQL 語(yǔ)句也有稍許差異性。此處告訴 Hibetnate 在生成 SQL 語(yǔ)句時(shí)要入鄉(xiāng)隨俗,注意語(yǔ)法上的細(xì)節(jié)差異;
-
其它配置內(nèi)容可根據(jù)開發(fā)過(guò)程的需求逐一添加。
其實(shí)不難,如果你覺得難,對(duì)于想讓你工作變得簡(jiǎn)單的 Hibernate 而言就會(huì)覺得很傷心!
當(dāng)然,你也不能指望 Hibetnate 是你心里的蛔蟲,在 Hibernate 工作之前與之交流環(huán)節(jié)是必不可少的。
5. 小結(jié)
本節(jié)課內(nèi)容先講到這里!知識(shí)需要消化時(shí)間。
本節(jié)課程,讓大家了解了 Hibernate 進(jìn)行數(shù)據(jù)庫(kù)操作的關(guān)鍵是什么!在心里反復(fù)地默念一下:
持久化對(duì)象是一個(gè) Java 對(duì)象牽手元數(shù)據(jù)說(shuō)明信息,目的是幫助 Hibernate 明白進(jìn)入數(shù)據(jù)庫(kù)系統(tǒng)的任務(wù)(生成增、刪、改、查相應(yīng)操作的 SQL 語(yǔ)句)、以及正確完成數(shù)據(jù)(關(guān)系型數(shù)據(jù))到數(shù)據(jù)(Java OOP 數(shù)據(jù))的映射。
姚文老師 ·
2025 imooc.com All Rights Reserved |