1. 程式人生 > >ORM框架(Mybatis與Hibernate)學習筆記

ORM框架(Mybatis與Hibernate)學習筆記

物件關係對映(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料,將程式中的物件自動持久化到關係資料庫中。那麼,到底如何實現持久化呢?一種簡單的方案是採用硬編碼方式(jdbc操作sql方式),為每一種可能的資料庫訪問操作提供單獨的方法。
這種方案存在以下不足:

  1. 持久化層缺乏彈性。一旦出現業務需求的變更,就必須修改持久化層的介面
  2. 持久化層同時與域模型與關係資料庫模型繫結,不管域模型還是關係資料庫模型發生變化,都要修改持久化層的相關程式程式碼,增加了軟體的維護難度。

ORM提供了實現持久化層的另一種模式,它採用對映元資料來描述物件關係的對映,使得ORM中介軟體能在任何一個應用的業務邏輯層和資料庫層之間充當橋樑。Java典型的ORM框架有:Hibernate,ibatis(mybatis),speedframework。
ORM的方法論基於三個核心原則:
簡單:以最基本的形式建模資料。
傳達性:資料庫結構被任何人都能理解的語言文件化。
精確性:基於資料模型建立正確標準化了的結構。
物件關係對映(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。可以簡單的方案是採用硬編碼方式(jdbc操作sql方式),為每一種可能的資料庫訪問操作提供單獨的方法。這種方法存在很多缺陷,使用ORM框架(為了解決解決面向物件與關係資料庫存在的互不匹配的現象的框架)來解決。

iBatis(mybatis)與Hibernate的異同

相同點:
都是java中orm框架、遮蔽jdbc api的底層訪問細節,使我們不用與jdbc api打交道,就可以完成對資料庫的持久化操作。jdbc api程式設計流程固定,還將sql語句與java程式碼混雜在了一起,經常需要拼湊sql語句,細節很繁瑣。
ibatis的好處:遮蔽jdbc api的底層訪問細節;將sql語句與java程式碼進行分離;提供了將結果集自動封裝稱為實體物件和物件的集合的功能.queryForList返回物件集合,用queryForObject返回單個物件;提供了自動將實體物件的屬性傳遞給sql語句的引數。
Hibername的好處:Hibernate是一個全自動的orm對映工具,它可以自動生成sql語句,並執行並返回java結果。
不同點:
1、hibernate要比ibatis功能強大很多。因為hibernate自動生成sql語句。
2、ibatis需要我們自己在xml配置檔案中寫sql語句,hibernate我們無法直接控制該語句,我們就無法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate可以很好幫我們完成,但是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,因為ibatis還是由我們自己寫sql語句。
ibatis可以出來複雜語句,而hibernate不能。
3、ibatis要比hibernate簡單的多。ibatis是面向sql的,不用考慮物件間一些複雜的對映關係。

Hibernate對映物件的狀態

臨時狀態/瞬時狀態(transient):剛剛用new語句建立,沒有被持久化。不處於session中(沒有使用session的方法去操作臨時物件)。該物件成為臨時物件
持久化狀態/託管狀態(persistent):已經被持久化,加入到session的快取中。session是沒有關閉。該狀態的物件為持久化物件。
遊離狀態/脫管狀態(detached):已經被持久化,但不處於session中。該狀態的物件為遊離物件。
刪除狀態(removed):物件有關聯的ID,並且在Session管理下,但是已經被計劃(事務提交的時候,commit())刪除。如果沒有事務就不能刪除
相互轉換:
這裡寫圖片描述

Hibernate的快取

why(為什麼要用Hibernate快取?)

Hibernate是一個持久層框架,經常訪問物理資料庫。
為了降低應用程式對物理資料來源訪問的頻次,從而提高應用程式的執行效能。
快取內的資料是對物理資料來源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或事件會同步快取和物理資料來源的資料。
為了提高訪問速度,把磁碟或資料庫訪問變成記憶體訪問。
what(Hibernate快取原理是怎樣的?)Hibernate快取包括兩大類:Hibernate一級快取和Hibernate二級快取。
1.Hibernate一級快取又稱為“Session的快取”。
Session快取內建不能被解除安裝,Session的快取是事務範圍的快取(Session物件的生命週期通常對應一個數據庫事務或者一個應用事務)。
一級快取中,持久化類的每個例項都具有唯一的OID。
2.Hibernate二級快取又稱為“SessionFactory的快取”。
由於SessionFactory物件的生命週期和應用程式的整個過程對應,因此Hibernate二級快取是程序範圍或者叢集範圍的快取,有可能出現併發問題,因此需要採用適當的併發訪問策略,該策略為被快取的資料提供了事務隔離級別。
第二級快取是可選的,是一個可配置的外掛,預設下SessionFactory不會啟用這個外掛。
Hibernate提供了org.hibernate.cache.CacheProvider介面,它充當快取外掛與Hibernate之間的介面卡。

Hibernate中的快取分一級快取和二級快取。
一級快取就是Session級別的快取,在事務範圍內有效是,內建的不能被解除安裝。二級快取是SesionFactory級別的快取,從應用啟動到應用結束有效。是可選的,預設沒有二級快取,需要手動開啟。
儲存資料庫後,在記憶體中儲存一份,如果更新了資料庫就要同步更新。
什麼樣的資料適合存放到第二級快取中?  
1)很少被修改的資料  帖子的最後回覆時間 
2)經常被查詢的資料 電商的地點
2) 不是很重要的資料,允許出現偶爾併發的資料   
3) 不會被併發訪問的資料   
4) 常量資料

擴充套件:hibernate的二級快取預設是不支援分散式快取的。使用memcahe,redis等中央快取來代替二級快取。