MyBatis架构和源码分析

MyBatis架构和源码分析

  MyBatis中步骤

  a.获取SqlSessionFactory对象

  b.获取Sqlsession对象

  c.获取XxxMapper对象(代理接口中的方法、mapper.xml中的<select>等标签)

  d.执行<select>等标签中定义的SQL语句

 

a.获取SqlSessionFactory对象

parser解析器

D:\javafile_idea\MyBatisProject\src\mybatis-3.5.1.jar!\org\apache\ibatis\builder\xml\XMLConfigBuilder.class

通过parseConfiguration()在configuration标签,设置了properties、setting、environments等标签属性

  将所有的配置信息放在了configuration对象中

  解析所有的XxxMapper.xml文件(分析其中的增删改查标签)

  <select id="" resultType="">等属性通过parseStatementNode()解析的

  会将XxxMapper.xml中的select等标签解析成MappedStatement对象

  即MappedStatement对象就是select等标签

MappedStatement->存在于Configuration中

environment->存在于Configuration中

 

所有的配置信息、增删改标签 全部存在于Configuration中==》

Configuration又存在DefaultSqlSessionFactory对象中(SqlSessionFactory)

 

 SqlSessionFactory对象→DefaultSqlSessionFactory→Configuration→包含一切配置信息

 b.获取Sqlsession对象

  configuration.newExecutor(tx,execType)->SimpleExecutor

根据不同的类型execType,产生不同的Executor,并且会对执行器进行拦截操作

executor=(Executor)interceptorChain.pluginAll(executor);

通过装饰模式,将刚才产生的executor包装成一个更加强大的executor

作用:以后我们如果要给MyBatis写自己的插件,就可以通过拦截器实现。

插件开发:1.写插件2.放入拦截器

 

  返回DefaultSqlSession(configuration,executor,事务)

SqlSession->openSessionFromDataSource()->DefaultSqlSession对象

SqlSession->DefaultSqlSession对象->执行SQL

 c/d.获取XxxMapper对象、执行

  执行增删改查->MapperProxy/invoke()->InvocationHandler:JDK动态代理接口

用到了动态代理模式:增删改查->代理对象MapperProxy->代理对象帮我"代理执行"增删改查

 

XxxMapper代理对象:MapperProxy对象

 

mapperMethod.execute(sqlSession,args):实际调用增删改查的方法,依靠了sqlSession中的configuration和executor..

处理增删改查方法的参数:method.converArgsToSqlCommandParam(args);

如果参数是0个,return null;

如果参数是1,返回第一个

如果有多个参数,放入map中

 

查询方法:selectOne()->selectList():configuration.getMappedStatement()即获取到用于增删改查的对象

 

boundSql:将我们写的SQL和参数值进行拼接后的对象,即最终能被真正执行的SQL

执行Sql是通过Executor

如果缓存中没有要查询的内容,则进入数据库真实查询:queryFromDatabase()

mybatis使用的jdbc对象是PrepareStatement

底层执行增删改查:PrepareStatement的execute()

 

Mybatis底层在执行CRUD时,可能会涉及到四个处理器:StatementHandler  parameterHandler  TypeHandler  ResultSetHandler

 

XxxMapper:SQLSession(configuration,executor,事务)、代理接口的对象(MapperInterface)、methodCache(存放查询缓存、底层时CurrentHashMap)

 

posted @ 2020-07-11 14:21  myyismyy  阅读(174)  评论(0编辑  收藏  举报