Mybatis源碼分析(一)Mybatis的架構(gòu)設(shè)計(jì)簡(jiǎn)介

一驰贷、前言

擼完Spring框架,我們接著下一個(gè)征程昨寞,Mybatis瞻惋。相對(duì)Spring而言,Mybatis就顯得短小精悍援岩。在本系列源碼開始之前歼狼,我們先來一起了解下Mybatis的相關(guān)知識(shí)點(diǎn)。

二享怀、什么是 MyBatis 羽峰?

MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL添瓷、存儲(chǔ)過程以及高級(jí)映射梅屉。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來配置和映射原生信息仰坦,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄履植。

三、架構(gòu)

Mybatis架構(gòu)

1悄晃、接口層

接口層主要定義的是與數(shù)據(jù)庫(kù)進(jìn)行交互的方式玫霎。在Mybatis中,交互分為兩種方式妈橄。

  • Mybatis提供的API

使用Mybatis提供的API進(jìn)行操作庶近,通過獲取SqlSession對(duì)象,然后根據(jù)Statement Id 和參數(shù)來操作數(shù)據(jù)庫(kù)眷蚓。

String statement = "com.viewscenes.netsupervisor.dao.UserMapper.getUserList";
List<User> result = sqlsession.selectList(statement);
  • 使用Mapper接口

事實(shí)上這個(gè)才是經(jīng)常使用的方式鼻种,面向接口編程嘛。每一個(gè)Mapper接口中的方法對(duì)應(yīng)著mapper.xml文件中的一個(gè)select/insert/update/delete節(jié)點(diǎn)沙热。節(jié)點(diǎn)中的ID就是接口中的方法名叉钥,在使用的時(shí)候直接調(diào)用接口方法即可罢缸。不過,值得注意的是投队,它最終執(zhí)行的還是sqlSession.select()枫疆、sqlSession.delete()

2敷鸦、數(shù)據(jù)處理層

這是Mybatis的核心息楔。它負(fù)責(zé)參數(shù)映射和動(dòng)態(tài)SQL生成,生成之后Mybatis執(zhí)行SQL語句扒披,并將返回的結(jié)果映射成自定義的類型值依。關(guān)于參數(shù)映射和結(jié)果集轉(zhuǎn)換,主要是靠typeHandlers碟案。為便于理解愿险,我們大概來看幾個(gè)類型處理器。

類型處理器 Java類型 JDBC類型
StringTypeHandler java.lang.String CHAR, VARCHAR
DateTypeHandler java.util.Date TIMESTAMP
BooleanTypeHandler java.lang.Boolean, boolean 數(shù)據(jù)庫(kù)兼容的 BOOLEAN
IntegerTypeHandler java.lang.Integer, int 數(shù)據(jù)庫(kù)兼容的 NUMERIC 或 INTEGER

3蟆淀、框架支撐層

  • 事務(wù)管理

對(duì)于ORM框架而言拯啦,事務(wù)管理是必不可少的一部分。不過熔任,一般情況下褒链,Mybatis都是和Spring搭配使用的,更多的是用Spring來接管事務(wù)管理疑苔。

  • 連接池

我們不能每次在執(zhí)行SQL的時(shí)候才去創(chuàng)建數(shù)據(jù)庫(kù)的連接甫匹。因?yàn)閯?chuàng)建連接是一個(gè)相對(duì)比較耗時(shí)的操作,通常做法是用一個(gè)列表保存提前創(chuàng)建好的N個(gè)連接惦费,用到的時(shí)候去拿兵迅,用完再還回去。關(guān)于數(shù)據(jù)庫(kù)連接池薪贫,業(yè)界有很多開源實(shí)現(xiàn)恍箭。比如C3P0、DBCP瞧省、Tomcat Jdbc Pool扯夭、BoneCP、Druid等鞍匾。

  • 緩存

為了提高數(shù)據(jù)利用率和減小服務(wù)器和數(shù)據(jù)庫(kù)的壓力交洗,Mybatis 會(huì)對(duì)于一些查詢提供會(huì)話級(jí)別的數(shù)據(jù)緩存,會(huì)將對(duì)某一次查詢橡淑,放置到SqlSession 中构拳,在允許的時(shí)間間隔內(nèi),對(duì)于完全相同的查詢,MyBatis 會(huì)直接將緩存結(jié)果返回給用戶置森,而不用再到數(shù)據(jù)庫(kù)中查找斗埂。

一級(jí)緩存是SqlSession級(jí)別的緩存,在同一個(gè)sqlSession中兩次執(zhí)行相同的sql語句暇藏,第一次執(zhí)行完畢會(huì)將數(shù)據(jù)庫(kù)中查詢的數(shù)據(jù)寫到緩存(內(nèi)存)蜜笤,第二次會(huì)從緩存中獲取數(shù)據(jù)將不再?gòu)臄?shù)據(jù)庫(kù)查詢,從而提高查詢效率盐碱,Mybtais默認(rèn)開啟一級(jí)緩存。

二級(jí)緩存是mapper級(jí)別的緩存沪伙,多個(gè)SqlSession去操作同一個(gè)Mapper的sql語句瓮顽,多個(gè)SqlSession去操作數(shù)據(jù)庫(kù)得到數(shù)據(jù)會(huì)存在二級(jí)緩存區(qū)域,多個(gè)SqlSession可以共用二級(jí)緩存围橡,二級(jí)緩存是跨SqlSession的暖混。要開啟二級(jí)緩存,需要在你的 SQL 映射文件中添加一行:<cache/>翁授。它會(huì)將所有的select語句緩存拣播,在執(zhí)行insert,update 和 delete 語句時(shí)會(huì)刷新緩存,緩存根據(jù)LRU算法來回收收擦。

4贮配、SQL配置方式

大部分時(shí)候我們都是通過XML方式來配置SQL,不過Mybatis也支持通過注解來配置塞赂,就像下面這樣泪勒。

@Select({"<script>", "select * from user"
        "</script>"})
List<ConsultContent> getUserList();

不過,不推薦這種方式來搞宴猾,除非你想挖坑....想想吧圆存,一個(gè)復(fù)雜的SQL,幾十行上百行仇哆,寫時(shí)一時(shí)爽沦辙,維護(hù)滿面淚。

5讹剔、引導(dǎo)層

引導(dǎo)層是配置和啟動(dòng)MyBatis 配置信息的方式油讯。MyBatis 提供兩種方式來引導(dǎo)MyBatis :基于XML配置文件的方式和基于Java API 的方式。

四辟拷、主要構(gòu)件

  • SqlSession
    作為MyBatis工作的主要頂層API撞羽,表示和數(shù)據(jù)庫(kù)交互的會(huì)話,完成必要數(shù)據(jù)庫(kù)增刪改查功能衫冻。

  • Executor
    MyBatis執(zhí)行器诀紊,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)隅俘。

  • StatementHandler
    封裝了JDBC Statement操作邻奠,負(fù)責(zé)對(duì)JDBC statement 的操作笤喳,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合碌宴。

  • ParameterHandler
    負(fù)責(zé)對(duì)用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù)杀狡。

  • ResultSetHandler
    負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類型的集合。

  • TypeHandler
    負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換贰镣。

  • MappedStatement
    MappedStatement維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封裝呜象。

  • SqlSource
    負(fù)責(zé)根據(jù)用戶傳遞的parameterObject,動(dòng)態(tài)地生成SQL語句碑隆,將信息封裝到BoundSql對(duì)象中恭陡,并返回。

  • BoundSql
    表示動(dòng)態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息上煤。

  • Configuration
    MyBatis所有的配置信息都維持在Configuration對(duì)象之中休玩。

五、版本

本系列采用的數(shù)據(jù)庫(kù)為MySQL劫狠,Mybatis版本為3.4.6拴疤。以下是pom文件坐標(biāo)。

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
        
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末独泞,一起剝皮案震驚了整個(gè)濱河市呐矾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阐肤,老刑警劉巖凫佛,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異孕惜,居然都是意外死亡愧薛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門衫画,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毫炉,“玉大人,你說我怎么就攤上這事削罩∶楣矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弥激,是天一觀的道長(zhǎng)进陡。 經(jīng)常有香客問我,道長(zhǎng)微服,這世上最難降的妖魔是什么趾疚? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上糙麦,老公的妹妹穿的比我還像新娘辛孵。我一直安慰自己,他們只是感情好赡磅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布魄缚。 她就那樣靜靜地躺著,像睡著了一般焚廊。 火紅的嫁衣襯著肌膚如雪冶匹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天咆瘟,我揣著相機(jī)與錄音徙硅,去河邊找鬼。 笑死搞疗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的须肆。 我是一名探鬼主播匿乃,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼豌汇!你這毒婦竟也來了幢炸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤拒贱,失蹤者是張志新(化名)和其女友劉穎宛徊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逻澳,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸天,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斜做。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苞氮。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓤逼,靈堂內(nèi)的尸體忽然破棺而出笼吟,到底是詐尸還是另有隱情,我是刑警寧澤霸旗,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布贷帮,位于F島的核電站,受9級(jí)特大地震影響诱告,放射性物質(zhì)發(fā)生泄漏撵枢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诲侮。 院中可真熱鬧镀虐,春花似錦、人聲如沸沟绪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绽慈。三九已至恨旱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坝疼,已是汗流浹背搜贤。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钝凶,地道東北人仪芒。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像耕陷,于是被迫代替她去往敵國(guó)和親掂名。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1 Mybatis入門 1.1 單獨(dú)使用jdbc編程問題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,306評(píng)論 0 38
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,511評(píng)論 0 4
  • 前言 主題是Mybatis一級(jí)和二級(jí)緩存的應(yīng)用及源碼分析拍柒。希望在本場(chǎng)chat結(jié)束后,能夠幫助讀者朋友明白以下三點(diǎn)猾警。...
    余平的余_余平的平閱讀 1,327評(píng)論 0 12
  • 葉落了,心未泯隆敢, 親愛的发皿, 我們能否再談一場(chǎng)? 擇一城筑公,遇一人雳窟, 為的不就是, 我愛你匣屡,你愛我封救,一輩子嗎? 真有幸...
    陌初閱讀 280評(píng)論 8 9
  • 城西三村積極做好第二輪脊髓灰質(zhì)炎疫苗接種工作 2017年第二輪脊髓灰質(zhì)炎疫苗接種工作于4月10日正式開始捣作,駐村工...
    笑對(duì)人生pxs閱讀 128評(píng)論 0 0