mybatis源码
2022-11-14 16:27:07 16 举报
mybatis
作者其他创作
大纲/内容
看你有没有设置sqlsessionFacyotyBean.setMapperLocations(mybatis的全局配置文件)
batch
super.doscan扫描所有的mapper
classPathMapperScan scanner
偷天换日:把userMapper改成了mapperFactoryBean
解析到
BeanFactory会将getObject的返回值作为bean,且IOC的加载不会创建getObject,直到调用getBean
XMLMapperBuilder
mapper有四种配置方式1.通过class解析mapper接口2.通过package批量解析mapper接口3.通过resource 解析xml4.通过url直接解析xml
首先获得sql IDString id = context.getStringAttribute(\"id\");
解析sql 放到configuration里面的sqlFragments
InitializingBean是Spring提供的拓展性接口,InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。
相当于mybatis的SqlSessionFactoryFactory sqlsessionFactory = new SqlSessionFactoryBuilder().build(reader)_
environment
font color=\"#e57373\
registerBeanDefiniation
根据nodeName 获得 SqlCommandType枚举select|insert|update|deleteSqlCommandType sqlCommandType = SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));
SqlSourceBuilder
此处就是装饰器模式
BaseExcutor一级缓存
解析envioonment
构造器模式
调用sqlNode的apply方法sqlNode 的apply方法 对应不同的sqlNode 进行解析
解析setting plugin properties mapper等等等
@import是可以的,因为@import里面有个方法,它提供了BeanDefiniationRegistry这个注册器,这个注册器里面有方法registryBeanDefination,但是@imporyt是spring4.0之后才有的
**重写后 只有接口才能扫描bean定义
把SqlSessionFactoryBean的属性设置到configuration里面去
buildSqlSessionFactory
CachingExcutor实现了二级缓存
mybatis是如何实现动态sql的mybatis会把我们的sql解析成一个一个sqlNode(例如mixedSqlnode whereSqlNode ifSqlNode)然后通过责任链的方式去解析每一个sqlNode的解析方式,然后将解析的sql追加到统一的sql变量当中最终得到这么一个sql语句
selectList你只要查询一个,下标选为0即可
// 执行查询 底层执行jdbc User user = (User)session.selectOne(\"com.tuling.mapper.UserMapper.selectById\
最后调用build方法,返回defaultSqlSessionFactory
openSession
如果是,把它put到font color=\"#e57373\
sqlSessionFactoryBean继承了InitializingBean
放完之后调用parse方法,开始解析mapper映射文件(xml)
如何让spring去管理mapper映射文件
@Bean可以,但是一个@Bean只能实例化一个mapper,我要是有一百个mapper 需要@baen一百个
excutor
beanDefiniationRegistryPostProcessor这个接口
进入mapperScanRegistrar.class
\"package\".equals(child.getName()
获得节点名称select|insert|update|deleteString nodeName = context.getNode().getNodeName();
然后判断是不是接口type.isInterface()
reuse
doscan
getConnection
通过这个方法获得执行器执行器SqlSession session = sqlMapper.openSession();
有两个方法实现了query接口1.BaseExcutor2.CachingExcutor
variables
mapperScannerConfigurer
builder
classPathMapperScaner
new SpringManagedTransaction
解析我们的namespace属性 <mapper namespace=\"com.tuling.mapper.EmployeeMapper\">
开始循环遍历mapperfor (Class<?> mapperClass mapperSet) { addMapper(mapperClass); }
二级缓存为什么可以达到每个命名空间享用自己的缓存因为他有缓存key 里面有sql语句 sql ID 和sql参数
sqlFragment
XMLScriptBuilder
进入@mapperScan注解
调用excutor的query方法
如果设置了,那么就会通过XMLBuilder来解析全局配置文件
@bean 将SqlSessionFactory集成到 ioc 容器中
<properties>
XMLStatementBuilder
XMLConfigBuilder解析全局配置文件
configuration
sqlSession只是一个门面,最终执行增删改查的还是mybatis的执行器excutor
XMLConfigBuilder.parse
scanner.scan
getBound解析sql
此处声明了configuration对象targetConfiguration
simple
解析sql
解析我们的cache节点 cacheElement(context.evalNode(\"cache\"));
@mapperScan(\"mapper所在的包\")
加载配置文件
我们此时的mybatis的全局配置文件是没有设置environment的所以自己new 一个springManagedTransactionFactory
SqlSessionFactoryBean核心功能点:1、解析的配置文件封装到Configuration(mybatis核心)2、指定事物工厂这一步指定spring的事物工厂(主要整合connection)
@import(mapperScanRegistrar.class)
new.SqlSessionFactoryBuilder.build(reader)
SqlSession
@Component可不可以(1)不可以,@Component是将class设置到beandefination中,最终spring会将这个class进行反射,这个过程我们是无法干预的,无法创建动态代理(2)@component不能用于接口---------------------
重写postProcessorBeanDefiniationRegistry
用子类实例化父类,调用父类方法反而会调用子类重写的方法
这个方法里面注册了一个mapperScannerConfigurer到beanDefiniation里面去
afterPropertiesSet
这个connection就是事务同步管理器(TransactionSynchronizedManager)的获取的
实现下面这个接口
0 条评论
下一页