编写好XSD文件,然后来看怎么使用XSD文件校验,并解析SqlMapper文件,也就是实现doParseSqlMapperResourceWithSchema()方法。

为了实现这个功能,有两个基本要求:

(1)兼容性:需要兼容mybatis的原生配置,兼容有两种层级,一种是使用DTD校验,这个前面已经说了,走原来的流程,兼容性没有问题;另一种就是走XSD校验,但也需要兼容mybatis原生配置,这种兼容性一方面从上面修改的XSD文件去保证,另一方面也需要从XML的解析去保证。

(2)扩展性:修改的目的就是为了扩展性,所以扩展性也是一个基本要求。但是扩展性不是随意性,也需要按照规范来扩展,这个规范就是自定义的XSD文件。

为了达到这两个基本要求,下面是我的一种思路,主要借鉴于Spring的自定义命名空间:

1、创建一个EntityResolver,读取类路径下指定模式的配置文件,比如:"classpath*:**/dysd-*-namespaces.ini"

2、在ini文件中定义命名空间元信息,如:

aaarticlea/png;base64,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" alt="" />

使用命名空间作为Section的名称,下面的schema、parser分别表示命名空间的xsd文件和解析器实现类,这样就可以根据XML中的XSD命名空间找到校验文件,并且有一个解析入口了。

说明:

  1. apache的commons-configuration提供了ini格式文件的读取API
  2. Spring中使用META-INF/spring.schemas和META-INF/spring.handlers来存储XSD文件和解析器实现类,这里我修改为使用ini文件集中配置
  3. 因为读取的是所有类路径下满足通配符的ini文件,因此可以非常简单的扩展其它命名空间,至于在Java中具体怎么使用XSD来校验,这里就不细说了

我把XML的解析分解为三要素:解析上下文、解析器、被解析文件。doParseSqlMapperResourceWithSchema()方法也很简洁:

protected void doParseSqlMapperResourceWithSchema(Configuration configuration, Resource mapperLocation){
ISqlMapperParserContext context = new SqlMapperParserContext(configuration);
XmlParserUtils.parseXml(context, mapperLocation);
}

解析器接口如下:

public interface IParser<E extends IParserContext> {
public void parse(E parserContext, String location);
public void parse(E parserContext, String[] locationPatterns);
public void parse(E parserContext, InputStream inputStream);
public void parse(E parserContext, Resource resource);
}

解析上下文和解析器实现类又依次分为三个层级:

(1)通用解析上下文:

public interface IParserContext {
public ProblemReporter getProblemReporter();
public EventListener getEventListener();
public SourceExtractor getSourceExtractor();
public Environment getEnvironment();
}

相应层级的解析器实现类主要负责加载被解析文件(比如将字符串通配符加载为Resource对象集合),保证不重复解析,保证可并发执行等。

(2)XML解析上下文

public interface IXmlParserContext extends IParserContext{
public boolean isNamespaceAware();
public DocumentLoader getDocumentLoader();
public EntityResolver getEntityResolver();
public ErrorHandler getErrorHandler();
public XmlParserDelegate getDelegate();
}

相应层级的解析器实现类主要负责将Resource转换为Document对象,并在转换的过程中进行校验。

(3)SqlMapper解析上下文

public interface ISqlMapperParserContext extends IXmlParserContext{
public Configuration getConfiguration();
}

相应层级的解析器实现类主要负责查找根元素所在命名空间的解析器,并使用解析器对Document进行解析。

最终,将解析委托给ini配置文件中的SchemaSqlMapperNamespaceParser类,但是因为这个类需要在文本文件中配置,不方便有参数的构造函数,因而进一步委托给SchemaSqlMapperParserDelegate:

public class SchemaSqlMapperNamespaceParser implements INamespaceParser<ISqlMapperParserContext> {

    @Override
public void init() { } @Override
public void parse(ISqlMapperParserContext parserContext, Document document, Resource resource) {
SchemaSqlMapperParserDelegate delegate = new SchemaSqlMapperParserDelegate(parserContext, document, resource);
delegate.parse();
} @Override
public void destory() { }
}

至此,XSD校验已经完成,也已经找到XML解析入口,后续就是在SchemaSqlMapperParserDelegate中真正的解析了。

使用XSD校验Mybatis的SqlMapper配置文件(2)的更多相关文章

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

    这篇文章以前面对SqlSessionFactoryBean的重构为基础,先简单回顾一下做了哪些操作: 新建SqlSessionFactoryBean,初始代码和mybatis-spring相同: 重构 ...

  2. Mybatis中SqlMapper配置的扩展与应用(3)

    隔了两周,首先回顾一下,在Mybatis中的SqlMapper配置文件中引入的几个扩展机制: 1.引入SQL配置函数,简化配置.屏蔽DB底层差异性 2.引入自定义命名空间,允许自定义语句级元素.脚本级 ...

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

    接上一篇博文,这一篇来讲述怎么实现SchemaSqlMapperParserDelegate——解析SqlMapper配置文件. 要想实现SqlMapper文件的解析,还需要仔细分析一下mybatis ...

  4. Mybatis中SqlMapper配置的扩展与应用(1)

    奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这 ...

  5. mybatis源码配置文件解析之二:解析settings标签

    在前边的博客中分析了mybatis解析properties标签,<mybatis源码配置文件解析之一:解析properties标签>.下面来看解析settings标签的过程. 一.概述 在 ...

  6. mybatis源码配置文件解析之五:解析mappers标签(解析XML映射文件)

    在上篇文章中分析了mybatis解析<mappers>标签,<mybatis源码配置文件解析之五:解析mappers标签>重点分析了如何解析<mappers>标签中 ...

  7. mybatis 加载配置文件的方法

    一.  使用sqlSessionFactory 的 mapperLocations 进行加载 <!-- SessionFactory --> <bean id="sqlSe ...

  8. MyBatis 创建核心配置文件和 SQL 映射文件

    Mybatis 的两个配置文件(mybatis-config.xml  和 xxxMapper.xml)都为 xml 类型,因此在 eclipse 中创建 xml 文件命名为相应的 mybatis-c ...

  9. IDEA中写MyBatis的xml配置文件编译报错的坑

    IDEA中写MyBatis的xml配置文件编译报错的坑 说明:用IDEA编译工具在项目中使用Mybatis框架,编写mybatis-config.xml和Mapper.xml配置文件时,编译项目出现错 ...

随机推荐

  1. html或者jsp页面引用jar包中的js文件

    一,页面上引用jar包中的js文件的方法 使用java web框架AppFuse的时候发现,jquery.bootstrap等js框架都封装到jar包里面了.这些js文件通过一个wro4j的工具对其进 ...

  2. golang坑1

    :=比较方便,不过今天掉进了一个小坑 var ( foo *XXX ) func bar() { fmt.Println(foo.abc) } func main() { foo, err := XX ...

  3. CrossApp入门简介

    来自9miao社区的CrossApp号称可以极大的简化移动应用的开发,因为开源的时间不长,有效的资料不多. 官方网站: http://crossapp.9miao.com/ 环境搭建说明:http:/ ...

  4. ILSpy搜索功能加强版

    1.修改搜索功能,增加如下的额外搜索选项 A.按文本搜索(默认选项) B.按通配符搜索 C.按正则表达式搜索 2.搜索增加如下特性: A.可以按照名字空间检索特定名字空间下的所有类. B.修正了官方版 ...

  5. Freemarker日期格式化处理

    基本参数: date: 只显示日期,不显示时间.如${createTime?date} 或${createTime?date('yyyy-MM-dd')} time: 只显示时间,不显示日期如${cr ...

  6. Java学习笔记五——流程控制

    分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > ...

  7. day9---多线程,线程锁,队列

    进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...

  8. explode,split,preg_split性能比较

      explode,split,preg_split性能比较 分类: php2012-07-12 09:46 1109人阅读 评论(1) 收藏 举报 三个函数都是用来对字符串进行分割,下面分几个实验来 ...

  9. 为什么没调用 didRegisterForRemoteNotificationsWithDeviceToken 和 didFailToRegisterForRemoteNotificationsWithError

    一步一步按照网上 push notification 教程走下来,发现didRegisterForRemoteNotificationsWithDeviceToken 和 didFailToRegis ...

  10. Code::Blocks配置GTK+2和GTK+3

    Code::Blocks配置GTK+2和GTK+3 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根 ...