优化与扩展Mybatis的SqlMapper解析.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

peain + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档