视频地址https://www.bilibili.com/video/BV1bb411A7bD?p=71
分层框架
老师的代码
流程
1.获取sqlsessionFactory对象
将mybatis-config.xml的信息,写入类Configuration
MapperRegistry类将mapper接口与代理工厂绑定,每个接口对应一个工厂
Map<Class<?>, MapperProxyFactory<?>>
将所有的mapper.xml中的crud解析放入类MappedStatement(一个MappedStatement对应一个crud标签信息,sql语句也在,其中id属性是全类名+方法名,所以mybatsi的mapper不支持方法的重载)
Configuration还包含了属性Map<String,MappedStatement> (map的key就是MappedStatement的ID属性),也包含了一个MapperRegistry属性
所以Configuration包含了mybatis的所有配置
使用接口sqlsessionFactory的实现类DefaultSqlSessionFactory创建sqlsessionFactory对象
DefaultSqlSessionFactory对象包含Configuration属性
2.获取sqlsession对象
调用DefaultSqlSessionFactory的opensession方法
DefaultSqlSessionFactory包含了Configuration
创建了事务
调用了Configuration的newExecutor方法获取四大对象之一Executor,入参为事务,Executor的类型默认simple(ExecutorType简单的SIMPLE,可复用的REUSE,批量的REUSE)
如果开启二级缓存cacheEnabled,就创建executor = new CachingExecutor(executor);
最后调用interceptorChain拦截器链重新包装并返回executor = (Executor) interceptorChain.pluginAll(executor);
最终将Executor和Configuration放入DefaultSqlSession
3.获取接口代理对象(mapperProxy)
DefaultSqlSession的getMapper方法
configuration.getMapper(type, this);
mapperRegistry.getMapper(type, sqlSession);
根据接口类型获取MapperProxyFactory
调用MapperProxyFactory的newInstance将sqlSession传入
类MapperProxy包含属性sqlSession,mapper接口,以及接口的方法
最终返回MapperProxy的代理对象包含了DefaultSqlSession
4.执行crud方法