【MyBatis】MyBatis源码架构

    基于MyBatis3.4.4

1、架构图

 

    针对接口层两种调用方式,简单提供两种演示代码

     

  /**
   * 基于statementId
   * @throws IOException
   */
  public void test1() throws IOException {
    //1、读取配置文件 读成字节输入流
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

    //2.解析配置文件 封装configuration对象  创建DefaultSqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //3.创建DefaultSqlSessionFactory实例对象 设置事务不自动提交,完成executor对象创建
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //4. 根据statementId来获取configuration中map集合中到指定的mappedStatement对象
    //   将查询任务委派给executor对象
    List<Object> objects = sqlSession.selectList("namespace.id");

  }

  /**
   * mapper代理方式
   */
  public void test2() throws IOException {
    //1、读取配置文件 读成字节输入流
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

    //2.解析配置文件 封装configuration对象  创建DefaultSqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    //3.创建DefaultSqlSessionFactory实例对象 设置事务不自动提交,完成executor对象创建
    SqlSession sqlSession = sqlSessionFactory.openSession();

    IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
    mapper.findAllUser();
  }

2、执行流程

2.1、Executor功能

 1. 简单执行器

  simpleExecutor,每次执行SQL需要预编译SQL语句。


2. 可重用执行器

  ReuseExecutor,同一SQL语句执行只需要预编译一次SQL语句

3. 批处理执行器

  BatchExecutor,只针对修改操作的SQL语句预编译一次,并且需要手动刷新SQL执行才生效。

4. 执行器抽象类

  BaseExecutor,执行上面3个执行器的重复操作,比如一级缓存、doQuery、doUpdate方法。

5. 二级缓存

  CachingExecutor,与一级缓存的区别:一级缓存查询数据库操作后会直接缓存,二级缓存需要当次数据库操作提交事务后才能进行缓存(二级缓存跨线程处理,一级缓存不用)。 

 

link:拉钩教育网MyBatis架构源码以及设计模式分析

   鲁班教育网MyBatis源码暴力解析(Executor、Cache)

       MyBatis GitHub

       MyBatis源码中文注解

原文地址:https://www.cnblogs.com/kbian/p/13214535.html