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

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

这里分成三个层级:

(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配置文件小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)--MyBatis原始Dao开发和mapper代理开发 MyBatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) setting(全局配置参数) typeAliases(类名别名) typeHandlers(类名处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) environment(环境子属性

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

    在上篇文章给大家介绍了使用XSD校验Mybatis的SqlMapper配置文件的方法(1),需要的朋友可以参考下. 编写好XSD文件,然后来看怎么使用XSD文件校验,并解析SqlMapper文件,也就是实现doParseSqlMapperResourceWithSchema()方法. 为了实现这个功能,有两个基本要求: (1)兼容性:需要兼容mybatis的原生配置,兼容有两种层级,一种是使用DTD校验,这个前面已经说了,走原来的流程,兼容性没有问题:另一种就是走XSD校验,但也需要兼容myba

  • mybatis 项目配置文件实例详解

    mybatis项目配置 首先这事一个简单的mybatis项目配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configur

  • Mybatis Generator最完美配置文件详解(完整版)

    最近没做项目,重新整理了一个最完整的Mybatis Generator(简称MBG)的最完整配置文件,带详解,再也不用去看EN的User Guide了: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

  • MyBatis配置文件的写法和简单使用

    初识 MyBatis 一 最初 Apache 有一个batis的开源项目,放在Google code 中,后来因为一些原因迁移到了github,就是今天的myBatis 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集.MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普

  • 详解MyBatis批量插入数据Mapper配置文件的写法

    对于MyBatis配置文件的用法一直不是很熟悉,之前一直是使用注解来开发的,但是注解也有不好的地方就是如果数据库的表结构发生变化在代码中修改起来很麻烦. 其实批量插入很简单,这里做些简要的说明.请看配置文件的写法: <insert id="insertAll" parameterType="java.util.List" useGeneratedKeys="true"> <selectKey resultType="l

  • MyBatis 如何写配置文件和简单使用

    MyBatis 如何写配置文件和简单使用 MyBatis3.x 这里简单贴一下MyBatis的介绍,具体使用方法会在代码中贴出. MyBatis的前世今生 MyBatis的前身就是iBatis,iBatis本是由Clinton Begin开发,后来捐给Apache基金会,成立了iBatis开源项目.2010年5月该项目由Apahce基金会迁移到了Google Code,并且改名为MyBatis. 尽管如此,它的包结构仍然为ibatis. www.mybatis.org/ https://gith

  • mybatis配置文件简介_动力节点Java学院整理

    在定义sqlSessionFactory时需要指定MyBatis主配置文件: Xml代码 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml" /> <pro

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

    这篇文章以前面对SqlSessionFactoryBean的重构为基础,先简单回顾一下做了哪些操作: 新建SqlSessionFactoryBean,初始代码和mybatis-spring相同: 重构buildSqlSessionFactory()方法,将众多的if语句抽取为一组小方法,预留自定义配置的方法,同时添加常用属性的getter方法: 提取组件工厂接口,并提供组件创建工具类SqlSessionComponetFactorys,将散落在不同地方的new Xxx()集中管理,便于组件的替换

  • mybatis 加载配置文件的方法(两种方式)

    一. 使用sqlSessionFactory 的 mapperLocations 进行加载, <!-- SessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="singleton"> <property name="dataSource" ref=

  • Mybatis中SqlMapper配置的扩展与应用详细介绍(1)

    奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这次研读源码的起因是Oracle和MySQL数据库的兼容性,比如在Oracle中使用双竖线作为连接符,而MySQL中使用CONCAT函数:比如Oracle中可以使用DECODE函数,而MySQL中只能使用标准的CASE WHEN:又比如Oracle中可以执行DELETE FORM TABLE WHER

  • MyBatis 中 SqlMapConfig 配置文件详解

    0x00:文件介绍 在 WEB 工程中,对于 MyBatis 最核心的全局配置文件是 SqlMapConfig.xml 文件,其中包含了数据库的连接配置信息.Mapper 映射文件的加载路径.全局参数.类型别名等. 0x01:配置项详解 configuration:包裹所有配置标签,是整个配置文件的顶级标签. properties:属性,该标签可以引入外部配置的属性,也可以自己配置.该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性. setting:全局配置参数,用来配置一些改变

  • MyBatis 的 XML 配置文件和缓存使用步骤

    目录 MyBatis缓存介绍 MyBatis的XML整体介绍 一.整体配置文件介绍 二.Mybatis拦截器[不做要求] 参考案例 三.缓存 使用步骤 MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 1.一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空.2. 二级缓存与一级缓存其机制相同

  • MyBatis无缝对接Spring的方法

    1.为什么会出现MyBatis-Spring Spring框架与MyBatis框架是Java互联网技术的主流框架.但是如何将MyBatis无缝整合到Spring框架中呢?这时候就诞生了MyBatis-Spring.使用这个类库中得类,Spring将会加载必要的MyBatis工厂类和session类. Spring3.0也仅仅支持ibatis2.0.本来将MyBatis3的支持添加到Spring3.0中.而不幸,Spring3.0的开发在MyBatis3.0官方发布前就结束了.因为Spring开发

  • Mybatis添加Ehcache支持的方法

    1.Mybatis默认的缓存配置 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制. Mybatis缓存包含全局的缓存和局部的缓存,全局的缓存可以讲主配置文件的setting属性的参数cacheEnabled设置为true(好吧,默认为true),局部的二级缓存默认情况下是没有开启的,要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:<cache/> eviction(回收策略) 默认的是 LRU.可选择项有FIFO,SOFT,WEAK flushInterv

  • java持久层框架mybatis防止sql注入的方法

    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

随机推荐