1. Hibernate簡單介紹
Hibernate是一個持久層的ORM(Object Relational Mapping)框架,通過編寫XML映射文件使得Java對象與數(shù)據(jù)庫表產(chǎn)生關聯(lián),并且Hibernate幾乎支持所有的關系型數(shù)據(jù)庫(RDBMS),如MySQL、Oracle等等。

image
2. 配置Hibernate運行環(huán)境
2.1 下載地址:http://hibernate.org/orm/releases/5.2/
2.2 引入所需的jar包
3. 創(chuàng)建表結構
create table t_user(
uid bigint(32) not null auto_increment,
uname varchar(32),
phone varchar(32),
primary key (uid)
);
4. 創(chuàng)建Java對象
public class User
{
private Long uid;
private String uname;
private String phone;
...
}
5. 創(chuàng)建類與表的映射文件(User.hbm.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.hibernate.User" table="t_user">
<id name="uid" column="uid">
<generator class="native"/>
</id>
<property name="uname" column="uname" length="20" type="java.lang.String"/>
<property name="phone" column="phone" length="11" type="java.lang.String"/>
</class>
</hibernate-mapping>
類與表的映射文件標簽介紹
-
<class>將類和表建立映射關系-
name類的全路徑 -
table表名(如果類名和表名一致,可以省略不寫) -
catalog數(shù)據(jù)庫名稱(可以省略不寫)
-
-
<id>將類中的屬性與表中主鍵進行映射-
name類中的屬性 -
column表中字段(如果和name一致,可以省略不寫) -
length指定字段數(shù)據(jù)的長度(如果沒有創(chuàng)建表,最好要指定數(shù)據(jù)長度)
-
<generator>主鍵的生成策略
| 策略 | 描述 |
|---|---|
| increment | 適用于short、int、long作為主鍵,不是使用的數(shù)據(jù)庫的自動增長機制,Hibernate提供的一種增長機制(先查詢到id的最大值+1在作為新的主鍵插入,但是不能再集群環(huán)境或者并發(fā)訪問的情況下使用)。 |
| identity | 適用于short、int、long作為主鍵,但是使用的數(shù)據(jù)庫底層必須有自動增長的機制(如MySQL的auto_increment),而Oracle是沒有的。 |
| sequence | 適用于short、int、long作為主鍵,底層使用的是序列的增長方式,Oracle需要自己創(chuàng)建序列。 |
| uuid | 適用于char、varchar類型作為主鍵(使用的是隨機的字符串作為主鍵) |
| native | 適用于short、int、long作為主鍵,用來自動生成主鍵值;將屬性值設置為native使得Hibernate可以使用identity、sequence等算法根據(jù)底層數(shù)據(jù)庫的情況來創(chuàng)建主鍵(如MySQL使用的idenitiy,Oracle使用的是sequence) |
| assigned | 主鍵的生成不用Hibernate來進行管理,必須手動設置主鍵 |
-
<property>將類中普通的屬性與表中字段進行映射-
name類中的屬性 -
column表中字段 -
length數(shù)據(jù)長度 -
type數(shù)據(jù)類型(需要按照規(guī)則來定義)- Hibernate數(shù)據(jù)類型:
type="string" - Java數(shù)據(jù)類型:
type="java.lang.String" - 數(shù)據(jù)庫的數(shù)據(jù)類型:添加子標簽
<column name="" sql-type="varchar">
- Hibernate數(shù)據(jù)類型:
-
6. 創(chuàng)建Hibernate核心配置文件(hibernate.cfg.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--必須的配置-->
<!--數(shù)據(jù)庫驅動程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--連接數(shù)據(jù)庫URL,后面拼接的上防止讀寫時中文亂碼-->
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hbmdb?useUnicode=true&characterEncoding=utf-8</property>
<!--數(shù)據(jù)庫用戶名-->
<property name="hibernate.connection.username">root</property>
<!--數(shù)據(jù)庫密碼-->
<property name="hibernate.connection.password">123456</property>
<!--數(shù)據(jù)庫方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--可選配置-->
<!--控制臺打印sql日志-->
<property name="hibernate.show_sql">true</property>
<!--打印的日志的時候格式化-->
<property name="hibernate.format_sql">true</property>
<!--通過映射文件自動創(chuàng)建數(shù)據(jù)庫表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置session ,可以通過ThreadLocal存儲-->
<property name="hibernate.current_session_context_class">thread</property>
<!--引入類的映射文件-->
<mapping resource="com/example/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hbm2ddl.auto通過映射文件自動創(chuàng)建數(shù)據(jù)庫表
-
create:每次都會創(chuàng)建一個新的表 -
create-drop:每次都會創(chuàng)建一個新的表,當執(zhí)行結束后刪除 -
update:如果表不存在會創(chuàng)建 -
validate:如果表存在,使用原來的表;同時校驗映射文件與表中的字段是否一致,如果不一致則會報錯
7. 編寫代碼測試保存數(shù)據(jù)
public class JunitTest
{
@Test
public void save()
{
//加載配置文件,默認加載src目錄下的hibernate.cfg.xml,也可以自己指定路徑
Configuration config = new Configuration().configure();
//創(chuàng)建SessionFactory對象
SessionFactory factory = config.buildSessionFactory();
//創(chuàng)建session對象
Session session = factory.openSession();
//開啟事務
Transaction transaction = session.beginTransaction();
try
{
//保存數(shù)據(jù)
User user = new User();
user.setUname("許渺");
user.setPhone("12345678906");
session.save(user);
//提交事務
transaction.commit();
} catch (Exception e)
{
e.printStackTrace();
//出現(xiàn)異常事務回滾
transaction.rollback();
} finally
{
//釋放資源
session.close();
factory.close();
}
}
}
執(zhí)行單元測試

image
查看表中數(shù)據(jù)

image
8. Hibernate常用類描述
Configurationd對象
Configuration對象用于配置并啟動Hibernate框架,獲取SessionFactory對象。
SessionFactory對象
是生成Session對象的工廠類,SessionFactory 是一個線程安全對象并由應用程序所有的線程所使用。
SessionFactory 是一個重量級對象所以通常它都是在應用程序啟動時創(chuàng)造然后留存為以后使用。每個數(shù)據(jù)庫需要一個 SessionFactory 對象使用一個單獨的配置文件。所以如果你使用多種數(shù)據(jù)庫那么你要創(chuàng)造多種 SessionFactory 對象。
Session對象
- Session是在Hibernate中使用最頻繁的接口。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象
- Session 是應用程序與數(shù)據(jù)庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心
- Session是線程不安全的
- 所有持久化對象必須在 session 的管理下才可以進行持久化操作
- Session 對象有一個一級緩存,顯式調用
flush方法之前,所有的持久化操作的數(shù)據(jù)都緩存在 session 對象中 - 持久化類與 Session 關聯(lián)起來后就具有了持久化的能力
Transaction接口
Transaction是處理事務的接口,如提交事務 commit 以及事務回滾 rollback ,Hibernate框架默認事務不自動提交,需要手動提交事務;如果沒有開啟事務,那么每個Session的操作,都相當于一個獨立的事務。

image