亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Hibernate 初體驗之持久化對象

1. 前言

本節課程讓我們一起體驗 Hibernate 的魅力!編寫第一個基于 Hibernate 的實例程序。

在本節課程中,你將學到 :

  • Hibernate 的版本發展史;
  • 持久化對象的特點。

為了更好地講解這個內容,這個初體驗案例分上下 2 個章節來講解。

2. Hibetnate 體系結構

圖片描述

如圖可知,應用程序可以通過 Hibernate 為用戶提供的接口 API 通知 Hibernate 內部組件對數據庫中數據進行一系列操作。

在操作之前,先做些準備工作。

3. 使用 Hibernate 編寫第一個程序

3.1 持久化對象

Hibernate 是以 Java 面向對象編程的方式操作數據庫。使用之前先要定義一個對象,這個對象叫持久化對象。

為什么叫持久化對象?不急!一步步來,慢慢掀起它神秘面紗。

先一起來看看這個持久化對象的定義。這個所謂的持久化對象長得和普通的 Java 對象沒有什么不同:

文章中淡化了對象和類的區別。

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方法
}  

關于這個對象定義有幾點需要說明:

  • 這個類的結構需要對應關系型數據庫中某一張表的表結構;
  • 可用類中的屬性封裝表中對應字段數據(數據類型保持一致);
  • 所有屬性提供 get 和 set 方法,類定義中提供一個無參的構造方法。且不要在這個類中提供任何業務邏輯代碼。是的!這是一個符合 JavaBean 規范的普通 Java 類(POJO)

你定義的,你心里知道。但是,Hibernate 不知道這個類是干嘛用!

所以,你必須通過元數據說明告訴 Hibernate

  • 這個類結構對應那個表結構
  • 這個類的屬性對應表中的那個字段(還需附加類型說明等 N 多信息)

加上元數據說明,這樣,Hibernate 就能夠使用這個對象操作數據中的數據了!

智能化是有前提條件的!Hibernate 再聰明也需要指引!

此時這個 POJO (普通 Java 類 POJO : Plain Ordinary Java Object,不包含業務邏輯代碼的值對象)對象可換上一個更貼切的名字:持久化對象(PO:persistent object)

你也應該要小結一下: PO = POJO + 元數據說明

此處稍加提醒下,元數據說明方法有兩種:

  • XML;
  • 注解。

3.2 XML 映射

現在流行使用注解方式告訴 Hibernate 你操作的對象對應數據庫中的那張表及更多關聯信息。

XML 映射大家也需要了解一下,萬一你以后工作的企業里有一群懷舊的叔叔呢!

本章節中的案例使用 XML 映射方式,后面的內容講解還是要跟上潮流,使用注解方式。

命名為 Student.hbm.xml 文件中部分內容如下 (完整的文檔結構說明可查看官方文檔):

<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 文件中的內容,語義上非常明確。為了加深理解,再解釋一下 Xml 中相應元素:

  • class: 類與表的映射關系;
  • id: 類中的那個屬性對應表中的主鍵字段,只能有一個。這個屬性也可叫做標識屬性。
  • property: 通過子元素 column 一起說明類中的其它屬性分別對應表中的那個字段,可以有多個。

通過 XML 元素屬性或子元素所提供的附加信息越多,就可以讓 Hibernate 清晰地明白自己的任務,否則某些環節它就要靠猜了!

編碼規范提示: 盡可能保持 Java 類中屬性命名和表中字段命名相同!

有了前面的工作。已經足夠讓 Hibernate 在進入數據庫系統時生成正確的 SQL 語句,也足夠讓 Hibernate 把從數據庫中帶出來的數據映射成正確 Java 對象。

4. 主配置文件

何謂主配置文件?其作用是什么?
一句話概括:為 Hibetnater 的數據庫操作工作做行程計劃。
如:

  • 指定訪問的具體數據庫,串門可別竄岔了;
  • 操作時依賴的映射文件在那里;
  • 在操作過程其它一系列設置安排。

也可以說,開發者可以通過此文檔和 Hibernate 的內部組件進行互動。 Hibetnate.cfg.xml 是主配置文件的默認命名,當然,你可以改成其它名稱!

好吧,現在通過此文件告訴 Hibernate 兩個信息:

  1. 你要遠行的地方叫 MySql (本課程選用 MySql 為項目數據庫);
  2. 你要依賴的映射文件叫 Student.hbm.xml。
<hibernate-configuration>
	<session-factory>
    	<!-- 訪問MySql數據庫的基本連接信息 -->
    	<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>
    	<!— 數據庫連接池會在后面講解,這里先給自己一個預習機會-->
    	<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>

文件中的內容一目了然,有幾點需要強調說明:

  • 數據源的目的是告訴 Hibetnate 去哪家關系數據庫中獲取數據。配置時一般會涉及到數據庫連接池,可先作為自己預習內容,此章節不講;

  • dialect 方言如同大家都講普通話,因出生地區域不同,普通話中或多或少都會有本地方言。SQL 是關系數據系統的統一語言,每一種具體的關系數據庫產品中的 SQL 語句也有稍許差異性。此處告訴 Hibetnate 在生成 SQL 語句時要入鄉隨俗,注意語法上的細節差異;

  • 其它配置內容可根據開發過程的需求逐一添加。

其實不難,如果你覺得難,對于想讓你工作變得簡單的 Hibernate 而言就會覺得很傷心!

當然,你也不能指望 Hibetnate 是你心里的蛔蟲,在 Hibernate 工作之前與之交流環節是必不可少的。

5. 小結

本節課內容先講到這里!知識需要消化時間。

本節課程,讓大家了解了 Hibernate 進行數據庫操作的關鍵是什么!在心里反復地默念一下:

持久化對象是一個 Java 對象牽手元數據說明信息,目的是幫助 Hibernate 明白進入數據庫系統的任務(生成增、刪、改、查相應操作的 SQL 語句)、以及正確完成數據(關系型數據)到數據(Java OOP 數據)的映射。