MyBatis架构分析

  咱们都知道Mybatis是一个很是小巧灵活的ORM框架,深受国内广大开发者的喜好,咱们知道它的出现某种程度是为了消除全部的JDBC代码和参数的手工设置以及结果集的封装问题;基于这个一点,咱们就能够知道MyBatis实际上就是对JDBC的封装,因此这节咱们就来看下MyBatis是怎样对JDBC封装的,从而能够借鉴学习其余优秀框架在解决问题之初从架构设计层面的思考,而后经过执行流程分析,进一步深入理解Mybatis的工做原理。
sql

首先咱们先来了解下MyBatis的架构设计
数据库

MyBatis 总共把功能架构分红了四部分:缓存

接口层

  提供给外部使用的接口API,开发人员经过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理, Mybatis提供了两种方式服务器

  1. 下面的这些方法就是在 SqlSession 接口中提供的接口方法
<T> T selectOne(String statement,Object parameter);

<E>List<E> selectList(String statement,Object parameter);

int insert(String statement,Object parameter);

int update(String statement,Object parameter);

int delete(String statement,Object parameter);
  1. Mapper代理的方式
    Mapper 代理的方式实际上就是经过建立接口(UserMapper 接口)的代理对象调用接口中的方法,最终执行方法调用是 Executor 对象,底层其实仍是调用的传统的 API 方法。

数据处理层

数据处理层这部分主要就 JDBC 的核心内容了,包括参数映射、类型转换、SQL 解析、 SQL 执行以及结果的封装,这部份内容就能够理解成 JDBC 的核心内容,这里有几个重要类mybatis

  • ParameterHandler∶ SQL的参数处理
  • ResultSetHandler∶ 结果集处理
  • StatementHandler:封装了JDBC Statement操做,设置参数,转换结果集
  • Executor∶ MyBatis 的执行器,用于执行增删改查操做

SQL解析

  MyBatis支持两种 SQL 解析的方式,一种 xml、一种是注解;两种方式对于一些基础的 CRUD 区别不大,使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句, Java 注解不只力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。所以,若是你须要作一些很复杂的操做,最好用 XML来映射语句架构

框架支撑层

这部分主要是框架抽取出来的通用组件包括数据源管理、事务管理、配置加载和缓存处理;为上层的数据处理层提供最基础的支撑app

  • 数据源管理
    数据源的管理对于持久层的框架来讲,可谓是很是的重要,稍有不慎就会浪费大量系统资源,MyBatis 也对此作了很好的支持, MyBatis 有三种内建的数据源类型 UNPOOLED、 POOLED 、 JNDI
    • UNPOOLED-这个数据源的实现会每次请求时打开和关闭链接
    • POOLED-这种数据源的实现利用"池"的概念,将 JDBC 链接对象组织起来,避免了建立新的链接实例时所必需的初始化和认证时间
    • JNDI-这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器能够集中或在外部配置数据源,而后放置一个 JNDI上下文的数据源引用。这种已经不用了

一般状况下,咱们是会使用 POOLED 的,他能够帮咱们节省不少宝贵的系统资源框架

  • 事务管理(transactionManager)
    在 MyBatis 中有两种类型的事务管理器(JDBC/MANAGED)它经过一个顶层的 Transaction 接口以及其不一样实现JdbcTransactionManagedTransaction 来实现对事务的管理∶
    • JDBC-这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源得到的链接来管理事务做用域,对应的实现类 JdbcTransaction
    • MANAGED-这个配置几乎没作什么。它从不提交或回滚一个链接,而是让容器来管理事务的整个生命周期(好比 JEE 应用服务器的上下文),对应的实现类ManagedTransaction

对事务的管理,在和 Spring 整合以后,一般会用 Spring 的事务管理器源码分析

  • 缓存处理
    缓存对于持久层框架来讲仍是很是重要的,必定程度上能够减小和数据库的交互, MyBatis 的提供了两种缓存机制,一级缓存和二级缓存
    • 一级缓存∶ 是 SqlSession 级别的缓存,也就是会话级别的,若是两个相同的查询,第二次的查询会直接先从缓存中去拿,一级缓存也是默认开启的,这部分咱们在源码分析的内容里会详细分析
    • 二级缓存:是 Mapper 级别的缓存,也就是一个 xxx.xml 内的查询是能够共用的,须要手动开启

引导层

  这部分是 MyBatis启动时核心配置文件的方式,严格来讲也能够不算在架构层面,不过MyBatis也是提供了两种方式,一个是xml的方式,也是用的比较多的,一种是使用 Java API的方式好比在配置环境的时候学习

  • xml的方式
<?xmL version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
        <!--省略-->
        </environment>
    </environments>
</configuration>
  • Java API的方式
Environment environment = new Environment("development",transactionFactory,dataSource);
Configuration configuration = new Configuration(environment)) ;

虽然 MyBatis提供这两种方式,可是通常状况下仍是使用 xml 的比较方便
小结:
这节内容主要从总体架构上分析了 Mybatis的架构设计,其实是对JDBC的作了一些抽取和封装,主要分红了三层

  • API接口层
  • 数据处理层
  • 框架通用模块
相关文章
相关标签/搜索