1. 程式人生 > >hibernate框架學習之核心API

hibernate框架學習之核心API

需要 action pan 獨立 configure 出現 定義 ets 屬性

Configuration
SessionFactory
Session
Transaction
Query
Criteria

Configuration

Configuration對象用於封裝Hibernate的配置信息,在Hibernate框架啟動後,需要裝載對應的配置文件。Hibernate的配置文件有兩種格式
hibernate.properties文件(早期格式)
hibernate.cfg.xml文件(常用格式)

使用hibernate.properties加載配置
  Configuration conf = new Configuration ();//此方式無法配置資源文件,必須手動添加
資源文件添加方式


  添加配置文件(非主流)
    conf. addResource(“cn/itcast/h3/user/vo/UserModel.hbm.xml”);
  添加持久化類(非主流)
    conf.addClass(UserModel.class);
    此方式Hibernate會自動讀取當前類所在目錄下同名的配置文件,UserModel.hbm.xml,所以在進行配置文件的命名時盡量保持兩個文件名相同,不推薦使用不同名稱的文件

使用hibernate.cfg.xml加載配置
Configuration conf = new Configuration.configure();
此方式可以將資源文件通過XML配置的方式加入配置文件
資源文件配置方式


添加配置文件(主流)
  <mapping resource="cn/itcast/h3/user/vo/UserModel2.hbm.xml"/>
添加持久化類(非主流)
  <mapping class="cn.itcast.h3.user.vo.UserModel"/>

SessionFactory

SessionFactory對象根據Configuration對象加載的配置信息創建得到,其中封裝了配置信息中有關數據庫的信息、所有的映射關系及預定義SQL語句
SessionFactory對象是線程安全的
SessionFactory對象可以通過Configuration對象獲得
Configuration conf = new Configuration().configure();


SessionFactory sf = conf.buildSessionFactory();
由於SessionFactory對象的創建需要基於所有的配置信息,因此創建此對象需要消耗大量的資源,通常一個應用程序中只初始化一個SessionFactory對象

Session

Session對象是Hibernate與應用程序APP進行交互的橋梁,應用程序與Hibernate之間通過Session進行數據交互,其功能相當於JDBC中的Connection
Session對象描述的是一次Hibernate與APP的會話信息,因此Session對象是線程不安全的。在使用時要保障該對象只出現在方法內部運行,而不要共享
Session對象位於應用程序與數據庫之間,應用程序需要持久化的對象交由Session傳遞給數據庫,應用程序需要獲取數據庫的信息也同樣是從Session對象處獲取,Session對象可以看做是一個數據調度中心

技術分享圖片

應用程序添加、刪除、修改數據
應用程序在進行增刪改操作時,將數據傳遞給Session對象,Session對象持有應用程序要進行操作的數據,此時數據並未執行對應的SQL語句。當Session對象執行關閉操作前,會將所持有的數據同步到數據庫中,也可通過flush方法手動刷新session對象的數據存儲空間,完成數據同步。但是這一切要基於事務開啟的狀態,否則即便執行SQL語句,不提交事務也將無意義。
應用程序查詢數據
Hibernate查詢得到的數據在Session未關閉前同樣受Session的管理,滿足上述規則。

Session常用操作

save(Object) / persist(Object)
update(Object)
saveOrUpdate(Object)
delete(Object);
get(Class, Serializable) / load(Class, Serializable)
createQuery(String) / createSQLQuery(String)
createCriteria(Class) 條件查詢

HibernateUtil工具類的制作

package cn.itcast.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static Configuration conf = null;
    //靜態的SessionFactory
    private static SessionFactory sf = null;
    static{
        conf = new Configuration().configure();
        sf = conf.buildSessionFactory();
    }
    public static SessionFactory getSf(){
        return sf;
    }
    /**
     * 獲取Session對象
     * @return 全新的Session對象
     */
    public static Session getSession(){
        return sf.openSession();
    }
}

Transaction

Transaction對象描述Hibernate執行過程中事務對象
數據庫操作中事務是保障數據操作成功的重要因素
事務操作主要包含以下幾種
開啟事務
Transaction t = s.beginTransaction();
提交事務
t.commit();
回滾事務
t.rollback();

Hibernate為了避免開發者在使用事務時未進行事務處理,在核心配置中添加了自動事務的解決方案,但是這種事務處理機制是針對Session的操作的,換言之每次進行Session操作都會為其提供一個獨立的事務。詳細內容到核心配置部分講解。

Query

Query對象描述了用於進行查詢操作的對象,Query對象執行查詢操作需要使用HQL語言。Query對象通過Session對象獲得
Query q = s.createQuery("from UserModel");
其中“from UserModel”使用的就是HQL語言的語法規則
HQL語言是Hibernate框架中根據SQL語言發展得到的一種面向對象操作格式的查詢語句,是Hibernate中主流的查詢方式。

使用Query進行查詢
步驟:
  獲得Session對象
  編寫HQL語句(字符串格式)
  由Session對象創建執行查詢操作的Query對象,並傳入HQL語句作為參數
    HQL語句編寫時應滿足預編譯SQL的語法格式
    如果HQL語句中有參數,為Query對象指定操作的參數
    有關HQL語句中攜帶參數的查詢後面詳細講解
    執行Query對象的數據列表方法獲得查詢結果
    q.list();
    q.uniqueResult();

Query進行查詢的結果
Query對象獲取查詢結果的方式有兩種
使用list()獲得查詢結果
使用uniqueResult()獲得查詢結果

使用list()獲得查詢結果
list方法用於獲得查詢數據結果為0到多條的情況
list方法執行後得到List集合,其中封裝了查詢的結果,結果要根據具體的查詢語句結構來進行解析,數據有兩種格式
對象模型(***Model)
HQL格式:“from UserModel”
HQL格式:“select um from UserModel um”
對象數組(Object[])
HQL格式:”select userName,age from UserModel“
查詢的內容超過一個,返回一個對象數組,封裝查詢結果

投影

投影是將返回Object[]的對象封裝成對象模型的格式
投影在使用時使用構造方法完成
1)首先在模型類中聲明投影需要的構造方法
例如UserModel類中創建帶有userName和age屬性的構造方法
2)然後查詢時修改HQL語句,改為投影格式
原始格式:select userName,age from UserModel
投影格式:select new UserModel(userName,age) from UserModel
3)最後從Query對象中獲得的查詢結果就是封裝完成的對象
List<UserModel> queryList = q.list();
投影要求構造方法參數必須與HQL語句中參數順序完全相同,並且要求大量的構造方法才能全兼容(不常用)。

使用uniqueResult()獲得查詢結果
uniqueResult方法用於獲得查詢數據結果為1條的情況
uniqueResult方法執行後得到Object對象,其中封裝查詢的結果
uniqueResult常用於獲得聚合函數的查詢結果
查詢數據總量:select count(uuid) from UserModel
查詢最大數據:select max(age) from UserModel

Query進行分頁查詢

1)Query對象可以對查詢結果進行局部獲取,也就是JEE中常用的“分頁查詢”結果
2)Query對象進行查詢數據局部獲取
設定查詢的第一條數據編號
q.setFirstResult(10);
設置查詢結果保留索引從第10條開始的數據
設定查詢的數據總量
q.setMaxResults(20);
設置查詢結果保留共20條數據
3)Query對象的分頁查詢結果可以根據數據庫類型不同,自動生成對應的語句(與方言設置匹配)

Query可變參數條件查詢

技術分享圖片

Criteria

Cirteria對象描述了用於進行按條件查詢操作的對象,它可以按照面向對象的格式傳遞查詢條件。
Cirteria對象通過Session對象獲得,創建時需要
Criteria c = s.createCriteria(UserModel.class);
其中UserModel.class是要查詢的數據模型類
使用Criteria對象可以省去書寫SQL或HQL的環節

使用Criteria進行查詢(簡)
步驟:
1)獲得Session對象
2)由Session對象創建執行查詢操作的Criteria對象
Criteria c = s.createCriteria(UserModel.class);
3)如果存在有查詢條件,為查詢添加查詢條件(後面詳細講解)
c.add(Restrictions.eq("userName", "jockme"));
4)執行Criteria對象的數據列表方法獲得查詢結果
c.list();
c.uniqueResult();

hibernate框架學習之核心API