时间:2021-05-19
这篇文章以前面对SqlSessionFactoryBean的重构为基础,先简单回顾一下做了哪些操作:
新建SqlSessionFactoryBean,初始代码和mybatis-spring相同;
重构buildSqlSessionFactory()方法,将众多的if语句抽取为一组小方法,预留自定义配置的方法,同时添加常用属性的getter方法;
提取组件工厂接口,并提供组件创建工具类SqlSessionComponetFactorys,将散落在不同地方的new Xxx()集中管理,便于组件的替换。
现在来看怎么扩展,首先创建SchemaSqlSessionFactoryBean,继承重构后的SqlSessionFactoryBean,在XML配置中同步修改为新建的类:
public class SchemaSqlSessionFactoryBean extends SqlSessionFactoryBean {}对于一些简单的功能扩展,比如设置默认结果类型,扫描指定的类型简称,这里就不过多讨论了,这里集中讲述怎么扩展为使用XSD校验SqlMapper配置。
一、覆盖SqlSessionFactoryBean中的doParseSqlMapperResource()方法,这个方法的作用是解析一个SqlMapper配置文件
当然,为了兼容性,需要先判断是否为DTD,如果是DTD,按原方法解析,否则按自定义方法解析:
package org.dysd.dao.mybatis.schema;import org.apache.ibatis.executor.ErrorContext;import org.apache.ibatis.session.Configuration;import org.springframework.core.NestedIOException;import org.springframework.core.io.Resource;import org.springframework.util.xml.XmlValidationModeDetector;public class SchemaSqlSessionFactoryBean extends SqlSessionFactoryBean {@Overrideprotected void doParseSqlMapperResource(Configuration configuration, Resource mapperLocation)throws NestedIOException {int mode = detectValidationMode(mapperLocation);if(mode == XmlValidationModeDetector.VALIDATION_DTD){//如果是DTD,使用Mybatis官方的解析super.doParseSqlMapperResource(configuration, mapperLocation);}else{try {// 使用Schema校验this.doParseSqlMapperResourceWithSchema(configuration, mapperLocation);} catch (Exception e) {throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e);} finally {ErrorContext.instance().reset();}}}protected void doParseSqlMapperResourceWithSchema(Configuration configuration, Resource mapperLocation){}private int detectValidationMode(Resource mapperLocation) throws NestedIOException {int mode = -1;try {XmlValidationModeDetector detector = new XmlValidationModeDetector();mode = detector.detectValidationMode(mapperLocation.getInputStream());} catch (Exception e) {throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e);} finally {ErrorContext.instance().reset();}return mode;}}这里借用了Spring中的XmlValidationModeDetector来侦测XML配置文件的校验模式,逻辑上也很简单,就是一行一行读,在正文开始前,发现有dtd定义,就返回DTD模式,否则返回XSD模式(实际上,不止是侦测模式借用了Spring,后面的自定义命名空间也借鉴了Spring)。
至此,对SqlMapper配置文件的解析工作已经分为两支,兼容mybatis官方的解析,并将XSD模式下的解析导航到方法doParseSqlMapperResourceWithSchema()中。
二、编写用于校验SqlMapper的XSD文件(需要有一定的XSD基础知识,可参考本博客中关于XML部分的学习笔记)
1、先使用一款XML工具,将Mybatis的DTD文件转换为原始的XSD文件,有很多XML工具有这种功能,可以网上搜索一下
这里分成三个层级:
(1)根元素(mapper元素):对应一个SqlMapper文件,有一个namespace属性,表示它的子元素的一个逻辑分类。需注意的是,这里的namespace属性不同于XML命名空间,前者是mybatis自身的一个逻辑分类,后者是用于定义XML文件中可以出现的xml元素和属性约束。
(2)一级子元素(cache|cache-ref|resultMap|parameterMap|sql|insert|update|delete|select):mapper的一级子元素,因为mybatis框架对一级子元素有不同处理,所以这里单独作为一个层级,因为主要是增删改查语句,所以称之为语句级statement元素
(3)其它要素(SQL配置文本,include|trim|where|set|foreach|choose|if):用于配置SQL脚本的文本,以及动态脚本元素,称之为脚本级script元素
2、在生成XSD文件基础之上做如下修改
(1)添加命名空间,比如:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><xsd:schema xmlns="http://dysd.org/schema/sqlmapper"targetNamespace="http://dysd.org/schema/sqlmapper"xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0">(2)将一级元素包装为一个元素组statementGroup
(3)修改mapper元素,允许出现其它命名空间的元素
(4)将动态脚本元素包装为一个元素组dynaScriptGroup,并允许出现其它命名的元素
(5)使用dynaScriptGroup替换出现动态脚本元素的地方,比如<select>元素
(6)其它的一些优化,比如将statementType可以取的三个值STATEMENT、PREPARED、CALLABLE定义为枚举类型:
<xsd:simpleType name="statementType"><xsd:restriction base="xsd:token"><xsd:enumeration value="STATEMENT" /><xsd:enumeration value="PREPARED" /><xsd:enumeration value="CALLABLE" /></xsd:restriction></xsd:simpleType>类似的还有parameterMode、jdbcType、javaType等等。
以上所述是小编给大家介绍的使用XSD校验Mybatis的SqlMapper配置文件小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在上篇文章给大家介绍了使用XSD校验Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以参考下。编写好XSD文件,然后来看怎么使用XSD文件校
全局配置文件为mybatis-config.xml1、properties标签可以使用properties来引入外部properties配置文件的内容引入方式有
1、关于#{}占位符先来看以下的示例,该示例是MyBatis中的SQL映射配置文件(Mapper配置文件),在该配置中使用了#{}占位符。SELECT*FROM
一、Mybatis中的延迟加载1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association、coll
0x00:前言参考之前的《MyBatis中SqlMapConfig配置文件详解》记了一下MyBatis中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下