Hibernate的核心配置檔案和API
阿新 • • 發佈:2019-02-14
一,核心配置檔案
1,Hibernate的對映檔案*.hbm.xml
基本結構:
hibernate-mapping:該元素定義了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>
class:該元素用來宣告一個持久化類,他是XML配置檔案的主要內容
id:該元素用來設定持久化類的OID(物件識別符號)和表的主鍵的對映
property:該元素用來將持久化類中的普通屬性對映到資料庫表對應的欄位上
2,hibernate的配置檔案hibernate.cfg.xml
基本結構:Hibernate配置檔案常用屬性及用途:<?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.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,Criteria1,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具有以下特點:
- 它是執行緒安全的,它的同一個例項能夠供多個執行緒共享
- 它是重量級的,不能隨意地建立和銷燬它的例項
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()方法:檢查事物是否提交
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方法用於設定查詢語句中的引數,針對
- iterator方法:該方法用於查詢語句,該方法返回一個Iterator物件,在讀取時只能按照順序方法讀取,它
- 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 的資訊