1. Hibernate 概述
1.1. Hibernate 是什麼
百度百科:
Hibernate是一個開放源代碼的 對象關系映射 架構,它對JDBC進行了非常輕量級的 對象封裝 ,它将 POJO 與 資料庫表 建立映射關系,是一個 全自動的orm架構 ,hibernate可以 自動生成SQL語句,自動執行,使得Java程式員可以随心所欲的使用對象程式設計思維來操縱資料庫。
Hibernate可以應用在任何使用JDBC的場合,既可以在Java的用戶端程式使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的JaveEE架構中取代CMP,完成資料持久化的重任。
總結:
Hibernate是一個基于ORM的持久層架構,使用POJO來操作資料庫。
1.2. ORM 是什麼
百度百科:
對象關系映射(Object Relational Mapping,簡稱ORM)是通過使用描述對象和資料庫之間映射的中繼資料,将面向對象語言程式中的對象自動持久化到關系資料庫中。本質上就是 将資料從一種形式轉換到另外一種形式 。這也同時暗示着額外的執行開銷;然而,如果ORM作為一種中間件實作,則會有很多機會做優化,而這些在手寫的持久層并不存在。更重要的是用于控制轉換的中繼資料需要提供和管理;但是同樣,這些花費要比維護手寫的方案要少;而且就算是遵守ODMG規範的對象資料庫依然需要類級别的中繼資料。
總結:
ORM是Object Relational Mapping的縮寫,ORM就是在操作資料庫之前,先将實體類與資料庫表的關系建立起來, 通過操作實體類的對象來操作資料庫 。
1.3. ORM 的作用是什麼
ORM是一套基于對象操作資料庫的理念(規範),其主要作用就是為了實作不用寫SQL語句,通過對象操作資料庫。
1.4. Hibernate 的作用是什麼
既然Hibernate是一個基于ORM理念實作的持久層架構。那麼它的作用就是,為了實作使用對象操作資料庫。
1.5. Hibernate 的應用場景是什麼
[1] 在所有使用JDBC的場景都可以使用Hibernate。
[2] 編寫一套相容多種資料庫的持久層代碼。我們知道各種資料庫的SQL語言和SQL标準是有差異的,而Hibernate實作了各種主流資料庫的方言,隻要開發人員嚴格根據Hibernate規範編寫代碼,可以實作編寫一套代碼,相容多種資料庫。
總結:
在一些需要支援多種資料庫的産品型項目,使用Hibernate可以減少持久層的代碼的編寫。
2. Hibernate 入門
2.1. 配置流程圖
通過架構的配置流程圖,可以快速了解架構的必須要素。如下:

答:因為需要一個配置檔案,來存儲Hibernate架構的架構資訊。如果沒有配置檔案隻能将這些資訊寫在類裡面。配置資訊寫在類裡面,編譯後就不能修改了,靈活性差。問題2:為什麼需要一個映射檔案?
答:因為Hibernate是一個ORM架構,是以需要先建立實體類與表的關系後,然後才可以通過實體類的對象操作資料庫。是以必須要有建立關系的映射檔案。
2.2. 配置步驟
根據以上配置流程圖。我們可以得出配置步驟為:
1. 導入依賴
2. 建立一個配置檔案
3. 建立一個獲得操作對象(Session)的工具類
4. 建立表的實體類
5. 建立映射關系檔案
6. 加載映射檔案
7. 實體操作(插入資料)
2.3. Hibernate壓縮檔案說明
上Hibernate官網下載下傳Hibernate壓縮包,壓縮包内容如下。
3. 入門示例
3.1. 需求
使用Hibernate架構,插入一條資料到學生表裡面。
3.2. 準備:資料庫腳本
CREATE TABLE `tb_student` (
`student_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '學生編号',
`student_name` VARCHAR(50) NOT NULL COMMENT '學生名',
`student_pwd` VARCHAR(50) NOT NULL COMMENT '密碼',
`student_status` INT(11) NOT NULL COMMENT '學生狀态',
`create_date` DATETIME NOT NULL COMMENT '建立日期',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB;
3.3. 配置步驟
第一步:建立項目導入包
方式一:導入jar包
建立一個普通java項目,将Hibernate的zip壓縮包的lib/required所有jar包加入到項目,以及mysql驅動包。
方式二:導入Maven依賴(推薦方式)
建立一個Maven項目,在POM檔案中添加以下依賴。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-agroal</artifactId>
<version>5.3.15.Final</version>
</dependency>
第二步:建立配置檔案
注意事項:隻要提供XML的架構,是必須提供DTD或者Schema規則檔案的。我們需要在IDEA中添加Hibernate子產品,讓開發工具可以生産XML的頭資訊,以及對XML有提示。
添加過程如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 指定會話工廠 -->
<session-factory>
<!--
指定DB連接配接四要素
注意:任何架構的配置參數,都可以在源代碼中找到對應的代碼
-->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 指定顯示SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 配置加載的映射檔案 -->
<mapping resource="hbm/student.hbm.xml" />
</session-factory>
</hibernate-configuration>
第三步:建立HibernateUtils工具類
public
第四步:建立實體類
public
第五步:建立映射檔案
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.brick.pojo.Student" table="tb_student">
<!--
指定主鍵對應關系
問題:為什麼Id字段需要特别設定?
答:由于不同資料庫的ID生成政策是有差異的,所有我們需要手工指定資料庫的ID生成政策
-->
<id name="studentId" column="student_id">
<!--
identity:使用内置的自增長政策
-->
<generator class="identity"/>
</id>
<!--
指定普通屬性的對應關系
-->
<property name="studentName" column="student_name"/>
<property name="studentPwd" column="student_pwd"/>
<property name="studentStatus" column="student_status"/>
<property name="createDate" column="create_date"/>
</class>
</hibernate-mapping>
第六步:測試插入
@Test
通過入門示例,Hibernate果然不用編寫SQL語句,通過實體類對象就可以操作資料庫,驗證了Hibernate是一個全自動的ORM架構。
4. Hibernate主鍵政策
5. HQL入門
5.1. HQL 是什麼
HQL是Hibernate Query Language的縮寫,提供更加豐富靈活、更為強大的查詢能力,HQL非常接近SQL語句查詢文法。問題:Hibernate不是号稱不寫一句SQL來操作資料庫的嗎?為什麼Hibernate還提供HQL供我們使用?
Hibernate在需求不怎麼多變的情況,開發效率确實很高,因為SQL語句都交給了架構完成,而應對需求多變的網際網路項目來說,Hibernate就顯得力不從心,因為開發人員根本觸碰不到SQL,因而優化SQL那更是紙上談兵,面對這種問題,Hibernate就提供了HQL給開發人員自行編寫SQL操作資料庫。
5.2. 需求
在入門示例的基礎上修改StudentDAO類,使用HQL操作資料庫。
5.3. 查詢所有資料
@Test
5.4. 統計記錄
@Test
5.5. 模糊查詢
@Test
5.6. 條件删除
@Test
5.7. 條件 更新
@Test