Mybatis的前世今生

Java_老男孩發表於2019-04-19

一、MyBatis的簡介

MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。

MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。

MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄.

二、MyBatis的歷史

原是apache的一個開源專案iBatis, 2010年6月這個專案由apache software foundation遷移到了google code,隨著開發團隊轉投Google Code旗下,ibatis3.x正式更名為Mybatis ,程式碼於2013年11月遷移到Github

iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL MapsData Access Objects(DAO)

Mybatis的前世今生

三、MyBatis的基本說明

(1)MyBatis是一個工作在持久層的框架,它不再是一個標準的ORM框架

我們先看看Hibernate是如何對資料庫進行操作

image

我們再來看看Mybatis如何對資料庫進行操作

Mybatis的前世今生

因為它只管理了SQL語句和Java之間的關聯和對映,生成的實體類將不會自動建立表了,而是我們程式設計師自己去建立,你這邊寫的SQL語句是自己寫,而不是Hibernate通過save或者delete幫助我們進行建立。

(2)、前身是ibatis, 在ibatis3.x 時,更名為 MyBatis

Mybatis的前世今生

所以說,在面試或者開發的時候會聽到IBatis,MyBatis,其實指的是一個東西。

(3)、MyBatis在java和sql之間提供更靈活的對映方案,MyBatis將sql語句和方法實現,直接寫到xml檔案中,實現和java程式解耦

為何這樣說,MyBatis將介面和SQL對映檔案進行分離,相互獨立,但又通過反射機制將其進行動態繫結。

其實它底層就是Mapper代理工廠[MapperRegistry]和Mapper標籤對映[MapperStatement],它們兩個說穿了就是Map容器,就是我們常見的HashMapConcurrentHashMap

在後面我會具體分析MyBatis四大元件的工作原理

Mybatis的前世今生

所以說,MyBatis使用面向介面的方式這種思想很好的實現瞭解耦和的方式,同時易於開發者進行定製和擴充套件,比如我們熟悉的通用Mapper和分頁外掛pageHelper,方式也非常簡單,後面會詳細進行說明。

(4)、 mybatis只負責sql, 建庫建表的工作由程式設計師完成

在使用Hibernate的時候,建表的工作也是由框架幫助我們完成,Hibernate本身就是一個全自動的框架,MyBatis是一個半自動的框架,建表在很多時候我們需要對資料型別和欄位進行更信詳細的定義和分析,所以說,在實際的生產環境中,MyBatis的這種方式更加符合開發者的習慣

小結:Hibernate相對MyBatis的差異化和區別

(1).Hibernate是一個標準的ORM框架,MyBatis不再是一個標準的ORM框架,它工作在持久層

(2).Hibernate是一個全自動的框架,MyBatis是一個半自動的框架

(3).Hibernate將對資料庫的操作全封閉化,MyBatis將其透明化[SQL編寫]

(4).MyBatis相對Hibernate來說更加優秀,更加流行

(5).Hibernate是一個重量級的框架,MyBatis相對來說更加輕量級,類似Struts2SpringMVC

(6).Hibernate的學習成本更高,MyBatis相對來說更低

(7).從耦合度來說,MyBatis實現了最大程度化的解耦,通過面向介面的方式來進行解決

MyBatis很好的借鑑了Hibernate的好的一面,那就是查詢後將資料結果集對映的封裝工作還是交給我來完成,編寫SQL由你自己去完成,處理複雜的自定義結果集對映的權利也交給你來做。

簡單的工作封裝交給我來做,所以說,這對於Hibernate來說是致命的,因為Hibenate將對錶的操作轉換為對物件的操作,只需通過操作物件就能幫助我們傳送SQL,這是它本身最大的特點優勢。

但是,所有的操作都受限於讓Hibernate本身來完成,Hibernate最大的優勢反而變成了劣勢,試想,一位優秀的DBA,對原生的SQL進行了優化,但受限於Hibernate本身的特性,有種渾身無力使的感覺,這也註定HibernateMyBatis取代只是時間問題。

四、為什麼要使用MyBatis?

MyBatis是一個半自動化的持久化層框架。

jdbc程式設計—當我們使用jdbc持久化的時候,sql語句被硬編碼到java程式碼中。這樣耦合度太高。程式碼不易於維護。在實際專案開發中會經常新增sql或者修改sql,這樣我們就只能到java程式碼中去修改。

Hibernate和JPA

長難複雜SQL,對於Hibernate而言處理也不容易

內部自動生產的SQL,不容易做特殊優化。

基於全對映的全自動框架,javaBean存在大量欄位時無法只對映部分欄位。導致資料庫效能下降。

Mybatis的前世今生

對開發人員而言,核心sql還是需要自己優化

sql和java編碼分開,功能邊界清晰,一個專注業務、一個專注資料。

可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO對映成資料庫中的記錄。成為業務程式碼+底層資料庫的媒介

五、動態SQL對映

如果說MyBatis的SQL對映,介面和檔案分離這種方式決定了MyBatis的優勢,那麼MyBatis的動態SQL直接決定了MyBatis它絕對的霸主地位,我們知道後端幾乎都是Spring家族的天下,那麼它肯定想過使用自家的產品將MyBatis淘汰,它確實做過,但是沒有幹掉MyBatis,所有MyBatis藉助這兩大優勢和特點,當然MyBatis還有很多優秀的地方,慢慢替代了Hibernate

在一個實際的專案中,sql語句往往是比較複雜的,為了滿足更加複雜的業務需求,MyBatis的設計者,提供了動態生成SQL的功能,動態SQL就是根據不同的情況在同一個業務邏輯裡面產生的SQL語句是變化的,也就是說根據實際的業務需求同樣一段程式碼產生SQL語句是不一樣的,。

在實際的開發中,我們會遇到比較複雜的業務需求,在這種複雜的業務需求中,我們可能需要傳送好幾個SQL語句才能夠去處理的,那麼如果我們可以對這個SQL語句進行適當的程式設計,那麼這個SQL語句將會變得非常強大,那麼比如說有些資料庫是支援儲存過程的,這個儲存過程其實就是直接使用SQL語句來進行程式設計,可以根據你不同的情況動態的產生SQL語句

如果我們有相同的業務需求,在這個業務需求中有不同的情況,那我根據不同的情況在同一種請求裡面產生的SQL語句也不一樣即解決了你要學習儲存過程的麻煩,而且儲存過程整合起來也很痛苦,同時還解決了可以靈活的適用複雜的業務需求,所以這也是MyBatis優秀的原因,也是它為何能夠流行起來

MyBatis它研究了很多地方,讓程式更加靈活,它能夠設計一個產品,快速的簡潔的解決一些需求這才是最好的,這些其實他也能解決,寫一個儲存過程即可,但是儲存過程一些,程式碼的複雜度又變高了

MyBatis就讓你在Mapper裡面可以使用if,for迴圈,多分支語句根據不同的情況產生不同的SQL語句,這就是MyBatis厲害的地方

所以MyBatis在一定程度上就有點把Hibernate就讓它有點受不了的地方,因為MyBatis業務需求設計的太好了,這也是目前SSM為何比SSH更流行的原因所以大家一看,好多年解決的問題,設計的問題別人都幫助我們進行了解決,沒有理由不用它

哪怕現在流行的分散式和微服務架構,在持久層來說,很大程度上還是使用MyBatis來做持久層,雖然越來越多的專案都是基於SpringBoot,但持久層還是Mybatis用的非常多

image

MyBatis為何在一定程度上它能夠讓大家喜歡,用它,就是他讓以前的工作變得更加簡單容易,而不是變得更難了,如果一樣東西變得越來越難,那就沒人用它

但是隨著技術的發展,將來還會有更好的框架來替代MyBatis,這是肯定的,技術本身就是要不斷髮展的,如果技術不再發展了,那麼我們程式設計師的價值就會大大降低,因為不需要在學習了,幾次網際網路的高潮都是由於新技術的產生.導致程式設計師的薪水大幅度增長

六、總結

我們通過不同的角度去分析,通過和同期的競爭對手以及在實際的生產環境中,MyBatis都是很優秀的一個持久層框架,我們必須好好學習並掌握它,不光是它的使用,以及它底層的基本原理,同時也非常感謝大家的支援!

相關文章