Mybatis的前世此生

1、MyBatis的簡介

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

MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。程序員

MyBatis可使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄.面試

2、MyBatis的歷史

原是apache的一個開源項目iBatis, 2010年6月這個項目由apache software foundation遷移到了google code,隨着開發團隊轉投Google Code旗下,ibatis3.x正式改名爲Mybatis ,代碼於2013年11月遷移到Githubsql

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

3、MyBatis的基本說明

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

咱們先看看Hibernate是如何對數據庫進行操做編程

image

咱們再來看看Mybatis如何對數據庫進行操做後端

由於它只管理了SQL語句和Java之間的關聯和映射,生成的實體類將不會自動建立表了,而是咱們程序員本身去建立,你這邊寫的SQL語句是本身寫,而不是Hibernate經過save或者delete幫助咱們進行建立。mybatis

(2)、前身是ibatis, 在ibatis3.x 時,改名爲 MyBatis架構

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

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

爲什麼這樣說,MyBatis將接口和SQL映射文件進行分離,相互獨立,但又經過反射機制將其進行動態綁定。

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

在後面我會具體分析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取代只是時間問題。

4、爲何要使用MyBatis?

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

jdbc編程—當咱們使用jdbc持久化的時候,sql語句被硬編碼到java代碼中。這樣耦合度過高。代碼不易於維護。在實際項目開發中會常常添加sql或者修改sql,這樣咱們就只能到java代碼中去修改。

Hibernate和JPA

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

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

基於全映射的全自動框架,javaBean存在大量字段時沒法只映射部分字段。致使數據庫性能降低。

對開發人員而言,核心sql仍是須要本身優化

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

可使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJO映射成數據庫中的記錄。成爲業務代碼+底層數據庫的媒介

5、動態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,這是確定的,技術自己就是要不斷髮展的,若是技術再也不發展了,那麼咱們程序員的價值就會大大下降,由於不須要在學習了,幾回互聯網的高潮都是因爲新技術的產生.致使程序員的薪水大幅度增加

6、總結

咱們經過不一樣的角度去分析,經過和同期的競爭對手以及在實際的生產環境中,MyBatis都是很優秀的一個持久層框架,咱們必須好好學習並掌握它,不光是它的使用,以及它底層的基本原理,這些放在後面會詳細介紹,應你們要求,編寫MyBatis系列的文章,同時也很是感謝你們的支持!


針對於上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案作成了文檔和架構視頻資料免費分享給你們(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分佈式、高併發等架構技術資料),但願能幫助到您面試前的複習且找到一個好的工做,也節省你們在網上搜索資料的時間來學習,也能夠關注我一下之後會有更多幹貨分享。

資料獲取方式: QQ羣搜索「708-701-457」 便可免費領取



相關文章
相關標籤/搜索