1. 程式人生 > >hibernate學習筆記第六天

hibernate學習筆記第六天

order 執行 nat ron project 數據 不同 研究 對象

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左外連接SQL


從關聯數據加載策略
獲取主數據,設置主數據關聯的數據加載策略
獲取從數據,設置從數據關聯的數據加載策略
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,保存到一級緩存,一級緩存將數據保存到二級緩存,一級緩存返回
添加數據
更新所在一級緩存的數據
更新數據庫對應數據
刪除、修改數據
更新所在一級緩存的數據
更新所在二級緩存的數據
更新數據庫對應數據

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

二級緩存中的數據需要具備什麽條件
適合加入二級緩存的數據
很少被修改的數據
不是很重要的數據,允許出現偶爾並發的數據
不會被並發訪問的數據
參考數據
不適合加入二級緩存的數據
經常被修改的數據
財務數據,絕對不允許出現並發
與其他應用共享的數據

hibernate學習筆記第六天