你的位置:首页 > Java教程

[Java教程]使用XSD校验Mybatis的SqlMapper配置文件


这篇文章以前面对SqlSessionFactoryBean的重构为基础,先简单回顾一下做了哪些操作:

  1. 新建SqlSessionFactoryBean,初始代码和mybatis-spring相同;
  2. 重构buildSqlSessionFactory()方法,将众多的if语句抽取为一组小方法,预留自定义配置的方法,同时添加常用属性的getter方法;
  3. 提取组件工厂接口,并提供组件创建工具类SqlSessionComponetFactorys,将散落在不同地方的new Xxx()集中管理,便于组件的替换。

现在来看怎么扩展,首先创建SchemaSqlSessionFactoryBean,继承重构后的SqlSessionFactoryBean,在

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.public class SchemaSqlSessionFactoryBean extends SqlSessionFactoryBean {  @Override  protected void doParseSqlMapperResource(Configuration configuration, Resource mapperLocation)      throws NestedIOException {    int mode = detectValidationMode(mapperLocation);    if(mode == //如果是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 {      = new = detector.detectValidationMode(mapperLocation.getInputStream());    } catch (Exception e) {      throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e);    } finally {      ErrorContext.instance().reset();    }    return mode;  }}

View Code

这里借用了Spring中的

至此,对SqlMapper配置文件的解析工作已经分为两支,兼容mybatis官方的解析,并将XSD模式下的解析导航到方法doParseSqlMapperResourceWithSchema()中。

二、编写用于校验SqlMapper的XSD文件(需要有一定的XSD基础知识,可参考本博客中关于

1、先使用一款

这里分成三个层级:

(1)根元素(mapper元素):对应一个SqlMapper文件,有一个namespace属性,表示它的子元素的一个逻辑分类。需注意的是,这里的namespace属性不同于

(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)添加命名空间,比如:

<??><xsd:schema ="http://dysd.org/schema/sqlmapper"  targetNamespace="http://dysd.org/schema/sqlmapper"  ="http://www.w3.org/2001/   elementFormDefault="qualified" version="1.0">

(2)将一级元素包装为一个元素组statementGroup

(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等等。