一驰贷、前言
擼完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)
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>