使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(1)
這篇文章以前面對(duì)SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),先簡(jiǎn)單回顧一下做了哪些操作:
新建SqlSessionFactoryBean,初始代碼和mybatis-spring相同;
重構(gòu)buildSqlSessionFactory()方法,將眾多的if語(yǔ)句抽取為一組小方法,預(yù)留自定義配置的方法,同時(shí)添加常用屬性的getter方法;
提取組件工廠接口,并提供組件創(chuàng)建工具類(lèi)SqlSessionComponetFactorys,將散落在不同地方的new Xxx()集中管理,便于組件的替換。
現(xiàn)在來(lái)看怎么擴(kuò)展,首先創(chuàng)建SchemaSqlSessionFactoryBean,繼承重構(gòu)后的SqlSessionFactoryBean,在XML配置中同步修改為新建的類(lèi):
public class SchemaSqlSessionFactoryBean extends SqlSessionFactoryBean {
}
對(duì)于一些簡(jiǎn)單的功能擴(kuò)展,比如設(shè)置默認(rèn)結(jié)果類(lèi)型,掃描指定的類(lèi)型簡(jiǎn)稱(chēng),這里就不過(guò)多討論了,這里集中講述怎么擴(kuò)展為使用XSD校驗(yàn)SqlMapper配置。
一、覆蓋SqlSessionFactoryBean中的doParseSqlMapperResource()方法,這個(gè)方法的作用是解析一個(gè)SqlMapper配置文件
當(dāng)然,為了兼容性,需要先判斷是否為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校驗(yàn)
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來(lái)偵測(cè)XML配置文件的校驗(yàn)?zāi)J?,邏輯上也很?jiǎn)單,就是一行一行讀,在正文開(kāi)始前,發(fā)現(xiàn)有dtd定義,就返回DTD模式,否則返回XSD模式(實(shí)際上,不止是偵測(cè)模式借用了Spring,后面的自定義命名空間也借鑒了Spring)。
至此,對(duì)SqlMapper配置文件的解析工作已經(jīng)分為兩支,兼容mybatis官方的解析,并將XSD模式下的解析導(dǎo)航到方法doParseSqlMapperResourceWithSchema()中。
二、編寫(xiě)用于校驗(yàn)SqlMapper的XSD文件(需要有一定的XSD基礎(chǔ)知識(shí),可參考本博客中關(guān)于XML部分的學(xué)習(xí)筆記)
1、先使用一款XML工具,將Mybatis的DTD文件轉(zhuǎn)換為原始的XSD文件,有很多XML工具有這種功能,可以網(wǎng)上搜索一下

這里分成三個(gè)層級(jí):
(1)根元素(mapper元素):對(duì)應(yīng)一個(gè)SqlMapper文件,有一個(gè)namespace屬性,表示它的子元素的一個(gè)邏輯分類(lèi)。需注意的是,這里的namespace屬性不同于XML命名空間,前者是mybatis自身的一個(gè)邏輯分類(lèi),后者是用于定義XML文件中可以出現(xiàn)的xml元素和屬性約束。
(2)一級(jí)子元素(cache|cache-ref|resultMap|parameterMap|sql|insert|update|delete|select):mapper的一級(jí)子元素,因?yàn)閙ybatis框架對(duì)一級(jí)子元素有不同處理,所以這里單獨(dú)作為一個(gè)層級(jí),因?yàn)橹饕窃鰟h改查語(yǔ)句,所以稱(chēng)之為語(yǔ)句級(jí)statement元素
(3)其它要素(SQL配置文本,include|trim|where|set|foreach|choose|if):用于配置SQL腳本的文本,以及動(dòng)態(tài)腳本元素,稱(chēng)之為腳本級(jí)script元素
2、在生成XSD文件基礎(chǔ)之上做如下修改
(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)將一級(jí)元素包裝為一個(gè)元素組statementGroup

(3)修改mapper元素,允許出現(xiàn)其它命名空間的元素

(4)將動(dòng)態(tài)腳本元素包裝為一個(gè)元素組dynaScriptGroup,并允許出現(xiàn)其它命名的元素

(5)使用dynaScriptGroup替換出現(xiàn)動(dòng)態(tài)腳本元素的地方,比如<select>元素

(6)其它的一些優(yōu)化,比如將statementType可以取的三個(gè)值STATEMENT、PREPARED、CALLABLE定義為枚舉類(lèi)型:
<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>
類(lèi)似的還有parameterMode、jdbcType、javaType等等。
以上所述是小編給大家介紹的使用XSD校驗(yàn)Mybatis的SqlMapper配置文件小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Jar包如何導(dǎo)入本地maven倉(cāng)庫(kù)
將本地jar包導(dǎo)入本地maven倉(cāng)庫(kù),可以通過(guò)maven命令-Dfile、-DgroupId、-DartifactId、-Dversion、-Dpackaging指定jar包的詳細(xì)信息,然后執(zhí)行命令即可2024-11-11
Java詳解如何將excel數(shù)據(jù)轉(zhuǎn)為樹(shù)形
在平常的辦公工作中,excel數(shù)據(jù)的操作是最常見(jiàn)的需求,今天就來(lái)看一下通過(guò)Java如何來(lái)實(shí)現(xiàn)將excel數(shù)據(jù)轉(zhuǎn)為樹(shù)形,感興趣的朋友可以了解下2022-08-08
深入剖析Java中的synchronized關(guān)鍵字
在 Java 程序中,我們可以利用 synchronized 關(guān)鍵字來(lái)對(duì)程序進(jìn)行加鎖,它既可以用來(lái)聲明一個(gè) synchronized 代碼塊,也可以直接標(biāo)記靜態(tài)方法或者實(shí)例方法,本文就帶大家深入了解Java中的synchronized關(guān)鍵字,感興趣的同學(xué)可以參考閱讀2023-06-06
關(guān)于使用swagger整合springMVC的方法
在平時(shí)開(kāi)發(fā)寫(xiě)接口文檔的工作時(shí),一般都是word文檔,帶來(lái)書(shū)寫(xiě)麻煩、維護(hù)麻煩的問(wèn)題,比如改了源代碼忘了更新文檔、解釋不明確帶來(lái)歧義、無(wú)法在線嘗試等等,swagger可以有效解決這類(lèi)問(wèn)題,需要的朋友可以參考下2023-04-04
SpringBoot應(yīng)用jar包啟動(dòng)原理詳解
本文主要介紹了SpringBoot應(yīng)用jar包啟動(dòng)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
spring boot 1.5.4 集成shiro+cas,實(shí)現(xiàn)單點(diǎn)登錄和權(quán)限控制
這篇文章主要介紹了spring boot 1.5.4 集成shiro+cas,實(shí)現(xiàn)單點(diǎn)登錄和權(quán)限控制,需要的朋友可以參考下2017-06-06
SpringBoot 動(dòng)態(tài)定時(shí)器的使用方法
這篇文章主要介紹了SpringBoot 動(dòng)態(tài)定時(shí)器的使用方法,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下2018-05-05

