源码流程

1、解析配置文件
2、创建工厂类
3、创建会话
4、会话操作数据库
加载配置文件
通过调用SqlSessionFactoryBuilder的build方法创建SqlSessionFactory
去解析mybatis的配置文件,本质上是创建了Configuration对象,解析的xml数据封装到Configuration内部的属性中,除了mybatis的一些基本设置,比如说数据源、别名等。Configuration维护了一个MappedStatement的map,mapper中的所有查询的sql节点都会封装到这个对象里面,key是mapper的namespace+sql的id,value就是这个对象
通过SqlSessionFactory.openSession方法得到SqlSession,SqlSession传入需要执行的sqlId和参数,调用selectList或者selectOne方法
通过这个id去MappedStatement的map拿到MappedStatement,调用执行器得到查询结果
通过反射将属性注入到返回的类对象中。

当解析mappers标签时,它会判断解析到的是mapper配置文件时,会再将对应配置文件中的增删改查标签一 一封装成MappedStatement对象,存入mappedStatements中。
当判断解析到接口时,会创建此接口对应的MapperProxyFactory代理工厂对象,存入HashMap中,key = 接口的字节码对象,value = 此接口对应的MapperProxyFactory对象。
MapperRegistry是Configuration中的一个属性,它内部维护一个HashMap用于存放mapper接口的工厂类,每个接口对应一个工厂类
sqlSession.getMapper(UserMapper.class),通过传入的这个接口类名从map里面拿到工厂类对象,工厂类newInstance方法,jdk动态代理生成接口的实现类,这个类实现了InvocationHandler接口,invoke方法中为我们实现了方法,本质上也是通过sqlSession.select方法执行,通过方法的名字当做sqlSession需要传入的id
image.png

  1. 首先加载 Mapper 配置的 SQL 映射文件,或者是注解的相关 SQL 内容。
  2. 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
  3. 创建会话,根据会话工厂,MyBatis 就可以通过它来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含了对数据库操作的增、删、改、查方法。
  4. 创建执行器,因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
  5. 封装 SQL 对象,在这一步,执行器将待处理的 SQL 信息封装到一个对象中(MappedStatement),该对象包括 SQL 语句、输入参数映射信息(Java 简单类型、HashMap 或 POJO)和输出结果映射信息(Java 简单类型、HashMap 或 POJO)。
  6. 操作数据库,拥有了执行器和 SQL 信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。
    mybatis缓存
    一级缓存(Local Cache)作用于SqlSession,对于同一个session会话,才会起作用,存放在执行器(Executor)中
    默认开启
    image.png
    二级缓存 作用域 namespace,可以解决跨会话共享
    在mybatis-config.xml 中开启全局二级缓存开关,也可以单独在mapper.xml中加上 开启二级缓存开关
    二级缓存作用在一级缓存之前,放在BaseExecutor的装饰者CachingExecutor中