當前位置:首頁 » 編程語言 » mybatissql性能優化
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mybatissql性能優化

發布時間: 2023-03-07 11:23:21

⑴ hibarnate和mybatis的區別

1、開發對比開發速度

Hibernate的真正掌握要比Mybatis來得難些。Mybatis框架相對簡單很容易上手,但也相對簡陋些。要用好Mybatis還是首先要先理解好Hibernate。
開發社區
Hibernate 與Mybatis都是流行的持久層開發框架,但Hibernate開發社區相對多熱鬧些,支持的工具也多,更新也快,當前最高版本4.1.8。而Mybatis相對平靜,工具較少,當前最高版本3.2。
開發工作量
Hibernate和MyBatis都有相應的代碼生成工具。可以生成簡單基本的DAO層方法。
針對高級查詢,Mybatis需要手動編寫sql語句,以及ResultMap。而Hibernate有良好的映射機制,開發者無需關心SQL的生成與結果映射,可以更專注於業務流程。
2、系統調優對比Hibernate的調優方案
制定合理的緩存策略;
盡量使用延遲載入特性;
採用合理的Session管理機制;
使用批量抓取,設定合理的批處理參數(batch_size);
進行合理的O/R映射設計
Mybatis調優方案
MyBatis在Session方面和Hibernate的Session生命周期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級緩存機制。 MyBatis可以進行詳細的SQL優化設計。
SQL優化方面
Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有性能消耗。Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。
Hibernate HQL語句的調優需要將SQL列印出來,而Hibernate的SQL被很多人嫌棄因為太丑了。MyBatis的SQL是自己手動寫的所以調整方便。但Hibernate具有自己的日誌統計。Mybatis本身不帶日誌統計,使用Log4j進行日誌記錄。
擴展性方面
Hibernate與具體資料庫的關聯只需在XML文件中配置即可,所有的HQL語句與具體使用的資料庫無關,移植性很好。MyBatis項目中所有的SQL語句都是依賴所用的資料庫的,所以不同資料庫類型的支持不好。
3、對象管理與抓取策略對象管理
Hibernate 是完整的對象/關系映射解決方案,它提供了對象狀態管理(state management)的功能,使開發者不再需要理會底層資料庫系統的細節。也就是說,相對於常見的 JDBC/SQL 持久層方案中需要管理 SQL 語句,Hibernate採用了更自然的面向對象的視角來持久化 Java 應用中的數據。
換句話說,使用 Hibernate 的開發者應該總是關注對象的狀態(state),不必考慮 SQL 語句的執行。這部分細節已經由 Hibernate 掌管妥當,只有開發者在進行系統性能調優的時候才需要進行了解。
而MyBatis在這一塊沒有文檔說明,用戶需要對對象自己進行詳細的管理。
抓取策略
Hibernate對實體關聯對象的抓取有著良好的機制。對於每一個關聯關系都可以詳細地設置是否延遲載入,並且提供關聯抓取、查詢抓取、子查詢抓取、批量抓取四種模式。 它是詳細配置和處理的。
而Mybatis的延遲載入是全局配置的。
4、緩存機制對比Hibernate緩存
Hibernate一級緩存是Session緩存,利用好一級緩存就需要對Session的生命周期進行管理好。建議在一個Action操作中使用一個Session。一級緩存需要對Session進行嚴格管理。
Hibernate二級緩存是SessionFactory級的緩存。 SessionFactory的緩存分為內置緩存和外置緩存。內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定SQL語句等),對於應用程序來說,它是只讀的。外置緩存中存放的是資料庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作為存儲介質外,還可以選用硬碟等外部存儲設備。二級緩存稱為進程級緩存或SessionFactory級緩存,它可以被所有session共享,它的生命周期伴隨著SessionFactory的生命周期存在和消亡。
5、優勢對比
Mybatis優勢
MyBatis可以進行更為細致的SQL優化,可以減少查詢欄位。
MyBatis容易掌握,而Hibernate門檻較高。
Hibernate優勢
Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。
Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。
Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

⑵ spring+mybatis的優缺點

mybatis的優缺點:

優點:
1.易於上手和掌握。
2.sql寫在xml里,便於統一管理和優化。
3.解除sql與程序代碼的耦合。
4.提供映射標簽,支持對象與資料庫的orm欄位關系映射
5.提供對象關系映射標簽,支持對象關系組建維護
6.提供xml標簽,支持編寫動態sql。
缺點:
1.sql工作量很大,尤其是欄位多、關聯表多時,更是如此。
2.sql依賴於資料庫,導致資料庫移植性差。
3.由於xml里標簽id必須唯一,導致DAO中方法不支持方法重載。
4.欄位映射標簽和對象關系映射標簽僅僅是對映射關系的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標簽,如果sql里沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關系的,即Collection的對象為null)
5.DAO層過於簡單,對象組裝的工作量較大。
6.不支持級聯更新、級聯刪除。
7.編寫動態sql時,不方便調試,尤其邏輯復雜時。
8提供的寫動態sql的xml標簽功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。
9.使用不當,容易導致N+1的sql性能問題。
10.使用不當,關聯查詢時容易產生分頁bug。
11.若不查詢主鍵欄位,容易造成查詢出的對象有「覆蓋」現象。
12.參數的數據類型支持不完善。(如參數為Date類型時,容易報沒有get、set方法,需在參數上加@param)
13.多參數時,使用不方便,功能不夠強大。(目前支持的方法有map、對象、註解@param以及默認採用012索引位的方式)
14.緩存使用不當,容易產生臟數據。

總結:
mybatis的優點其實也是mybatis的缺點,正因為mybatis使用簡單,數據的可靠性、完整性的瓶頸便更多依賴於程序員對sql的使用水平上了。sql寫在xml里,雖然方便了修改、優化和統一瀏覽,但可讀性很低,調試也非常困難,也非常受限,無法像jdbc那樣在代碼里根據邏輯實現復雜動態sql拼接。mybatis簡單看就是提供了欄位映射和對象關系映射的jdbc,省去了數據賦值到對象的步驟而已,除此以外並無太多作為,不要把它想像成hibernate那樣強大,簡單小巧易用上手,方便瀏覽修改sql就是它最大的優點了。
mybatis適用於小型且程序員能力較低的項目和人群使用,對於中大型項目來說我並不推薦使用,如果覺得hibernate效率低的話(實際上也是使用不當所致,hibernate是實際上是不適用於擁有高負載的工程項目),還不如直接用spring提供的jdbc簡單框架(Template),同樣支持對象映射。

spring的優缺點:

優點
a.Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的API特製的framework,
Spring致力於解決剩下的問題。
b.Spring能消除在許多工程中常見的對Singleton的過多使用。根據我的經驗,這是一個很大的問題,它降低了系統的可測試性和面向對
象的程度。
c.通過一種在不同應用程序和項目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經對某個類
要尋找的是哪個魔法般的屬性項或系統屬性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性
。InversionofControl的使用(在下面討論)幫助完成了這種簡化。
d.?通過把對介面編程而不是對類編程的代價幾乎減少到沒有,Spring能夠促進養成好的編程習慣。
e.Spring被設計為讓使用它創建的應用盡可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。
f.使用Spring構建的應用程序易於單元測試。
g.Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或localEJBs來實現業務介面,卻不會影響
調用代碼。
h.Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提
供聲明性事務管理而不通過EJB容器,如果你僅僅需要與單個資料庫打交道,甚至不需要一個JTA實現。
i.Spring為數據存取提供了一個一致的框架,不論是使用的是JDBC還是O/Rmapping產品(如Hibernate)。
Spring確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。
缺點:使用人數不多、jsp中要寫很多代碼、控制器過於靈活,缺少一個公用控制器


以上內容,是我在網路上找到的,希望對你有幫助~~

⑶ mybatis和hibernate的區別是什麼

1、sql優化方面

Hibernate不需要編寫大量的SQL,就可以完全映射,提供了日誌、緩存、級聯(級聯比MyBatis強大)等特性,此外還提供HQL(Hibernate Query Language)對POJO進行操作。但會多消耗性能。

2、開發方面

MyBatis是一個半自動映射的框架,因為MyBatis需要手動匹配POJO、SQL和映射關系。

Hibernate是一個全表映射的框架,只需提供POJO和映射關系即可。

3、優勢方面

Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。

Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。

Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。

Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

MyBatis可以進行更為細致的SQL優化,可以減少查詢欄位。

MyBatis容易掌握,而Hibernate門檻較高。

(3)mybatissql性能優化擴展閱讀:

MyBatis是一個小巧、方便、高效、簡單、直接、半自動化的持久層框架,Hibernate是一個強大、方便、高效、復雜、間接、全自動化的持久層框架。所以對於性能要求不太苛刻的系統,比如管理系統、ERP等推薦使用Hibernate,而對於性能要求高、響應快、靈活的系統則推薦使用MyBatis。

⑷ 怎麼讓Mybatis執行sql速度快些

執行sql快一點的話,一個很好的方式是優化sql語句,類似很多分多次查詢的,最好放在sql語句來實現

⑸ Hibernate和MyBatis哪個好

使用Hibernate進行編程有以下好處:
1,消除了代碼的映射規則,它全部分離到了xml或者註解裡面去配置。
2,無需在管理資料庫連接,它也配置到xml裡面了。
3,一個會話中不需要操作多個對象,只需要操作Session對象。
4,關閉資源只需要關閉一個Session便可。
這就是Hibernate的優勢,在配置了映射文件和資料庫連接文件後,Hibernate就可以通過Session操作,非常容易,消除了jdbc帶來的大量代碼,大大提高了編程的簡易性和可讀性。Hibernate還提供了級聯,緩存,映射,一對多等功能。Hibernate是全表映射,通過HQL去操作pojo進而操作資料庫的數據。

Hibernate的缺點:
1,全表映射帶來的不便,比如更新時需要發送所有的欄位。
2,無法根據不同的條件組裝不同的SQL。
3,對多表關聯和復雜的sql查詢支持較差,需要自己寫sql,返回後,需要自己將數據封裝為pojo。
4,不能有效的支持存儲過程。
5,雖然有HQL,但是性能較差,大型互聯網系統往往需要優化sql,而hibernate做不到。

Mybatis:
為了解決Hibernate的不足,Mybatis出現了,Mybatis是半自動的框架。之所以稱它為半自動,是因為它需要手工匹配提供POJO,sql和映射關系,而全表映射的Hibernate只需要提供pojo和映射關系即可。
Mybatis需要提供的映射文件包含了一下三個部分:sql,映射規則,pojo。在Mybatis裡面你需要自己編寫sql,雖然比Hibernate配置多,但是Mybatis可以配置動態sql,解決了hibernate表名根據時間變化,不同條件下列不一樣的問題,同時你也可以對sql進行優化,通過配置決定你的sql映射規則,也能支持存儲過程,所以對於一些復雜和需要優化性能的sql查詢它就更加方便。Mybatis幾乎可以做到jdbc所有能做到的事情。

什麼時候使用Hibernate,Mybatis
Hibernate作為留下的Java orm框架,它確實編程簡易,需要我們提供映射的規則,完全可以通過IDE生成,同時無需編寫sql確實開發效率優於Mybatis。此外Hibernate還提供了緩存,日誌,級聯等強大的功能,但是Hibernate的缺陷也是十分明顯,多表關聯復雜sql,數據系統許可權限制,根據條件變化的sql,存儲過程等場景使用Hibernate十分不方便,而性能又難以通過sql優化,所以註定了Hibernate只適用於在場景不太復雜,要求性能不太苛刻的時候使用。
如果你需要一個靈活的,可以動態生成映射關系的框架,那麼Mybatis確實是一個最好的選擇。它幾乎可以替代jdbc,擁有動態列,動態表名,存儲過程支持,同時提供了簡易的緩存,日誌,級聯。但是它的缺陷是需要你提供映射規則和sql,所以開發工作量比hibernate要大些。

⑹ Mybatis是什麼以及Mybatis和JDBC的關系

Mybatis是什麼

mybatis是一個持久層ORM框架。它內部封裝了jdbc,使得開發更簡潔,更高效。

MyBatis可以通過xml或註解完成ORM映射關系配置。

Mybatis和JDBC的關系

JDBC是Java提供的一個操作資料庫的API; MyBatis是一個持久層ORM框架,底層是對JDBC的封裝。

MyBatis對JDBC操作資料庫做了一系列的優化:

(1) mybatis使用已有的連接池管理,避免浪費資源,提高程序可靠性。

(2) mybatis提供插件自動生成DAO層代碼,提高編碼效率和准確性。

(3)mybatis 提供了一級和二級緩存,提高了程序性能。

(4) mybatis使用動態SQL語句,提高了SQL維護。(此優勢是基於XML配置)

(5) mybatis對資料庫操作結果進行自動映射

MyBatis的優點和缺點

優點:

簡單:易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。

實用:提供了數據映射功能,提供了對底層數據訪問的封裝(例如ado.net),提供了DAO框架,可以使我們更容易的開發和配置我們的DAL層。

靈活:通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。

功能完整:提供了連接管理,緩存支持,線程支持,(分布式)事物管理,通過配置作關系對象映射等數據訪問層需要解決的問題。提供了DAO支持,並在DAO框架中封裝了ADO.NET,NHibernate和DataMapper。

增強系統的可維護性:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。

缺點:

sql工作量很大,尤其是欄位多、關聯表多時,更是如此。

sql依賴於資料庫,導致資料庫移植性差。

由於xml里標簽id必須唯一,導致DAO中方法不支持方法重載。

欄位映射標簽和對象關系映射標簽僅僅是對映射關系的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標簽,如果sql里沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關系的,即Collection的對象為null)。

DAO層過於簡單,對象組裝的工作量較大。

不支持級聯更新、級聯刪除。

編寫動態sql時,不方便調試,尤其邏輯復雜時。

提供的寫動態sql的xml標簽功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。使用不當,容易導致N+1的sql性能問題。