Mybatis源碼分析(一)Mybatis的架構設計簡介

1、前言

擼完Spring框架,咱們接着下一個征程,Mybatis。相對Spring而言,Mybatis就顯得短小精悍。在本系列源碼開始以前,咱們先來一塊兒瞭解下Mybatis的相關知識點。java

2、什麼是 MyBatis ?

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。mysql

3、架構

Mybatis架構

一、接口層

接口層主要定義的是與數據庫進行交互的方式。在Mybatis中,交互分爲兩種方式。算法

  • Mybatis提供的API

使用Mybatis提供的API進行操做,經過獲取SqlSession對象,而後根據Statement Id 和參數來操做數據庫。spring

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

事實上這個纔是常用的方式,面向接口編程嘛。每個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算法來回收。

四、SQL配置方式

大部分時候咱們都是經過XML方式來配置SQL,不過Mybatis也支持經過註解來配置,就像下面這樣。

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

不過,不推薦這種方式來搞,除非你想挖坑....想一想吧,一個複雜的SQL,幾十行上百行,寫時一時爽,維護滿面淚。

五、引導層

引導層是配置和啓動MyBatis 配置信息的方式。MyBatis 提供兩種方式來引導MyBatis :基於XML配置文件的方式和基於Java API 的方式。

4、主要構件

  • 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對象之中。

5、版本

本系列採用的數據庫爲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>
複製代碼
相關文章
相關標籤/搜索