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)