(一)Hibernate入門 通俗的話來說:Hibernate是用於面向對象操控資料庫,對JDBC進行輕量級封裝。(在java世界中傳統的來說是JDBC訪問資料庫。) 1)Hibernate定性:對象關係映射框架。(底層依舊是JDBC) 2)Hibernate框架的結構圖 解析:Java Appli ...
(一)Hibernate入門
通俗的話來說:Hibernate是用於面向對象操控資料庫,對JDBC進行輕量級封裝。(在java世界中傳統的來說是JDBC訪問資料庫。)
1)Hibernate定性:對象關係映射框架。(底層依舊是JDBC)
2)Hibernate框架的結構圖
解析:Java Application 應用程式
Persistent Object 持久化對象
Hibernate(Configuration、Session Factory、Session、 Transation、Query、Criteria)六大介面
JNDI:(Java Naming and Directory Interface)是java的命名與目錄介面
JDBC:(Java Date Base Connectivity)資料庫連接,是一種執行語句的Java API
JTA:(Java Transaction API)全局事務處理
3)什麼是ORM?
ORM是對象關係映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),
是一種程式技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換。
從效果上說,它其實是創建了一個可在編程語言里使用的“虛擬對象資料庫”。
4)什麼是持久化?
持久化是程式數據在瞬時狀態和持久狀態間轉換的過程
POJO(plain ordinary java object) 簡單無規則java對象純的傳統意義的java對象。就是說在一些Object/Relation Mapping工具中,
能夠做到維護資料庫表記錄的persisent object完全是一個符合Java Bean規範的純Java對象,沒有增加別的屬性和方法。我的理解就是
最基本的Java Bean,只有屬性欄位及setter和getter方法。
解析一:一個POJO(Plain Ordinary Java Object普通的java對象)持久化以後就是PO
JavaBean=POJO
PO=POJO+xml配置
直接用它傳遞、傳遞過程中就是DTO(Data Transefer Object)
直接用來對應表示層就是VO
解析二:其對象或實例將存儲在資料庫表中的Java類在Hibernate中稱為持久化類
PO=JavaBean+xml配置
POJO名稱用於強調一個給定的對象是一個普通的Java對象,而不是一個特殊的對象,好更不是Enterprise JavaBean(ORM框架的實現產品)。
5)持久化對象的唯一標識是OID
解析:我們都知道,Java中安記憶體地址不同區分同一個類的不同對象
關係資料庫用主鍵區分同一條記錄
Hibernate使用OID來建立記憶體中的對象和資料庫中記錄的對應關係
01.什麼是OID?
解析:OID 是持久化類(Student)與數據表主鍵對應屬性, 用來唯一區分持久化對象。
02.儘量使用包裝類
解析:一個學生成績為0,無法區分是參加了考試考取了0分,還是沒有成績。
如果使用包裝類,資料庫就會存入null,證明該學生沒有參加考試
區別:java的包裝類和基本數據類型
Java的基本類型包裝類:
Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
其中BigInteger、BigDecimal沒有相對應的基本類型,主要應用於高精度的運算,BigInteger 支持任意精度的整數,BigDecimal支持任意精度帶小數點的運算。
Java語言提供了八種基本類型:(六種數字類型(四個整數型,兩個浮點型),一種字元類型,還有一種布爾型。 )
整數:包括int,short,byte,long ,初始值為0
浮點型:float,double ,初始值為0.0
字元:char ,初始值為空格,即'' ",如果輸出,在Console上是看不到效果的。
布爾:boolean ,初始值為false
6)主鍵生策略(基本)
* increment
由hibernate完成 主鍵遞增,
原理:select max(id) , insert時max(id)+1 ,完成主鍵遞增
優點:跨資料庫
缺點:多線程併發訪問問題(第一個線程執行成功,第二個線程報錯)
* identity
由底層資料庫來完成自增 ,要求資料庫必須支持自增主鍵 mysql支持 ,oracle不支持
* sequence
編號列生成由底層資料庫提供序列,來完成主鍵自增,要求資料庫必須支持序列 mysql不支持,oracle支持
create sequence myseq; 創建序列
insert into customer values (myseq.nextval); 插入數據時調用序列,序列+1
* native
採用資料庫支持自增策略, mysql就用identity 、oracle就用sequence
策略1) ---> 策略4) 要求資料庫主鍵必須為數字 ,因為只有數字才能自增
* uuid
32位 唯一字元串, 主鍵使用varchar 類型
真實開發中,用程式提供uuid值
*assigned
手動指定主鍵的值,該主鍵一般有實際意義,例如訂單單號(20160114-A002)20160114-B001 20160114-C002。
7)Hibernate中Java對象的三種狀態之間的轉換
8)臟檢查和緩存機制
什麼是臟檢查:當事務提交時,Hibernate會對session中的PO(持久化對象)進行檢測,判斷持久化對象的狀態是否發生了改變,如果發生了改變就會將改變更新到資料庫中。
(現數據比原數據是否改變)
Session會話中flush()方法和clear()方法的共同點都是往資料庫
Flush()資料庫同步的不清除緩存的
Clear()清除緩存的