Hibernate 學習筆記(一)—— Hibernate 概述和使用 Hibernate 進行簡單的增刪改查操作


Hibernate是一個開放源代碼的對象關系映射框架,它將 POJO與數據庫表建立映射關系,Hibernate 可以自動生成SQL語句,自動執行,完成數據持久化的任務,使得我們方便的使用對象編程思維來操縱數據庫。

一、Hibernate 概述

Hibernate 的API一共有6個接口,分別為:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通過這些接口,可以對持久化對象進行存取、事務控制。

  1. Session:Session接口負責執行被持久化對象的CRUD操作。但需要注意的是Session對象是非線程安全的。
  2. SessionFactory:SessionFactory接口負責初始化Hibernate,並負責創建Session對象。這里用到了工廠模式。SessionFactory並不是輕量級的,所以在一般情況下,一個項目通常只需要一個SessionFactory對象。
  3. Transaction:Transaction 接口是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。
  4. Query:Query接口可以實現對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。
  5. Criteria:Criteria接口與Query接口非常類似,允許創建並執行面向對象的標准化查詢。
  6. Configuration:Configuration 類的作用是對Hibernate 進行配置,以及對它進行啟動。在Hibernate 的啟動過程中,Configuration 類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。

二、創建第一個 Hibernate 項目

2.1、導入 Jar 包

一個簡單的 Hibernate 工程共需要兩類 Jar 包,一種是 Hibernate 所必須使用的 Jar 包,另外一種是數據庫驅動 Jar 包。所需的 Jar 包名稱如下:

  1. Hibernate 必備的 Jar 包
    1. antlr-2.7.7.jar
    2. dom4j-1.6.1.jar
    3. geronimo-jta_1.1_spec-1.1.1.jar
    4. hibernate-commons-annotations-5.0.1.Final.jar
    5. hibernate-core-5.0.7.Final.jar
    6. hibernate-jpa-2.1-api-1.0.0.Final.jar
    7. jandex-2.0.0.Final.jar
    8. javassist-3.18.1-GA.jar
    9. jboss-logging-3.3.0.Final.jar
  2. 數據庫驅動 Jar 包
    1. mysql-connector-java-5.1.47.jar
    2. c3p0-0.9.2.1.jar
    3. hibernate-c3p0-5.0.7.Final.jar
    4. mchange-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();
	}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM