hibernate框架學習第六天:QBC、分頁查詢、投影、數據加載策略、二級緩存

QBC查詢
1.簡單查詢
Criteria c = s.createCriteria(TeacherModel.class);
2.獲取查詢結果
多條:list
單挑:uniqueResult
3.分頁查詢
setFirstResult(int)
setMaxResults(int)
4.查詢排序
添加排序
c.addOrder(Order);
排序規則
Order od = Order.asc("字段名")
Order od = Order.desc("字段名")
5.條件查詢
1.添加查詢條件
c.add(條件)
2.條件格式
Restrictions.操做名稱(參數....);
3.組合條件
Restrictions.and(條件1,條件2);
Restrictions.or(條件1,條件2);
Restrictions.not(條件)
6.投影
單獨字段
c.setProjection(Property.forName("age"));
多字段
c.setProjection(
Projections.projectionList()
.add(Property.forName("studentName"))
.add(Property.forName("age"))
);
QBC多表查詢
1.若是要創建多表查詢,首先要告訴QBC是多表
c.createAlias("關聯對象","別名");
全部屬性,若是是關聯對象的屬性,統一使用別名調用
//認爲: teacher.nick
//實際:別名.nick
2.離線查詢
表現層過來的數據,是散的
在表現成中,建立一個DetachedCriteria,而後將全部條件在這裏賦值完畢,將它傳遞到邏輯層
傳遞到邏輯層
將DetachedCriteria傳遞到數據層
邏輯層傳遞數據層
將DetachedCriteria轉化爲Criteria,使用
-------------------------------
數據加載策略/數據抓取策略
查詢方式
load OID
get OID
Query(Query Criteria) SQL
數據分類
主數據
查詢TeacherModel->StudentModel
主數據 主關聯數據
假設關係:一對多
由一得到多
一:是主數據
多:是主關聯數據
由多得到一
多:是從數據
一:是從關聯數據

TeacherModel 1 n StudentModel
查詢TeacherModel,主
查詢TeacherModel,找StudentModel 主關聯
查詢StudentModel,從
查詢StudentModel,找StudentModel 從關聯

數據獲取方式
load OID
get OID
Query OID
Query 非OID

直接數據加載策略數據庫

關聯數據加載策略
主關聯數據加載策略
老師對學生一對多,這裏研究的是老師對象中的學生集合的數據加載策略
1.fetch = "select" lazy = "false"
SQL語句:
主數據:1條SQL
主關鏈數據:多條SQL
查詢主關聯數據數據總量
不執行SQL語句
查詢主關聯數據具體數據
不執行SQL語句
2.fetch = "select" lazy = "true"
SQL語句:
主數據:1條SQL
查詢主關聯數據數據總量
執行主關聯數據對應的具體信息查詢SQL(按需產生SQL語句A)
查詢主關聯數據具體數據
執行主關聯數據對應的具體信息查詢SQL(按需產生SQL語句A)
3.fetch = "select" lazy = "extra"
SQL語句:
主數據:1條SQL
查詢主關聯數據數據總量
執行主關聯數據集合數據總量查詢SQL(按需產生SQL語句A)
查詢主關聯數據具體數據
執行主關聯數據對應的具體信息查詢SQL (按需產生SQL語句B)
注意:
先執行A操做,再執行B操做,AB操做均產生SQL語句
先執行B操做,再執行A操做,BA操做只產生B操做SQL語句

4.fetch = "subselect" lazy = "false"
SQL語句:
主數據:1條SQL
主關鏈數據:1條SQL(子查詢)
查詢主關聯數據數據總量
不執行SQL語句
查詢主關聯數據具體數據
不執行SQL語句
5.fetch = "subselect" lazy = "true"
SQL語句:
主數據:1條SQL
查詢主關聯數據數據總量
執行主關聯數據對應的具體信息查詢SQL(一條子查詢SQL語句A)
查詢主關聯數據具體數據
執行主關聯數據對應的具體信息查詢SQL(一條子查詢SQL語句A)
6.fetch = "subselect" lazy = "extra"
SQL語句:
主數據:1條SQL
查詢主關聯數據數據總量
執行主關聯數據集合數據總量查詢SQL(按需產生SQL語句A)
查詢主關聯數據具體數據
執行主關聯數據對應的具體信息查詢SQL (一條子查詢SQL語句B)
注意:
先執行A操做,再執行B操做,AB操做均產生SQL語句
先執行B操做,再執行A操做,BA操做只產生B操做SQL語句
使用Query查詢,攜帶OID做爲查詢條件或使用load/get查詢,查詢SQL生成等同於fetch=select (subselect=select)
7.fetch = "join" lazy = "false"
SQL語句:
主數據:1條SQL
主關鏈數據:多條SQL
查詢主關聯數據數據總量
不執行SQL語句
查詢主關聯數據具體數據
不執行SQL語句
8.fetch = "join" lazy = "true"
SQL語句:
主數據:1條SQL
查詢主關聯數據數據總量
執行主關聯數據對應的具體信息查詢SQL (按需產生SQL語句A)
查詢主關聯數據具體數據
執行主關聯數據對應的具體信息查詢SQL (按需產生SQL語句A)
9.fetch = "join" lazy = "extra"
SQL語句:
主數據:1條SQL
查詢主關聯數據數據總量
執行主關聯數據集合數據總量查詢SQL (按需產生SQL語句A)
查詢主關聯數據具體數據
執行主關聯數據對應的具體信息查詢SQL (按需產生SQL語句B)
9-2.fetch = "join" lazy = "extra" 查詢使用OID進行
SQL語句:
主數據:1條SQL(左外鏈接SQL,主和關聯數據所有查詢出來)
查詢主關聯數據數據總量
不會產生SQL語句
查詢主關聯數據具體數據
不會產生SQL語句緩存

fetch:用於控制進行關聯查詢時,產生的SQL語句
select:通常SQL
subselect:子查詢SQL語句
join:Query join=select 通常SQL
OID 左外鏈接SQL
lazy:用於控制進行關聯查詢時,被關聯數據的加載策略
false:非延遲加載,初期就將數據查詢出來
true:延遲加載,須要使用執行SQL
extra:超級延遲加載,若是獲取長度,執行SQL與獲取數據執行SQL不一樣併發

總結:
lazy控制的是關聯數據的加載策略,分爲理解加載,延遲加載,和超級延遲加載
fetch控制的是SQL語句格式,select通常,subselect子查詢,join通常
fetch若是是使用按OID查詢,join左外鏈接SQLfetch


從關聯數據加載策略
獲取主數據,設置主數據關聯的數據加載策略
獲取從數據,設置從數據關聯的數據加載策略
1.fetch = "select" lazy = "false"
SQL語句:
從數據:1條SQL
從關聯數據:多條SQL
查詢從關聯數據具體數據
不執行SQL
2.fetch = "select" lazy = "proxy" proxy指延遲策略由被關聯類控制
SQL語句:
從數據:1條SQL
被關聯數據lazy="false" 執行多條SQL
查詢從關聯數據具體數據
被關聯數據lazy="true" 執行從關聯數據查詢SQL (按需產生SQL語句)
注意:lazy="proxy"將控制權交給被關聯對象進行控制
若是被關聯對象lazy="true":延遲加載從關聯數據
若是被關聯對象lazy="false":當即加載從關聯數據
3.fetch = "join" lazy = "false"
SQL語句:
從數據:1條SQL
從關聯數據:多條SQL
查詢從關聯數據具體數據
不執行SQL
4.fetch = "join" lazy = "proxy"
SQL語句:
從數據:1條SQL
被關聯數據lazy="false" 執行多條SQL
查詢從關聯數據具體數據
被關聯數據lazy="true" 執行從關聯數據查詢SQL (按需產生SQL語句)
注意:lazy="proxy"將控制權交給被關聯對象進行控制
若是被關聯對象lazy="true":延遲加載從關聯數據
若是被關聯對象lazy="false":當即加載從關聯數據
注意:當使用OID進行查詢時,生成的SQL是左外鏈接格式,此時lazy失效

fetch:用於控制進行關聯查詢時,產生的SQL語句
select:通常SQL
join:Query join=select 通常SQL
OID 左外鏈接SQL
lazy:用於控制進行關聯查詢時,被關聯數據的加載策略
false:非延遲加載,初期就將數據查詢出來
proxy:根據從關聯數據的lazy屬性來決定延遲加載策略對象

在進行非延遲加載策略搜索時,每每會生成多條SQL語句,能夠經過調整批量抓取策略,提升執行效率
batch-size = 4排序

---------------------------------------
二級緩存
緩存的做用:
H3支持兩種緩存
一級緩存
對應Session對象
二級緩存
對相SessionFactory對象
二級緩存操做
load/get
先查找一級緩存,有,返回,沒有
再查找二級緩存,有,保存到一級緩存,由一級緩存返回,沒有
再查找數據庫,SQL,保存到一級緩存,一級緩存將數據保存到二級緩存,一級緩存返回
SQL查詢
查找數據庫,SQL,保存到一級緩存,一級緩存將數據保存到二級緩存,一級緩存返回
添加數據
更新所在一級緩存的數據
更新數據庫對應數據
刪除、修改數據
更新所在一級緩存的數據
更新所在二級緩存的數據
更新數據庫對應數據get

二級緩存操做注意事項
1.SQL查詢不走二級緩存
2.不要將全部數據裝入二級緩存
3.二級緩存獲取數據按OID獲取
4.從數據庫查詢的信息所有進入二級緩存it

二級緩存中的數據須要具有什麼條件
適合加入二級緩存的數據
不多被修改的數據
不是很重要的數據,容許出現偶爾併發的數據
不會被併發訪問的數據
參考數據
不適合加入二級緩存的數據
常常被修改的數據
財務數據,絕對不容許出現併發
與其餘應用共享的數據io

相關文章
相關標籤/搜索