- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
优化与扩展Mybatis的SqlMapper解析
优化与扩展Mybatis的SqlMapper解析
一、Mybatis全局配置
Mybatis的全局配置,对应内存对象为Configuration,是重量级对象,和数据源DataSource、会话工厂SqlSessionFactory属于同一级别,一般来说(单数据源系统)是全局单例。从SqlSessionFactoryBean的doGetConfigurationWrapper()方法可以看到,有三种方式构建,优先级依次为:
1.spring容器中注入,由用户直接注入一个Configuration对象
2.根据mybatis-config.xml中加载,而mybatis-config.xml的路径由configLocation指定,配置文件使用组件XMLConfigBuilder来解析
3.采用mybatis内部默认的方式,直接new一个配置对象Configuration
这里为了简单,偷一个懒,不具体分析XMLConfigBuilder了,而直接采用spring中注入的方式,这种方式也给了扩展Configuration一个极大的自由。
二、读取所有SqlMapper.xml配置文件
也有两种方式,一种是手工配置,一种是使用自动扫描。推荐的自然是自动扫描,就不多说了。
加载所有SqlMapper.xml配置文件之后就是循环处理每一个文件了。
三、解析单个SqlMapper.xml配置文件
单个SqlMapper.xml文件的解析入口是SqlSessionFactoryBean的doParseSqlMapperResource()方法,在这个方法中,自动侦测是DTD还是XSD,然后分两条并行路线分别解析:
1、DTD模式:创建XMLMapperBuilder对象进行解析
2、XSD模式:根据ini配置文件,找到sqlmapper命名空间的处理器SchemaSqlMapperNamespaceParser,该解析器将具体的解析工作委托给SchemaSqlMapperParserDelegate类。
四、解析Statement级元素
Statement级元素指的是根元素mapper的一级子元素,这些元素有cache|cache-ref|resultMap|parameterMap|sql|insert|update|delete|select,其中insert|update|delete|select就是通常所说的增删改查,用于构建mybatis一次执行单元,也就是说,每一次mybatis方法调用都是对 insert|update|delete|select 元素的一次访问,而不能说只访问select的某个下级子元素;其它的一级子元素则是用于帮助构建执行单元(resultMap|parameterMap|sql)或者影响执行单元的行为的(cache|cache-ref)。
所以一级子元素可以总结如下:
执行单元元素:insert | update | delete | select
单元辅助元素:resultMap | parameterMap | sql
执行行为元素:cache | cache-ref
这些元素是按如下方式解析的:
1、DTD模式:使用XMLMapperBuilder对象内的方法分别解析
上面负责解析的每行代码都是一个内部方法,比如解析select|insert|update|delete元素的方法:
可以看到,具体解析又转给XMLStatementBuilder了,而最终每一个select|insert|update|delete元素在内存中表现为一个MappedStatement对象。
2、XSD模式:这里引入一个Statement级元素解析接口IStatementHandler
public interface IStatementHandler {
void handleStatementNode(Configuration configuration, SchemaSqlMapperParserDelegate delegate, XNode node);
}
每个实现类负责解析一种子元素,原生元素对应实现类有:
然后创建一个注册器类SchemaHandlers来管理这些实现类。
这个过程主要有两步:
(1)应用启动时,将IStatementHandler的实现类和对应命名空间的相应元素事先注册好
复制代码
//静态代码块,注册默认命名空间的StatementHandler
register(cache-ref, new CacheRefStatementHandler());
re
文档评论(0)