Mybatis源码分析(一)Mybatis的架构设计简介

一、前言

撸完Spring框架,我们接着下一个征程,Mybatis。相对Spring而言,Mybatis就显得短小精悍。在本系列源码开始之前,我们先来一起了解下Mybatis的相关知识点。

二、什么是 MyBatis ?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

三、架构

Mybatis架构

1、接口层

接口层主要定义的是与数据库进行交互的方式。在Mybatis中,交互分为两种方式。

  • Mybatis提供的API

使用Mybatis提供的API进行操作,通过获取SqlSession对象,然后根据Statement Id 和参数来操作数据库。

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()

2、数据处理层

这是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

3、框架支撑层

  • 事务管理

对于ORM框架而言,事务管理是必不可少的一部分。不过,一般情况下,Mybatis都是和Spring搭配使用的,更多的是用Spring来接管事务管理。

  • 连接池

我们不能每次在执行SQL的时候才去创建数据库的连接。因为创建连接是一个相对比较耗时的操作,通常做法是用一个列表保存提前创建好的N个连接,用到的时候去拿,用完再还回去。关于数据库连接池,业界有很多开源实现。比如C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等。

  • 缓存

为了提高数据利用率和减小服务器和数据库的压力,Mybatis 会对于一些查询提供会话级别的数据缓存,会将对某一次查询,放置到SqlSession 中,在允许的时间间隔内,对于完全相同的查询,MyBatis 会直接将缓存结果返回给用户,而不用再到数据库中查找。

一级缓存是SqlSession级别的缓存,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率,Mybtais默认开启一级缓存。

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。要开启二级缓存,需要在你的 SQL 映射文件中添加一行:<cache/>。它会将所有的select语句缓存,在执行insert,update 和 delete 语句时会刷新缓存,缓存根据LRU算法来回收。

4、SQL配置方式

大部分时候我们都是通过XML方式来配置SQL,不过Mybatis也支持通过注解来配置,就像下面这样。

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

不过,不推荐这种方式来搞,除非你想挖坑....想想吧,一个复杂的SQL,几十行上百行,写时一时爽,维护满面泪。

5、引导层

引导层是配置和启动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>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 3,338评论 0 38
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,700评论 0 4
  • 前言 主题是Mybatis一级和二级缓存的应用及源码分析。希望在本场chat结束后,能够帮助读者朋友明白以下三点。...
    余平的余_余平的平阅读 1,359评论 0 12
  • 叶落了,心未泯, 亲爱的, 我们能否再谈一场? 择一城,遇一人, 为的不就是, 我爱你,你爱我,一辈子吗? 真有幸...
    陌初阅读 296评论 8 9
  • 城西三村积极做好第二轮脊髓灰质炎疫苗接种工作 2017年第二轮脊髓灰质炎疫苗接种工作于4月10日正式开始,驻村工...
    笑对人生pxs阅读 134评论 0 0