资源描述:
《优化与扩展Mybatis的SqlMapper解析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、优化与扩展Mybatis的SqlMapper解析一、Mybatis全局配置Mybatis的全局配置,对应内存对象为Configuration,是重量级对象,和数据源DataSource、会话工厂SqlSessionFactory属于同一级别,一般来说(单数据源系统)是全局单例。从SqlSessionFactoryBean的doGetConfigurationWrapper()方法可以看到,有三种方式构建,优先级依次为:1.spring容器中注入,由用户直接注入一个Configuration对象2.根据mybatis-con
2、fig.xml中加载,而mybatis-config.xml的路径由configLocation指定,配置文件使用组件XMLConfigBuilder来解析3.采用mybatis内部默认的方式,直接new一个配置对象Configuration这里为了简单,偷一个懒,不具体分析XMLConfigBuilder了,而直接采用spring中注入的方式,这种方式也给了扩展Configuration一个极大的自由。二、读取所有SqlMapper.xml配置文件也有两种方式,一种是手工配置,一种是使用自动扫描。推荐的自然是自动扫描,就
3、不多说了。加载所有SqlMapper.xml配置文件之后就是循环处理每一个文件了。三、解析单个SqlMapper.xml配置文件单个SqlMapper.xml文件的解析入口是SqlSessionFactoryBean的doParseSqlMapperResource()方法,在这个方法中,自动侦测是DTD还是XSD,然后分两条并行路线分别解析:1、DTD模式:创建XMLMapperBuilder对象进行解析2、XSD模式:根据ini配置文件,找到sqlmapper命名空间的处理器SchemaSqlMapperNamespa
4、ceParser,该解析器将具体的解析工作委托给SchemaSqlMapperParserDelegate类。四、解析Statement级元素Statement级元素指的是根元素的一级子元素,这些元素有cache
5、cache-ref
6、resultMap
7、parameterMap
8、sql
9、insert
10、update
11、delete
12、select,其中insert
13、update
14、delete
15、select就是通常所说的增删改查,用于构建mybatis一次执行单元,也就是说,每一次mybatis方法调用都是对ins
16、ert
17、update
18、delete
19、select元素的一次访问,而不能说只访问select的某个下级子元素;其它的一级子元素则是用于帮助构建执行单元(resultMap
20、parameterMap
21、sql)或者影响执行单元的行为的(cache
22、cache-ref)。所以一级子元素可以总结如下:执行单元元素:insert
23、update
24、delete
25、select单元辅助元素:resultMap
26、parameterMap
27、sql执行行为元素:cache
28、cache-ref这些元素是按如下方式解析的:1、DTD模式:使用XMLMa
29、pperBuilder对象内的方法分别解析上面负责解析的每行代码都是一个内部方法,比如解析select
30、insert
31、update
32、delete元素的方法:可以看到,具体解析又转给XMLStatementBuilder了,而最终每一个select
33、insert
34、update
35、delete元素在内存中表现为一个MappedStatement对象。2、XSD模式:这里引入一个Statement级元素解析接口IStatementHandlerpublicinterfaceIStatementHandler{voidhandleS
36、tatementNode(Configurationconfiguration,SchemaSqlMapperParserDelegatedelegate,XNodenode);}每个实现类负责解析一种子元素,原生元素对应实现类有:然后创建一个注册器类SchemaHandlers来管理这些实现类。这个过程主要有两步:(1)应用启动时,将IStatementHandler的实现类和对应命名空间的相应元素事先注册好复制代码//静态代码块,注册默认命名空间的StatementHandlerregister("cache-ref"
37、,newCacheRefStatementHandler());register("cache",newCacheStatementHandler());register("parameterMap",newParameterMapStatementHandler());register("result