一、Xml配置文件解析源码(mybatis-config.xml)
new SqlSessionFactoryBuilder().bulid.(resourceReader);//加载xml配置文件,解析到Configuration对象中。
生成SqlSessionFactory(简单工厂,生产SqlSession)
BaseBuilder的实现类→(XMLMapperBuilder解析mapper映射文件、SqlSourceBuilder解析sql语句、XMLConfigBuilder、XMLScriptBuilder、XMLStatementBuilder解析sql节点、MapperBuilderAssistant)
=>new XMLConfigBuilder()解析xml全局配置文件
new一个XPathParser(继承javax的XPath),用来解析xml,xml下任何节点用Node来表示,mybatis下封装XNode。
解析后都放入Configuration对象中:
——将properities标签和外部属性资源文件中的properities设置到Properities;
——settings标签设置loadCustomVfs(拟文件系统,可用来读取外部资源),如果设置LogImpl,放到LogFactory中,生成日志,mybatis有默认的日志框架使用顺序;
——plugins标签设置到InterceptorChain()责任链list中;
——设置settingsElement,默认值都在这设置。
——environments标签得到transactionManager事务工厂和dataSource数据源(JNDI、POOLED、UNPOOLED)解析出来的Environment对象也用了builder模式。******运用连接池
——databaseIdProviderElement数据库厂商ID放入Configuration的databaseId里,在sql片段解析中会校验。
——typeHandlerElement类型处理器,为不同的参数类型设置参数。
——解析mapper标签。Mapper有哪几种配置方式(4种):接口(package,class);xml(url,resource)。把mapper接口放到工厂类(KnownMappers)中,然后MapperAnnotationBuilder的parse方法(接口和xml都用这个解析,会先解析xml)中XMLMapperBuilder去解析mapper映射文件(根据mapper接口的限定名拼接成xml文件):
解析namespace属性,判断与接口类名一致;解析缓存引用,可以引用别的mapper的缓存特性;解析二级缓存引用,属性有默认,返回时new一个CacheBuilder用builder构造;解析parameterMapElement解析parameterMap,不推荐使用了;resultMapElements解析resultMap;sqlElement解析sql片段;buildStatementFromContext解析增删查改,之中用XMLStatementBuilder解析增删查改sql成MappedStatement放到Configuration:
拿到id、databaseId、节点名;节点名通过枚举类比对,如果是select则不刷新缓存并使用缓存,增删改才刷新并不使用缓存;解析parameterType参数类型;获取sql脚本语言驱动(默认XMLLanguageDriver);insert时设置自动增长列;解析sql成一层层的SqlNode标签节点(这里还不能解析成sql语句,build时参数都没有确认);解析resultType、resultMap。
最后将构建出来的Configuration放入SqlSessionFactory。
之后调用查询就是拿到Configuration里的信息对象进行数据库操作。
二、数据库操作过程源码
三、整合spring全过程源码
需要重点掌握:
设计模式
*build方法运用构造器模式:当构造一个对象时,构造过程过于复杂,超出构造函数所能包含的范围,每个属性要复杂的过程才能得到,可以用工厂模式和builder模式。
*Decorator模式:向一个现有的对象添加新的功能,注重增强,代理模式也是增强但更注重将被代理的类隐藏。
一二级缓存
二级缓存:PerpetualCache→LruCache(防缓存溢出)→SerializedCache(序列化,对象存入文本)→LoggingCache(输出缓存命中率)→SynchronizedCache(同步)使用时自下而上委托调用。
默认PerpetualCache,通过装饰器+责任链对PerpetualCache永久缓存进行各自的缓存策略增强(装饰器模式)或者自定义。