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