MyBatis架构分析

我们都知道Mybatis是一个非常小巧灵活的ORM框架,深受国内广大开发者的喜爱,我们知道它的出现某种程度了是为了消除所有的 JDBC 代码和参数的手工设置以及结果集的封装问题;基于这个一点,我们就可以知道MyBatis实际上就是对JDBC的封装 ,所以这节我们就来看下MyBatis是怎样对JDBC封装的,从而可以借鉴学习其他优秀框架在解决问题之初从架构设计层面的思考,然后通过执行流程分析,进一步深刻理解Mybatis的工作原理

图片描述

Mybatis的架构设计

首先我们先来了解下MyBatis的架构设计

图片描述

MyBatis总共把功能架构分成了四部分

  1. 接口层

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

    1. 传统的方式

      下面的这些方法就是在SqlSession接口中提供的接口方法

      /**
       * Retrieve a single row mapped from the statement key and parameter.
       * @param <T> the returned object type
       * @param statement Unique identifier matching the statement to use.
       * @param parameter A parameter object to pass to the statement.
       * @return Mapped object
       */
      <T> T selectOne(String statement, Object parameter);
    /**
       * Retrieve a list of mapped objects from the statement key and parameter.
       * @param <E> the returned list element type
       * @param statement Unique identifier matching the statement to use.
       * @param parameter A parameter object to pass to the statement.
       * @return List of mapped object
       */
      <E> List<E> selectList(String statement, Object parameter);
     /**
       * Execute an insert statement with the given parameter object. Any generated
       * autoincrement values or selectKey entries will modify the given parameter
       * object properties. Only the number of rows affected will be returned.
       * @param statement Unique identifier matching the statement to execute.
       * @param parameter A parameter object to pass to the statement.
       * @return int The number of rows affected by the insert.
       */
      int insert(String statement, Object parameter);
     /**
       * Execute an update statement. The number of rows affected will be returned.
       * @param statement Unique identifier matching the statement to execute.
       * @param parameter A parameter object to pass to the statement.
       * @return int The number of rows affected by the update.
       */
      int update(String statement, Object parameter);
     /**
       * Execute a delete statement. The number of rows affected will be returned.
       * @param statement Unique identifier matching the statement to execute.
       * @param parameter A parameter object to pass to the statement.
       * @return int The number of rows affected by the delete.
       */
      int delete(String statement, Object parameter);
     // 此处省略一万字....
    
    1. Mapper代理的方式

      Mapper代理的方式实际上就是通过创建接口(UserMapper接口)的代理对象调用接口中的方法,最终执行方法调用是Executor对象,底层其实还是调用的传统的API方法;这部分内容我们在源码分析的时候还会在详细分析。

  2. 数据处理层

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

    • ParameterHandler:SQL的参数处理
    • ResultSetHandler:结果集处理
    • StatementHandler: 封装了JDBC Statement操作,设置参数,转换结果集
    • ExecutorMyBatis的执行器,用于执行增删改查操作
  3. 框架支撑层

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

    • 数据源管理

      数据源的管理对于持久层的框架来说,可谓是非常的重要,稍有不慎就会浪费大量系统资源,MyBatis也对此做了很好的支持,MyBatis有三种内建的数据源类型UNPOOLEDPOOLEDJNDI

      • 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内的查询是可以共用的,需要手动开启
    • SQL解析

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

  4. 引导层

    这部分是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接口层
  • 数据处理层
  • 框架通用模块

本文来自慕课网 java架构师课程 笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值