hibernate學習概要

1、hibernate中實體規則

實體類建立的注意事項

1.持久化類提供無參數構造
2.成員變量私有,提供get、set方法訪問,需提供屬性(屬性就是get、set方法)
3.持久化類中的屬性,應儘可能使用包裝類型(能夠表示null,在插如數據庫中有做用)
4.持久化類須要提供oid(主鍵屬性)與數據庫中主鍵列對應
5.不須要final修飾class(緣由:hibernate使用cglib代理生成代理對象,若是被final修飾將沒法生成代理)mysql

主鍵類型

1.天然主鍵(少見)算法

表的業務列中,有某業務列符合,必須有且不重複的特徵時,該列能夠做爲主鍵使用

2.代理主鍵(常見)sql

表的業務列中,沒有某業務列符合,必須有且不重複的特徵時,建立一個沒有業務意義的列作爲主鍵

主鍵生成策略

1.代理主鍵數據庫

indentity:主鍵自增,有數據庫來維護主鍵值,錄入時不須要指定主鍵
sequence:Oracle中的主鍵生成策略
increment(瞭解):主鍵自增,由hibernate來維護,每次插入前會先查詢表中的id的最大值,+1做爲新主鍵插入
hilo(瞭解):高低位算法,主鍵自增,有hibernate來維護,開發時不使用
native:hilo + sequence + indeyity 自動三選一策略
uuid:產生隨機字符串做爲主鍵,主鍵類型必須爲String類型

2.天然主鍵緩存

assigned:天然主鍵生成策略,hibernate不會管理主鍵值,由開發人員本身錄入

2、hibernate中的對象狀態

對象分爲三種狀態

1.瞬時狀態session

沒有id,沒有與session關聯

2.持久化狀態併發

有id,與session有關聯

3.遊離|託管狀態函數

有id,沒有與session關聯

代碼ui

@Test
public void save() {
    Session session = HibernateUtils.openSession();
    
    Transaction tx = session.beginTransaction();

    Customer c = new Customer(); // 沒有id,沒有與session對象關聯 => 瞬時狀態

    session.save(c); // 持久化狀態,有id,與session對象關聯

    tx.commit();

    session.close(); // 遊離|託管狀態,有id,沒有關聯
}

三種狀態的轉換圖
clipboard.pngspa

3、hibernate一級緩存

緩存:提升效率,hibernate中的一級緩存也是爲了提升操做數據庫的效率

4、hibernate中的事務

事務特性

a原子性
c一致性
i隔離性(事務併發的時候隔離級別)
d持久性

事務併發問題

一、髒讀
二、不可重複讀
三、幻、虛讀

事務的隔離級別

讀未提交:出現的問題一、二、3
讀已提交:出現的問題二、3
可重複讀:出現的問題3(mysql默認級別)
串行化:沒有問題,會極大的下降效率

如何在hibernate中指定隔離級別

在hibernate主配置中
<!--specify a JDBC isolation level-->
hibernate.connection.isolation 1|2|4|8
數據庫中存儲級別是一個字節
0001 1  讀未提交
0010 2  讀已提交
0100 4  可重複讀
1000 8  串行化

項目中如何管理事務

業務開始以前打開事務,業務執行以後提交事務,執行過程當中出現異常,回滾事務
在dao層操做數據庫須要用到session對象,在service控制事務也是使用session對象完成,咱們要確保dao層和service層使用的是同一個session對象
在hibernate中確保使用同一個session的問題,hibernate已經幫咱們解決了,咱們開發人員只須要調用sf.getCurrentSession()方法得到與當前線程綁定的session對象
注意:調用getCurrentSession()方法必須配合主配置中的一項配置,以下
    指定session與當前線程綁定
    hibernate.current_session_context_class  thread
    經過getCurrentSession()方法得到session對象,當事務提交時session會自動關閉,不須要手動close關閉

5、hibernate中的批量查詢

HQ查詢-hibernate Query Language(支持多表查詢,但通常是不復雜時使用)

// 一、書寫HQL語句
String hql = "form Customer"; // 查詢全部的Customer對象
// 二、根據HQL語句建立查詢對象
Query query = session.createQuery(hql);
// 三、根據對象得到查詢結果
List<Customer> list = query.list(); // 返回list結果
// query.uniqueResult();//返回惟一的查詢結果
// ?佔位符
String hql = "form Customer  where cus_id = ?"; // 查詢全部的Customer對象
//設置參數
session.setParamter(0, 1)// hibernate ?佔位符索引從0開始,jdbc從1開始
// :佔位符
String hql = "form Customer  where cus_id = :cus_id";
session.setParamter("cus_id", 1)// hibernate :佔位符直接輸入佔位名字
// 分頁查詢
query.setFirstResult(0);// 第一條數據開始的位置,0是索引
query.setMaxResult(20);// 設置查詢結果最大條數,想當與pagesize

Criteria查詢-hibernate自創的無語句查詢(單表查詢)

Criteria criteria = session.createCriteria(Customer.calss); //查詢全部的Customer對象
List<Customer> list = criteria.list();// 返回list結果
// criteria.uniqueResult();// 返回惟一查詢結果
// 條件查詢
// >              gt
// >=             ge
// <              lt
// <=             le
// ==             eq
// !=             ne
// in             in
// between and    between
// like           like
// is not null    isNotNull
// is null        isNull
// or             or
// and            and
criteria.add(Restrictions.eq("cus_id", 1))// 查詢cus_id爲1的對象
// 聚合函數
criteria.setProjection(Projections.rowCount);// count函數
// 分頁查詢
criteria.setFirstResult(0);// 第一條數據開始的位置,0是索引
criteria.setMaxResult(20);// 設置查詢結果最大條數,想當與pagesize

原生SQL查詢(複雜業務查詢)

// 書寫sql語句
String sql = "select * from customer";
// 建立sql查詢對象
SQLQuery query = session.createSQLQuery(sql);
// 指定結果集封裝到指定對象中
query.addEntity(Customer.class);
// 調用方法查詢結果
List<Customer> list = query.list();
相關文章
相關標籤/搜索