欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用XSD校验Mybatis的SqlMapper配置文件的方法(1)

程序员文章站 2024-03-11 16:40:37
这篇文章以前面对sqlsessionfactorybean的重构为基础,先简单回顾一下做了哪些操作: 新建sqlsessionfactorybean,初始代码和mybat...

这篇文章以前面对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 {
@override
protected 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工具有这种功能,可以网上搜索一下

使用XSD校验Mybatis的SqlMapper配置文件的方法(1)

这里分成三个层级:

(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

使用XSD校验Mybatis的SqlMapper配置文件的方法(1)

(3)修改mapper元素,允许出现其它命名空间的元素

使用XSD校验Mybatis的SqlMapper配置文件的方法(1)

(4)将动态脚本元素包装为一个元素组dynascriptgroup,并允许出现其它命名的元素

使用XSD校验Mybatis的SqlMapper配置文件的方法(1)

(5)使用dynascriptgroup替换出现动态脚本元素的地方,比如<select>元素

使用XSD校验Mybatis的SqlMapper配置文件的方法(1)

(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配置文件小结,希望对大家有所帮助