1. 程式人生 > >Hibernate的核心配置檔案和API

Hibernate的核心配置檔案和API

一,核心配置檔案

1,Hibernate的對映檔案*.hbm.xml

基本結構:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 對映檔案的dtd資訊 -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    
<hibernate-mapping>
	<!--name 代表的是實體類名 table代表的是表名  -->
	<class name="XXX" table="xxx">
		<!-- name=id 代表i的是XXX類中的屬性 column=id代表的是xxx表中的欄位 -->
		<id name="id" column="id">
			<generator class="native"/> <!-- 主鍵生成策略 -->
		</id>
		<!-- 其他屬性使用property標籤來對映 -->
		<property name="password" column="password" type="string"/>
	</class>
	
</hibernate-mapping>
hibernate-mapping:該元素定義了XML配置檔案的基本屬性,他所定義的屬性在對映檔案的所有節點都有效

class:該元素用來宣告一個持久化類,他是XML配置檔案的主要內容

id:該元素用來設定持久化類的OID(物件識別符號)和表的主鍵的對映

property:該元素用來將持久化類中的普通屬性對映到資料庫表對應的欄位上

2,hibernate的配置檔案hibernate.cfg.xml

 基本結構:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 配置檔案的dtd資訊 -->
<!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>
		<!-- 指定方言 -->
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<!-- 資料庫驅動 -->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<!-- 連線資料庫的地址 -->
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/hibernate
		</property>
		<!--  使用者名稱-->
		<property name="hibernate.connection.username">
			root
		</property>
		<!-- 密碼 -->
		<property name="hibernate.connection.password">
			itcast
		</property>
		<!-- 其他配置 -->
		<!-- 顯示sql語句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化sql語句 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 關聯hbm配置檔案 -->
		<mapping resource="com/itcast/domain/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
 Hibernate配置檔案常用屬性及用途:
名  稱 用       途            
hibernate.dialect 操作資料庫方言
hibernate.connection.driver_class 連線資料庫驅動程式
hibernate.connection.url 連線資料路URL
hibernate.connection.username 資料庫使用者名稱
hibernate.connection.password 資料庫密碼
hibernate.show_sql 在控制檯上輸出SQL語句
hibernate.format_sql 格式化控制檯輸出的SQL語句
hibernate.hbm2ddl.auto

當SessionFactory建立時是否根據對映檔案自動驗證表結構或自動建立,

自動更新資料庫表結構。該引數的取值為validate,update,create和create-drop

hibernate.connection.autocommit 事物是否自動提交

二,Hibernate的核心API

 在Hibernate中有6個常用的核心介面,分別是Configuration,SessionFactory,Session,Transaction,Query,Criteria

1,Configuration

 在使用Hibernate時,首先要載入Configuration例項,Configuration例項主要用於啟動, 載入,管理hibernate的配置檔案。在啟動Hibernate的過程中,Configuration例項首先確定 Hibernate配置檔案的位置,然後讀取相關配置,最後建立一個唯一的SessionFactory例項。 Configuration物件只存在於系統初始化階段,它將SessionFactory建立完成後,就完成了使命  Hibernate通常使用Configuration config = new Configuration().configure();的方式 建立例項,此種方式預設會去src下讀取hibernate.cfg.xml配置檔案。如果不想使用預設的配置 檔案,而是使用指定目錄下的自定義的配置檔案,則需要向configure()方法中傳入一個檔案路徑 引數,程式碼如下:
Configuration config = new Configuration().configure("xml檔案位置");

2,SessionFactory

 SessionFactory介面負責Hibernate的初始化和建立Session物件。它在Hibernate中起到一個緩衝區的 作用,Hibernate可以將自動生成的SQL語句,對映資料以及某些可重複利用的資料放在這個緩衝區中。同時 它還儲存了對資料庫配置的所有對映關係,維護了當前的二級快取。  獲取方法為:
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory具有以下特點:
  • 它是執行緒安全的,它的同一個例項能夠供多個執行緒共享
  • 它是重量級的,不能隨意地建立和銷燬它的例項
由於這些特點,一般情況下,一個專案中只需要一個SessionFactory,只有當應用中存在多個數據源時,才為每個 資料來源建立一個SessionFactory例項。因此在實際專案中,通常會抽取一個HibernateUtils的工具類,用來提供 Session物件:
public class HibernateUtils {
	//宣告一個私有靜態final型別的Configuration物件
	private static final Configuration config;
	//宣告一個私有靜態final型別的SessionFactory物件
	private static final SessionFactory factory;
	//通過靜態程式碼塊構建SessionFactory
	static{
		config = new Configuration().configure();
		factory = config.buildSessionFactory();
	}
	//提供一個共有靜態方法供外部獲取,並返回一個Session物件
	public static Session getSession(){
		return factory.openSession();
	}
}

 通過這個工具類,在專案可以直接通過HIbernateUtils.getSession()方式獲取Session物件

3,Session

Session是應用程式與資料庫之間互動操作的一個單執行緒物件,是Hibernate運作的中心,它的主要作用是為 持久化物件提供建立,讀取和刪除等功能,所有持久化物件必須在Session管理下才可以進行持久化操作  建立SessionFactory例項後,就可以通過它獲取Session物件。獲取Session有兩種方法,如下:
 Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
第一種方法在建立例項時SessionFactory直接建立一個新的Session例項,並且在使用完後需要呼叫 close方法進行手動關閉  第二種方法建立的例項會被繫結到當前執行緒中,它在提交或回滾操作時會自動關閉
Session是執行緒不完全的,多個併發執行緒同時操作一個Session時,就可能造成資料存取混亂(方法內部 定義和使用Session時不會出現執行緒問題)。因此,因避免多個執行緒同時使用一個Session 在Session中提供了大量的常用方法:
  • save(),update()和saveOrUpdate()方法:用於增加和修改物件
  • delete()方法:用於刪除物件
  • get() 和load()方法:根據主鍵查詢
  • createQuery() 和createSQLQuery()方法:用於資料庫操作物件
  • createCriteria()方法:條件查詢

4,Transaction

Transaction介面主要用於管理事物,它是Hibernate的資料庫事物介面,且對底層的事物介面進行了封裝。Transaction 介面的事物物件是通過Session物件開啟的,其開啟方式:
Transaction t = session.beginTransaction();

在Transaction介面,提供了事務管理的常用方法:
  •  commit()方法:提交相關聯的Session例項
  •  rollback()方法:撤銷事物操作
  •  wasCommitted()方法:檢查事物是否提交
Session執行完資料庫操作後,要使用Transaction介面的commit方法進行事物提交,才能真正將資料同步 到資料庫中。發生異常時,需要使用rollback進行事物回滾,以避免資料發生錯誤。

5,Query

 Query代表面向物件的一個Hibernate查詢操作。在Hibernate中,通常使用session.createQuery()方法 接受一個HQL語句。然後呼叫Query的list()或uniqueResult()方法執行查詢。  在Hibernate中使用Query物件的步驟:
(1)獲得hibernate session 物件 (2)編寫HQL語句 (3)呼叫session.createQuery建立查詢物件 (4)如果HQL語句包含引數,則呼叫Query的setXxx設定引數 (5)呼叫Query物件的list()或uniqueResult()方法執行查詢 下面同過一個案例來說明  在上個入門案例的專案下的com.itcast.test包下新建一個類QueryTest.java 入門案例連結
package com.itcast.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.itcast.domain.User;

public class QueryTest {
	@Test
	public void findAll_hqlTest(){
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction t = session.beginTransaction();
		String hql = "from User";
		Query query = session.createQuery(hql);
		List<User>list= query.list();
		for(User user:list){
			System.out.println(user);
		}
		t.commit();
		session.close();
		sessionFactory.close();
	}
	
}
使用Junit測試該方法
資料庫中的資料:
控制檯輸出的資料:
Query中除了使用list方法查詢全部資料外,還有一些常用方法:
  • setter方法:Query介面中提供了一系列的setter方法用於設定查詢語句中的引數,針對
  不同的資料型別,需要用到不同的setter方法
  • iterator方法:該方法用於查詢語句,該方法返回一個Iterator物件,在讀取時只能按照順序方法讀取,它
 僅把使用到的資料轉換成java實體物件
  • uniqueResult方法:該方法用於返回唯一結果,在確保只有一條記錄的查詢時可以使用該方法
  • executeUpdate方法:該方法是Hibernate3的新特性,它支援HQL語句的更新和刪除操作
  • setFirstResult方法:該方法可以設定獲取第一個記錄的位置,也就是它表示從第幾條記錄開始查詢,預設0
  • setMaxResult方法:該方法用於設定結果集的最大記錄數,通常與setFirstResult方法結合使用,限制結果集,實現分頁功能

6,Criteria

 Criteria是一個完全面向物件,可擴充套件的條件查詢API通過它完全不需要考慮資料庫底層如何實現,以及SQL 語句如何編寫,他是Hibernate框架的核心查詢物件。  使用Criteria物件查詢資料的主要步驟:
(1)獲得Hibernate的Session物件 (2)通過Session獲得Criteria物件 (3)使用Restrictions的靜態方法建立Criterion物件 (4)向Criteria物件中新增Criterion查詢條件。Criteria的add()方法用於加入查詢條件 (5)執行Criteria的list或uniqueResult獲得結果 下面通過一個案例來說明: 在入門案例的src目錄下的com.itcast.test包下建立類CriteriaTest.java
package com.itcast.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.itcast.domain.User;

public class CriteriaTest {
	@Test
	public void qbcTest(){
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory= config.buildSessionFactory();
		Session session= sessionFactory.openSession();
		Transaction t = session.beginTransaction();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("name", "tom"));
		List<User>list =criteria.list();
		for(User user:list){
			System.out.println(user);
		}
		t.commit();
		session.close();
		sessionFactory.close();
	}
}


用Junit測試執行: 控制檯輸出:

輸出了name=tom 的資訊