擼完Spring框架,咱們接着下一個征程,Mybatis。相對Spring而言,Mybatis就顯得短小精悍。在本系列源碼開始以前,咱們先來一塊兒瞭解下Mybatis的相關知識點。java
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。mysql
接口層主要定義的是與數據庫進行交互的方式。在Mybatis中,交互分爲兩種方式。算法
使用Mybatis提供的API進行操做,經過獲取SqlSession對象,而後根據Statement Id 和參數來操做數據庫。spring
String statement = "com.viewscenes.netsupervisor.dao.UserMapper.getUserList";
List<User> result = sqlsession.selectList(statement);
複製代碼
事實上這個纔是常用的方式,面向接口編程嘛。每個Mapper接口中的方法對應着mapper.xml文件中的一個select/insert/update/delete
節點。節點中的ID就是接口中的方法名,在使用的時候直接調用接口方法便可。不過,值得注意的是,它最終執行的仍是sqlSession.select()、sqlSession.delete()
。sql
這是Mybatis的核心。它負責參數映射和動態SQL生成,生成以後Mybatis執行SQL語句,並將返回的結果映射成自定義的類型。關於參數映射和結果集轉換,主要是靠typeHandlers。爲便於理解,咱們大概來看幾個類型處理器。數據庫
類型處理器 | Java類型 | JDBC類型 |
---|---|---|
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
DateTypeHandler | java.util.Date | TIMESTAMP |
BooleanTypeHandler | java.lang.Boolean, boolean | 數據庫兼容的 BOOLEAN |
IntegerTypeHandler | java.lang.Integer, int | 數據庫兼容的 NUMERIC 或 INTEGER |
對於ORM框架而言,事務管理是必不可少的一部分。不過,通常狀況下,Mybatis都是和Spring搭配使用的,更多的是用Spring來接管事務管理。編程
咱們不能每次在執行SQL的時候纔去建立數據庫的鏈接。由於建立鏈接是一個相對比較耗時的操做,一般作法是用一個列表保存提早建立好的N個鏈接,用到的時候去拿,用完再還回去。關於數據庫鏈接池,業界有不少開源實現。好比C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid
等。緩存
爲了提升數據利用率和減少服務器和數據庫的壓力,Mybatis 會對於一些查詢提供會話級別的數據緩存,會將對某一次查詢,放置到SqlSession 中,在容許的時間間隔內,對於徹底相同的查詢,MyBatis 會直接將緩存結果返回給用戶,而不用再到數據庫中查找。bash
一級緩存是SqlSession級別的緩存,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將再也不從數據庫查詢,從而提升查詢效率,Mybtais默認開啓一級緩存。服務器
二級緩存是mapper級別的緩存,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession去操做數據庫獲得數據會存在二級緩存區域,多個SqlSession能夠共用二級緩存,二級緩存是跨SqlSession的。要開啓二級緩存,須要在你的 SQL 映射文件中添加一行:。它會將全部的select語句緩存,在執行insert,update 和 delete 語句時會刷新緩存,緩存根據LRU算法來回收。
大部分時候咱們都是經過XML方式來配置SQL,不過Mybatis也支持經過註解來配置,就像下面這樣。
@Select({"<script>", "select * from user"
"</script>"})
List<ConsultContent> getUserList();
複製代碼
不過,不推薦這種方式來搞,除非你想挖坑....想一想吧,一個複雜的SQL,幾十行上百行,寫時一時爽,維護滿面淚。
引導層是配置和啓動MyBatis 配置信息的方式。MyBatis 提供兩種方式來引導MyBatis :基於XML配置文件的方式和基於Java API 的方式。
SqlSession 做爲MyBatis工做的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能。
Executor MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護。
StatementHandler 封裝了JDBC Statement操做,負責對JDBC statement 的操做,如設置參數、將Statement結果集轉換成List集合。
ParameterHandler 負責對用戶傳遞的參數轉換成JDBC Statement 所須要的參數。
ResultSetHandler 負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合。
TypeHandler 負責java數據類型和jdbc數據類型之間的映射和轉換。
MappedStatement MappedStatement維護了一條<select|update|delete|insert>節點的封裝。
SqlSource 負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回。
BoundSql 表示動態生成的SQL語句以及相應的參數信息。
Configuration MyBatis全部的配置信息都維持在Configuration對象之中。
本系列採用的數據庫爲MySQL,Mybatis版本爲3.4.6。如下是pom文件座標。
<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>
複製代碼