MyBatis——执行原理解析
MyBatis——执行原理解析
- 调用SqlSessionFactoryBuilder的build方法,传入配置文件
- 方法里面会创建一个XmlConfigBuilder文件解析器,将配置文件解析封装为一个Configuration对象,这同时会解析所有的映射xml文件,将insert、select、delete、update等标签解析封装成MappedStatement存入Configuration对象中
- 之后会调用build方法,传入Configuration对象,创建出一个SqlSessionFactory对象
- 调用SqlSessionFactory对象的openSession方法
- 方法内首先会从Configuration对象中获取一些信息创建事务
- 之后会调用newExecutor方法,根据全局配置中的ExecutorType创建相应的Executor对象(默认是SimpleExecutor),如果开启了二级缓存,则会创建CachingExecutor包装Executor。
- 然后会执行interceptChain.pluginAll方法,使用每一个拦截器包装Executor对象
- 最后创建DefaultSqlSession对象并返回(SqlSession对象中包含有Executor对象)
调用SqlSession的getMapper方法
SqlSession中的getMapper方法会调用Configuration对象的getMapper方法
Configuration对象的中getMapper方法会调用MapperRegister的getMapper方法得到MapperProxyFactory
之后调用MapperProxyFactory的newInstance方法得到一个MapperProxy(invocationHandler对象),然后用动态代理得到一个MapperProxy的代理对象
MapperProxy调用invoke方法,方法内会将调用方法封装成MapperMethod对象,然后调用MapperMethod方法的execute方法执行
在execute方法内,会先判断方法的类型,然后会解析封装参数为一个map,之后调用sqlSession的selectOne方法(内部调用的还是selectList方法,只不过返回List的第一个对象)
selectList方法内先调用configuration对象的getMappedStatement获取MappedStatement对象
然后调用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获取值)
查询完成之后就会关闭连接,并返回结果。