MyBatis初始化流程🛷 以下代码为例🎉 🎇可对应源码阅读 MyBatis初始化流程✨ SqlSessionFactoryBuilder XMLConfigBuilder Configuration DefaultSqlSessionFactory 1、创建对象 2、build(inputStream) 3、创建解析器parser 4、解析每一个标签把详细信息保存在Configuration中 5、解析mapper.xml 6、返回Configuration 7、build(Configuration) 8、new DefaultSqlSessionFactory(config) 9、返回创建的DefaultSqlSessionFactory,包含了保存全局配置信息的Configuration SqlSessionFactoryBuilder XMLConfigBuilder Configuration DefaultSqlSessionFactory MyBatis初始化流程 Mapper.xml中的每一个元素信息解析出来并保存在全局配置中,讲增删改查标签每一个属性解析出来封装成一个MappedStatement;一个MappedStatement就代表一个增删改查标签的详细信息 获取SqlSession流程🪁 DefaultSqlSessionFactory Configuration Executor 1、openSession() 2、openSessionFromDataSource() 3、获取一些信息,创建tx 4、newExecutor() 5、根据参数,选择合适的Executor实现 6、如果开启了二级缓存,则创建CachingExecutor 二级缓存默认为true,所以这里会 创建CachingExecutor,此处使用了装饰器模式 7、遍历所有拦截器,代理exceutor executor = (Executor) interceptorChai n.pluginAll(executor) 返回根据配置创建的Executor对象 创建并返回DefaultSqlSession DefaultSqlSession中包含了Executor和Configuration DefaultSqlSessionFactory Configuration Executor 获取SqlSession流程 获取Mapper代理对象🎿 DefaultSqlSession Configuration MapperRegistry MapperProxyFactory MapperProxy 1、getMapper() 2、getMapper() 3、getMapper 4、查找指定type对应 的MapperProxyFactor y对象 5、newInstance(sqlSession) 6、创建实现了mapperInterface 接口的代理对象 创建MapperProxy,他是一个 InvocationHandler,JDK动态代理核 心对象 7、返回MapperProxy代理对象 返回 DefaultSqlSession Configuration MapperRegistry MapperProxyFactory MapperProxy 获取Mapper代理对象 执行流程🎄 MapperProxy MapperMethod DefaultSqlSession Executor CachingExecutor BaseExecutor SimpleExecutor StatementHandler invoke() 判断增删改查类型 包装参数为map集合 sqlSession.selectOne() selectList() 获取MappedStatement MappedStatement中包含了方法对 应的标签详细信息,包含了SQL的信息 executor.query() 获取BoundSql对象 query() 检查是否使用了二级缓存 如果存在二级缓存,则返回缓存中信息 如果不存在缓存,则调用 被装饰的Executor执行query() 检查本地缓存(一级缓存)localCache 存在本地缓存(一级缓存)获取缓存中保存的输出类型参数,并设置到用户传入的实参(parameter)对象中 没有本地缓存则调用queryFromDatabase(), 查询后也会放到一级缓存中 调用doQuery()方法, 完成数据库查询操作,并返回结果对象 创建StatementHandler对象 创建StatementHandler 此处会遍历是否有拦截器存 在,interceptorChain.pluginAll() prepareStatement()完成Statement 的创建和初始化与处理占位符 预编译sql产生PreparedStatementHandler对象 调用StatementHandler设置参数 调用TypeHandler给预编译SQL设置参数 查出数据使用ResultSetHandler处理结果;使用TypeHandler获取value值 后续关闭连接等操作 返回数据 MapperProxy MapperMethod DefaultSqlSession Executor CachingExecutor BaseExecutor SimpleExecutor StatementHandler 获取Mapper代理对象