首頁 Java java教程 mybatis和hibernate的差別

mybatis和hibernate的差別

Jun 05, 2019 pm 02:28 PM
hibernate mybatis

在java開發中我們用的兩種兩種主流框架組合為SSM,Spring,SpringMVC,MyBatis和SSH,Struts2,Spring,Hibernate.今天我們先來看看兩種資料庫框架之間到底有什麼區別。

mybatis和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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
iBatis和MyBatis:哪個比較適合你? iBatis和MyBatis:哪個比較適合你? Feb 19, 2024 pm 04:38 PM

iBatis與MyBatis:你該選擇哪一個?簡介:隨著Java語言的快速發展,許多持久化框架也應運而生。 iBatis和MyBatis是兩個備受歡迎的持久化框架,它們都提供了一個簡單而高效的資料存取解決方案。本文將介紹iBatis和MyBatis的特點和優勢,並給出一些具體的程式碼範例,幫助你選擇合適的框架。 iBatis簡介:iBatis是一個開源的持久化框架

比較分析JPA和MyBatis的功能和性能 比較分析JPA和MyBatis的功能和性能 Feb 19, 2024 pm 05:43 PM

JPA和MyBatis:功能與效能比較分析引言:在Java開發中,持久化框架扮演著非常重要的角色。常見的持久化框架包括JPA(JavaPersistenceAPI)和MyBatis。本文將對這兩個框架的功能和效能進行比較分析,並提供具體的程式碼範例。一、功能對比:JPA:JPA是JavaEE的一部分,提供了一個物件導向的資料持久化解決方案。它透過註解或X

詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

實作MyBatis中批次刪除操作的多種方式 實作MyBatis中批次刪除操作的多種方式 Feb 19, 2024 pm 07:31 PM

MyBatis中實現批量刪除語句的幾種方式,需要具體程式碼範例近年來,由於資料量的不斷增加,批量操作成為了資料庫操作的一個重要環節之一。在實際開發中,我們經常需要批量刪除資料庫中的記錄。本文將重點介紹在MyBatis中實作批量刪除語句的幾種方式,並提供相應的程式碼範例。使用foreach標籤實作批量刪除MyBatis提供了foreach標籤,可以方便地遍歷一個集

MyBatis批次刪除語句的使用方法詳解 MyBatis批次刪除語句的使用方法詳解 Feb 20, 2024 am 08:31 AM

MyBatis批量刪除語句的使用方法詳解,需要具體程式碼範例引言:MyBatis是一款優秀的持久層框架,提供了豐富的SQL操作功能。在實際專案開發中,經常會遇到需要大量刪除資料的情況。本文將詳細介紹MyBatis批量刪除語句的使用方法,並附上具體的程式碼範例。使用場景:在資料庫中刪除大量資料時,逐條執行刪除語句效率低。此時,可以使用MyBatis的批次刪除功能

MyBatis快取機制詳解:一文讀懂快取儲存原理 MyBatis快取機制詳解:一文讀懂快取儲存原理 Feb 23, 2024 pm 04:09 PM

MyBatis快取機制詳解:一文讀懂快取儲存原理引言在使用MyBatis進行資料庫存取時,快取是一個非常重要的機制,能夠有效減少對資料庫的訪問,提高系統效能。本文將詳細介紹MyBatis的快取機制,包括快取的分類、儲存原理和具體的程式碼範例。一、快取的分類MyBatis的快取主要分為一級快取和二級快取兩種。一級緩存一級緩存是SqlSession級別的緩存,當在

iBatis與MyBatis的異同比較:主流ORM框架的對比 iBatis與MyBatis的異同比較:主流ORM框架的對比 Feb 19, 2024 pm 07:08 PM

iBatis和MyBatis是兩個主流的ORM(Object-RelationalMapping)框架,它們在設計和使用上有著許多相似之處,也存在一些細微的差別。本文將詳細比較iBatis和MyBatis的異同,並透過具體的程式碼範例來說明它們的特點。一、iBatis與MyBatis的歷史與背景iBatis是ApacheSoftwareFoundat

深入理解MyBatis中的批次Insert實作原理 深入理解MyBatis中的批次Insert實作原理 Feb 21, 2024 pm 04:42 PM

MyBatis是一款流行的Java持久層框架,廣泛應用於各種Java專案。其中,批次插入是常見的操作,可以有效提升資料庫操作的效能。本文將深入探討MyBatis中批量的Insert實作原理,並結合具體的程式碼範例進行詳細解析。 MyBatis中的批次Insert在MyBatis中,批量Insert操作通常使用動態SQL來實作。透過建構一條包含多個插入值的S

See all articles