MyBatis——执行原理解析

  1. 调用SqlSessionFactoryBuilder的build方法,传入配置文件
  2. 方法里面会创建一个XmlConfigBuilder文件解析器,将配置文件解析封装为一个Configuration对象,这同时会解析所有的映射xml文件,将insert、select、delete、update等标签解析封装成MappedStatement存入Configuration对象中
  3. 之后会调用build方法,传入Configuration对象,创建出一个SqlSessionFactory对象image-20210917112843922

  1. 调用SqlSessionFactory对象的openSession方法
  2. 方法内首先会从Configuration对象中获取一些信息创建事务
  3. 之后会调用newExecutor方法,根据全局配置中的ExecutorType创建相应的Executor对象(默认是SimpleExecutor),如果开启了二级缓存,则会创建CachingExecutor包装Executor。
  4. 然后会执行interceptChain.pluginAll方法,使用每一个拦截器包装Executor对象
  5. 最后创建DefaultSqlSession对象并返回(SqlSession对象中包含有Executor对象)image-20210917112834190

  1. 调用SqlSession的getMapper方法

  2. SqlSession中的getMapper方法会调用Configuration对象的getMapper方法

  3. Configuration对象的中getMapper方法会调用MapperRegister的getMapper方法得到MapperProxyFactory

  4. 之后调用MapperProxyFactory的newInstance方法得到一个MapperProxy(invocationHandler对象),然后用动态代理得到一个MapperProxy的代理对象

    image-20210917112814398


  1. MapperProxy调用invoke方法,方法内会将调用方法封装成MapperMethod对象,然后调用MapperMethod方法的execute方法执行

  2. 在execute方法内,会先判断方法的类型,然后会解析封装参数为一个map,之后调用sqlSession的selectOne方法(内部调用的还是selectList方法,只不过返回List的第一个对象)

  3. selectList方法内先调用configuration对象的getMappedStatement获取MappedStatement对象

  4. 然后调用executor的query(ms,xx,xx)方法,获取BoundSql,然后调用executor.query执行查询操作

    4.1 query执行中,先查询缓存,没有再调用queryFromDatabase查询数据库,查找到的数据也会存入缓存中

    4.2 查询前先创建StatementHandler,StatementHandler内部创建ParameterHandler和ResultSetHandler,这三个对象创建完后都会执行interceptChain.pluginAll方法

    4.3 StatementHandler会初始化Sql语句,ParameterHandler会给SQL语句设置参数(使用TypeHandler设置的参数),查询完后的结果交由ResultSetHandler处理(使用TypeHandler获取值)

  5. 查询完成之后就会关闭连接,并返回结果。

image-20210917112737205