Hibernate是一個開放源代碼的對象關系映射框架,它將 POJO與數據庫表建立映射關系,Hibernate 可以自動生成SQL語句,自動執行,完成數據持久化的任務,使得我們方便的使用對象編程思維來操縱數據庫。
一、Hibernate 概述
Hibernate 的API一共有6個接口,分別為:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通過這些接口,可以對持久化對象進行存取、事務控制。
- Session:Session接口負責執行被持久化對象的CRUD操作。但需要注意的是Session對象是非線程安全的。
- SessionFactory:SessionFactory接口負責初始化Hibernate,並負責創建Session對象。這里用到了工廠模式。SessionFactory並不是輕量級的,所以在一般情況下,一個項目通常只需要一個SessionFactory對象。
- Transaction:Transaction 接口是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。
- Query:Query接口可以實現對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。
- Criteria:Criteria接口與Query接口非常類似,允許創建並執行面向對象的標准化查詢。
- Configuration:Configuration 類的作用是對Hibernate 進行配置,以及對它進行啟動。在Hibernate 的啟動過程中,Configuration 類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。
二、創建第一個 Hibernate 項目
2.1、導入 Jar 包
一個簡單的 Hibernate 工程共需要兩類 Jar 包,一種是 Hibernate 所必須使用的 Jar 包,另外一種是數據庫驅動 Jar 包。所需的 Jar 包名稱如下:
- Hibernate 必備的 Jar 包
antlr-2.7.7.jardom4j-1.6.1.jargeronimo-jta_1.1_spec-1.1.1.jarhibernate-commons-annotations-5.0.1.Final.jarhibernate-core-5.0.7.Final.jarhibernate-jpa-2.1-api-1.0.0.Final.jarjandex-2.0.0.Final.jarjavassist-3.18.1-GA.jarjboss-logging-3.3.0.Final.jar
- 數據庫驅動 Jar 包
mysql-connector-java-5.1.47.jarc3p0-0.9.2.1.jarhibernate-c3p0-5.0.7.Final.jarmchange-commons-java-0.2.3.4.jar
2.2、編寫實體類
創建用戶(User) 實體類,其中包含用戶名、密碼、昵稱、出生日期等基本信息。
package com.hibernate.domain;
import java.util.Date;
public class User {
private Integer uid;
private String username;
private String password;
private String nickname;
private Date birthday;
private String realname;
public Integer getUid() {
return uid;
}
public void setUid(Integer 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 getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", nickname=" + nickname
+ ", birthday=" + birthday + ", realname=" + realname + "]";
}
}
2.3、編寫Hibernate和實體類配置文件
2.3.1、編寫 Hibernate 配置文件 —— hibernate.cfg.xml
Hibernate 的配置文件默認編寫位置是在工程項目的 src 下,在配置文件中,主要配置 session-factory ,用於創建 Session 對象,以便對 POJO 進行增刪改查的操作。
在 session-factory 中,主要配置數據庫的配置信息、連接池供應商以及實體類映射文件的位置。
<?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>
<!-- 配置 SessionFactory 用於創建 Session 對象 -->
<session-factory>
<!-- 數據庫的配置信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可選配置 -->
<property name="hibernate.show_sql">true</property>
<!-- <property name="hibernate.format_sql">true</property> -->
<!-- 配置 Hibernate 以何種方式生成DDL語句 update:表示檢測實體類的映射配置和數據庫表結構是否一致,不一致則自動更新
auto: -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置 Session 綁定本地線程 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 設置連接池供應商 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 配置實體類的映射文件位置 -->
<mapping resource="com/one_to_many/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
2.3.2、編寫實體類配置文件 —— User.hbm.xml
實體類映射文件則是編寫在與實體類相同的包下面,命名通常以 實體類名稱.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">
<!-- package:配置實體類所在的包名稱 -->
<hibernate-mapping package="com.hibernate.domain">
<!--
class標簽,對應實體類
name:實體類的名稱,如果配有配置package屬性,需要寫類的絕對路徑
table:對應數據庫中的表名稱
-->
<class name="User" table="tb_user">
<!--
id:數據庫表中的主鍵
id,property
name:實體類的屬性名稱
column:實體類屬性對應數據庫表中的列名稱
-->
<id name="uid" column="user_id">
<!-- generator:表主鍵的生成策略 -->
<generator class="native"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="nickname" column="nickname"></property>
<property name="birthday" column="birthday"></property>
<property name="realname" column="realname"></property>
</class>
</hibernate-mapping>
2.3.3、編寫 Hibernate 工具類,獲取 Session 對象
package com.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
// 使用靜態代碼塊來創建 SessionFactory 對象,保證單例
private static SessionFactory sessionFactory;
static {
// 創建 Configuration 對象
Configuration cfg = new Configuration();
// 加載 Hibernate 默認配置文件,如果配置文件不在 src 目錄下,則需要填寫配置文件地址
cfg.configure();
// 根據配置文件,創建 SessionFactory 對象
sessionFactory = cfg.buildSessionFactory();
}
public static Session openSession() {
// 獲取 session 對象
return sessionFactory.openSession();
}
public static Session getCurrentSession() {
// 獲取與當前線程綁定的 session 對象
return sessionFactory.getCurrentSession();
}
}
2.3.4、測試工具類
package com.hibernate.test;
import org.hibernate.Session;
import org.junit.Test;
import com.hibernate.utils.HibernateUtil;
public class TestHibernateUtil {
@Test
public void test() {
Session session = HibernateUtil.openSession();
}
}
如果測試類運行成功,則在 Hibernate 配置中所連接的數據庫中就會出現 tb_user 表。
三、簡單的增刪改查操作
3.1、保存操作
使用 Hibernate 保存數據,只需要調用 session 的 save() 方法,即可將 POJO 保存到數據庫中。
package com.hibernate.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testSave() {
// 獲取 session 對象
Session session = HibernateUtil.openSession();
// 獲取 Transaction 對象
Transaction tx = session.beginTransaction();
// 開啟事務
tx.begin();
try {
User user = new User();
user.setUsername("martin_depp@126.com");
user.setPassword("martin0319");
user.setNickname("奔跑的小螞蟻");
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("1991-03-19 11:55:00"));
user.setRealname("孟祥傑");
// 調用 session 對象的 save() 實現數據的持久化操作
session.save(user);
} catch (ParseException e) {
e.printStackTrace();
} finally {
// 提交事務
tx.commit();
// 關閉 session
session.close();
}
}
}
3.2、查找操作
使用 Hibernate 進行查找,只需要調用 session 的get(Class<T> arg0, Serializable arg1) 方法,其中 arg0 表示對應實體類名稱,arg1表示主鍵值,如:查詢主鍵為1的 User 實體對象。
package com.hibernate.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testGet() {
// 獲取 session 對象
Session session = HibernateUtil.openSession();
// 獲取 Transaction 對象
Transaction tx = session.beginTransaction();
// 開啟事務
tx.begin();
// 此時需要注意所查詢實體類主鍵的類型,如果是Long類型,最好為1L
User user = session.get(User.class, 1);
// 輸出結果:
// User [uid=1, username=martin_depp@126.com, password=martin0319, nickname=奔跑的小螞蟻, birthday=1991-03-19 11:55:00.0, realname=孟祥傑]
System.out.println(user);
// 提交事務
tx.commit();
// 關閉 session
session.close();
}
}
3.3、更新操作
使用 Hibernate 更新數據,只需要調用 session 的 update() 方法,即可將 POJO 數據更新到數據庫中。
package com.hibernate.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testUpdate() {
// 獲取 session 對象
Session session = HibernateUtil.openSession();
// 獲取 Transaction 對象
Transaction tx = session.beginTransaction();
// 開啟事務
tx.begin();
User user = session.get(User.class, 1);
user.setUsername("mengxiangjie2005@126.com");
session.update(user);
// 提交事務
tx.commit();
// 關閉 session
session.close();
}
}
3.4、刪除操作
使用 Hibernate 保存數據,只需要調用 session 的 delete() 方法,即可將 POJO 從數據庫中刪除。
package com.hibernate.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.hibernate.domain.User;
import com.hibernate.utils.HibernateUtil;
public class TestHibernate {
@Test
public void testDelete() {
// 獲取 session 對象
Session session = HibernateUtil.openSession();
// 獲取 Transaction 對象
Transaction tx = session.beginTransaction();
// 開啟事務
tx.begin();
User user = session.get(User.class, 1);
session.delete(user);
// 提交事務
tx.commit();
// 關閉 session
session.close();
}
}
}
