目錄
Hibernate入門
第一個Hibernate程序
第一步 搭建Hibernate環境
(1)創建一個Java(或Java Web)工程項目;
(2)導入Hibernate的jar包;
注:除此之外,在使用Hibernate的時候,有日誌信息的輸出,而Hibernate本身沒有包含日誌輸出的jar包,需要我們額外導入其他日誌相關的jar(log4j、slf4j-api、slf4j-log4j12);同時還需要mysql驅動的jar包。(這裏圖省事還木有導入日誌相關的包)
第二步 創建實體類
注:使用Hibernate的時候,不需要我們自己手動創建表,Hibernate會幫把表創建出來。
如:User.java
package com.wm103.entity;
public class User {
/*Hibernate要求實體類有一個屬性是唯一的。*/
private int uid;
private String username;
private String password;
private String address;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
第三步 配置實體類合數據庫表一一對應的關係(映射關係)
使用配置文件實現映射關係
(1)創建xml
格式的配置文件
- 映射配置文件名稱和位置沒有固定要求;
- 建議在實體類所在包內創建,名稱爲:實體類名稱.hbm.xml
(2)在配置文件中引入xml約束
- 在Hibernate中引入的約束是dtd約束(約束有dtd和schema格式)
<?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 表示該xml的根標籤。
(3)配置映射關係
如: 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>
<!--
1. 配置類和表對應
class標籤
name屬性:實體類全路徑
table屬性:數據庫中對應表的名稱
-->
<class name="com.wm103.entity.User" table="t_user">
<!--
2. 配置實體類id和表id對應
Hibernate要求實體類有一個屬性唯一值;
Hibernate要求表有字段作爲唯一值。
-->
<!--
id標籤
name屬性:實體類中作爲唯一標識的屬性的名稱
column屬性:生成的表字段名稱
-->
<id name="uid" column="uid">
<!--
設置數據庫表中ID的增長策略
native:生成表的id是主鍵自動增長的。
-->
<generator class="native"/>
</id>
<!--
3. 配置實體類中的其他屬性與表字段對應
property標籤
name屬性:實體類屬性名稱
column屬性:生成表字段名稱
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
第四步 創建Hibernate的核心配置文件
(1)在src目錄下創建Hibernate核心配置文件 hibernate.cfg.xml
核心配置文件的格式爲xml,且文件名稱和位置是固定的。
- 位置:必須在src目錄下面
- 名稱:必須爲hibernate.cfg.xml
(2)爲配置文件引入dtd文件
<?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 表示該xml的根標籤。
注:Hibernate操作過程中,只會加載核心配置文件,其他配置文件不會加載,需要在覈心配置文件中進行設置。
(3)配置hibernate.cfg.xml中的信息
- 配置數據庫信息
<!-- **配置數據庫信息(必須)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
- 配置hibernate信息
<!-- **配置hibernate信息(可選)** -->
<!--
配置數據庫方言,如:
在MySQL中實現分頁功能,需要使用到關鍵字limit,該關鍵字只能在MySQL中使用;
在Oracle數據庫中則使用rownum實現分頁功能。
以下配置是讓Hibernate框架識別不同數據庫各自特有的語句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 輸出底層SQL語句 -->
<property name="format_sql">true</property><!-- 格式化底層SQL語句 -->
<!--
Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
update:如果已存在表,則更新表,如果沒有,則進行創建。
-->
<property name="hbm2ddl.auto">update</property>
- 把映射文件放到核心配置文件中
<!-- **把映射文件放到核心配置文件中(必須)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
如: hibernate.cfg.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>
<!-- **配置數據庫信息(必須)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
<!-- **配置hibernate信息(可選)** -->
<!--
配置數據庫方言,如:
在MySQL中實現分頁功能,需要使用到關鍵字limit,該關鍵字只能在MySQL中使用;
在Oracle數據庫中則使用rownum實現分頁功能。
以下配置是讓Hibernate框架識別不同數據庫各自特有的語句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 輸出底層SQL語句 -->
<property name="format_sql">true</property><!-- 格式化底層SQL語句 -->
<!--
Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
update:如果已存在表,則更新表,如果沒有,則進行創建。
-->
<property name="hbm2ddl.auto">update</property>
<!-- **把映射文件放到核心配置文件中(必須)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
實現數據庫操作
第一步 加載Hibernate核心配置文件
第二步 創建SessionFactory對象
第三步 使用SessionFactory對象創建session對象
第四步 開啓事務
第五步 編寫具體邏輯CRUD操作
第六步 提交事務
第七步 關閉資源
如: HibernateDemo.java
package com.wm103.hibernatetest;
import com.wm103.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
/**
* Created by DreamBoy on 2017/5/19.
*/
public class HibernateDemo {
@Test
public void testAdd() {
// **第一步** 加載Hibernate核心配置文件
// 自動到src下面尋找hibernate.cfg.xml配置進行加載,封裝成對象
Configuration cfg = new Configuration();
cfg.configure();
// **第二步** 創建SessionFactory對象
// 讀取hibernate核心配置文件內容,創建sessionFactory
// 在這個過程中,會根據配置好的映射關係,在對應的數據庫中將表創建出來
SessionFactory sessionFactory = cfg.buildSessionFactory();
// **第三步** 使用SessionFactory對象創建session對象
// 類似JDBC中的Connection對象
Session session = sessionFactory.openSession();
// **第四步** 開啓事務
Transaction tx = session.beginTransaction();
// **第五步** 編寫具體邏輯CRUD操作
User user = new User();
user.setUsername("夢小白");
user.setPassword("123");
user.setAddress("China");
session.save(user);
// **第六步** 提交事務
tx.commit();
// **第七步** 關閉資源
session.close();
sessionFactory.close();
}
}
Hibernate配置文件詳解
Hibernate映射配置文件
- 映射匹配文件的名稱和位置沒有固定的要求,但是一般將該配置文件放置同需要映射的實體類相同的包下;
- 映射配置文件中標籤的name屬性,屬性值與實體類相關,其中:
(1)class標籤的name屬性值爲實體類的全路徑;
(2)id標籤和property標籤的name屬性值爲實體類某個屬性的名稱。 - id標籤和property標籤,column屬性可以省略,不設置,這個時候,column屬性的默認值與name屬性值相同;
- property標籤還有另外一個屬性type屬性,設置生成表字段的類型。不設置該屬性時,Hibernate會根據實體類屬性的類型自動確定表字段的類型。
Hibernate核心配置文件
核心配置文件名稱和位置是固定的,名稱爲hibernate.cfg.xml
,位置在src目錄下。
配置內容以及要求如下:
<?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>
<!-- **配置數據庫信息(必須)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
<!-- **配置hibernate信息(可選)** -->
<!--
配置數據庫方言,如:
在MySQL中實現分頁功能,需要使用到關鍵字limit,該關鍵字只能在MySQL中使用;
在Oracle數據庫中則使用rownum實現分頁功能。
以下配置是讓Hibernate框架識別不同數據庫各自特有的語句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 輸出底層SQL語句 -->
<property name="format_sql">true</property><!-- 格式化底層SQL語句 -->
<!--
Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
update:
-->
<property name="hbm2ddl.auto">create</property>
<!-- **把映射文件放到核心配置文件中(必須)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate的核心API
Configuration
// **第一步** 加載Hibernate核心配置文件
// 自動到src下面尋找hibernate.cfg.xml配置進行加載,封裝成對象
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory(重點)
SessionFactory是一個線程安全的Session工廠類,能爲不同的線程生成不同的Session。SessionFactory維護着Session相關的資源,包括數據庫連接池等、緩存數據等。
1. 通過使用configuration對象來創建SessionFactory對象,在創建過程中,如果核心配置文件配置了自動創建表的功能,如:
<!--
Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
update:
-->
<property name="hbm2ddl.auto">create</property>
,則Hibernate會根據核心配置文件中的數據庫和映射文件的配置,根據映射關係,在數據庫中創建對應的表。
2. 創建sessionFactory對象過程中,非常耗資源(因爲Hibernate需要檢查實體類與數據庫中表的映射情況,甚至需要創建或更新表)。因此**在Hibernate操作中,建議一個項目一般只創建一個sessionFactory對象。
實現方式如下:
(靜態代碼快在類加載時執行,且執行一次。)
package com.wm103.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Created by DreamBoy on 2017/5/19.
*/
public class HibernateUtil {
// 單態模式的SessionFactory
private static final SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
使用:
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session(重點)
- 這裏的session對象類似於JDBC中的Connection對象;
- 調用session對象中的不同方法可以實現CRUD操作:
(1)添加:save方法;
(2)修改:update方法;
(3)刪除:delete方法;
(4)查詢:根據id查詢的get方法; - session對象
Session是應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate運作的中心,它的主要功能是爲持久化對象提供創建、讀取和刪除的能力,所有持久化對象必須在session的管理下纔可以進行持久化操作。
Session代表用戶的一次操作。Session的生命週期很短,在操作開始時通過SessionFactory.openSession()生成,在操作結束時通過執行session.close()
關閉。Session維護着Session相關的資源,包括Transaction、當前數據庫連接等。
Session是線程不安全的,多個併發線程同時操作一個Session實例時,就可能導致Session數據存取的混亂(方法內部定義和使用Session時,不會出現線程問題)。因此設計軟件架構時,應避免多個線程共享一個Session實例。同時它也是輕量級的,實例的創建和銷燬不需要消耗太多的資源。它還有一個緩存,即Hibernate的一級緩存,這個緩存主要用於存放當前工作單元加載的對象。
Transaction
- 開啓事務
Transaction tx = session.beginTransaction();
- 事務的提交和回滾
tx.commit();
tx.rollback();
- 事務的特性
- 原子性
- 一致性
- 隔離性
- 持久性