【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源码中文注解

 

posted @ 2020-06-30 16:36  得记点什么了  阅读(174)  评论(0编辑  收藏  举报