在java開發中我們用的兩種兩種主流框架組合為SSM,Spring,SpringMVC,MyBatis和SSH,Struts2,Spring,Hibernate.今天我們先來看看兩種資料庫框架之間到底有什麼區別。
第一個方面:開發速度的比較
就開發速度而言,Hibernate的真正掌握要比Mybatis來得難些。 Mybatis框架相對簡單很容易上手,但也相對簡陋些。個人覺得要用好Mybatis還是先理解好Hibernate。 (推薦學習:Java影片教學)
比起兩者的開發速度,不僅要考慮到兩者的特性及效能,還要根據專案需求去考慮究竟哪一個比較適合專案開發,例如:一個專案中用到的複雜查詢基本上沒有,就是簡單的增刪改查,這樣選擇hibernate效率就很快了,因為基本的sql語句已經被封裝好了,根本不需要你去寫sql語句,這就節省了大量的時間,但是對於一個大型項目,複雜語句較多,這樣再去選擇hibernate就不是一個太好的選擇,選擇mybatis就會加快許多,而且語句的管理也比較方便。
第二面向:發展工作量的比較
Hibernate和MyBatis都有對應的程式碼產生工具。可以產生簡單基本的DAO層方法。針對進階查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發者不需要關心SQL的生成與結果映射,可以更專注於業務流程。
第三方面:sql最佳化方面
Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有效能消耗。 Hibernate也可以自己寫SQL來指定需要查詢的字段,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動寫的,所以可以依需求指定查詢的欄位。
Hibernate HQL語句的調優需要將SQL印出來,而Hibernate的SQL被很多人嫌棄因為太醜了。 MyBatis的SQL是自己手動寫的所以調整方便。但Hibernate具有自己的日誌統計。 Mybatis本身不帶日誌統計,使用Log4j進行日誌記錄。
第四個面向:物件管理的比較
Hibernate 是完整的物件/關聯映射解決方案,它提供了物件狀態管理(state management)的功能,使開發者不再需要理會底層資料庫系統的細節。也就是說,相對於常見的 JDBC/SQL 持久層方案中需要管理 SQL 語句,Hibernate採用了更自然的物件導向的視角來持久化 Java 應用中的資料。
換句話說,使用 Hibernate 的開發者應該總是專注於物件的狀態(state),不必考慮 SQL 語句的執行。這部分細節已經由 Hibernate 掌管妥當,只有開發者在進行系統效能調優的時候才需要了解。而MyBatis在這塊沒有文件說明,使用者需要對物件自己進行詳細的管理。
第五方面:快取機制
Hibernate快取
Hibernate一級快取是Session緩存,利用好一級快取就需要對Session的生命週期進行管理好。建議在一個Action操作中使用一個Session。一級快取需要對Session進行嚴格管理。
Hibernate二級快取是SessionFactory級的快取。 SessionFactory的快取分為內建快取和外部快取。內建快取中存放的是SessionFactory物件的一些集合屬性包含的資料(映射元素據及預定SQL語句等),對於應用程式來說,它是唯讀的。外置快取中存放的是資料庫資料的副本,其作用和一級快取類似.二級快取除了以記憶體作為儲存媒體外,還可以選用硬碟等外部儲存裝置。二級緩存稱為進程級快取或SessionFactory級緩存,它可以被所有session共享,它的生命週期伴隨著SessionFactory的生命週期存在和消亡。
MyBatis快取
MyBatis 包含一個非常強大的查詢快取功能,它可以非常方便地配置和自訂。 MyBatis 3 中的快取實現的許多改進都已經實現了,使得它更加強大且易於配置。
預設是沒有開啟快取的,除了局部的 session 快取,可以增強變現而且處理循環 依賴也是必須的。要開啟二級快取,你需要在你的 SQL 映射檔中加入一行:
字面上就是這樣。這個簡單語句的效果如下:
映射語句檔案中的所有 select 語句將會被快取。
映射語句檔案中的所有 insert,update 和 delete 語句會刷新快取。
快取會使用 Least Recently Used(LRU,最近最少使用的)演算法來收回。
根據時間表(例如 no Flush Interval,沒有刷新間隔), 快取不會以任何時間順序 來刷新。
快取會儲存清單集合或物件(無論查詢方法傳回什麼)的 1024 個參考。
快取會被視為是read/write(可讀/可寫)的快取,意味著物件檢索不是共享的,而且可以安全地被呼叫者修改,而不干擾其他呼叫者或執行緒所做的潛在修改。
所有的這些屬性都可以透過快取元素的屬性來修改。
例如:
這個更高級的設定創建了一個FIFO 快取,並每隔60 秒刷新,存數結果物件或列表的512 個引用,而且返回的物件被認為是唯讀的,因此在不同線程中的呼叫者之間修改它們會導致衝突。可用的收回策略有, 預設的是 LRU:
LRU – 最近最少使用的:移除最長時間不被使用的物件。
FIFO – 先進先出:按物件進入快取的順序來移除它們。
SOFT – 軟參考:移除基於垃圾回收器狀態和軟參考規則的物件。
WEAK – 弱引用:更積極移除基於垃圾收集器狀態和弱引用規則的物件。
flushInterval(刷新間隔)可以被設定為任意的正整數,而且它們代表一個合理的毫秒 形式的時間段。預設情況是不設定,也就是沒有刷新間隔,快取僅僅調用語句時刷新。
size(引用數目)可以被設定為任意正整數,要記住你快取的物件數目和你運行環境的 可用記憶體資源數目。預設值是1024。
readOnly(唯讀)屬性可以被設定為 true 或 false。只讀的快取會給所有呼叫者傳回緩 存物件的相同實例。因此這些物件不能被修改。這提供了很重要的效能優勢。可讀寫的快取 會傳回快取物件的拷貝(透過序列化) 。這會慢一些,但是安全,因此預設是 false。
相同點:Hibernate和Mybatis的二級快取除了採用系統預設的快取機制外,都可以透過實作你自己的快取或為其他第三方快取方案,建立適配器來完全覆寫快取行為。
不同點:Hibernate的二級快取配置在SessionFactory產生的設定檔中進行詳細配置,然後再在特定的表-物件映射中配置是那種快取。
MyBatis的二級快取配置都是在每個特定的表-物件映射中進行詳細配置,這樣針對不同的表可以自訂不同的快取機制。並且Mybatis可以在命名空間中共享相同的快取配置和實例,透過Cache-ref來實現。
兩者比較:因為Hibernate對查詢物件有著良好的管理機制,使用者無需關心SQL。所以使用二級快取時如果出現髒數據,系統會報出錯誤並提示。
而MyBatis在這一方面,使用二級快取時需要特別小心。如果無法完全確定資料更新操作的波及範圍,避免Cache的盲目使用。否則,髒數據的出現會為系統的正常運作帶來很大的隱患。
更多Java相關技術文章,請造訪Java開發教學欄位進行學習!
以上是mybatis和hibernate的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!