欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年11月07日 09:12:30   作者:linjisong  
這篇文章以前面對SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),簡單的介紹了相關(guān)操作知識,然后在給大家分享使用XSD校驗Mybatis的SqlMapper配置文件的方法,感興趣的朋友參考下吧

這篇文章以前面對SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),先簡單回顧一下做了哪些操作:

新建SqlSessionFactoryBean,初始代碼和mybatis-spring相同;

重構(gòu)buildSqlSessionFactory()方法,將眾多的if語句抽取為一組小方法,預留自定義配置的方法,同時添加常用屬性的getter方法;

提取組件工廠接口,并提供組件創(chuàng)建工具類SqlSessionComponetFactorys,將散落在不同地方的new Xxx()集中管理,便于組件的替換。

現(xiàn)在來看怎么擴展,首先創(chuàng)建SchemaSqlSessionFactoryBean,繼承重構(gòu)后的SqlSessionFactoryBean,在XML配置中同步修改為新建的類:

public class SchemaSqlSessionFactoryBean extends SqlSessionFactoryBean {
}

對于一些簡單的功能擴展,比如設置默認結(jié)果類型,掃描指定的類型簡稱,這里就不過多討論了,這里集中講述怎么擴展為使用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配置文件的校驗模式,邏輯上也很簡單,就是一行一行讀,在正文開始前,發(fā)現(xiàn)有dtd定義,就返回DTD模式,否則返回XSD模式(實際上,不止是偵測模式借用了Spring,后面的自定義命名空間也借鑒了Spring)。

至此,對SqlMapper配置文件的解析工作已經(jīng)分為兩支,兼容mybatis官方的解析,并將XSD模式下的解析導航到方法doParseSqlMapperResourceWithSchema()中。

二、編寫用于校驗SqlMapper的XSD文件(需要有一定的XSD基礎(chǔ)知識,可參考本博客中關(guān)于XML部分的學習筆記)

1、先使用一款XML工具,將Mybatis的DTD文件轉(zhuǎn)換為原始的XSD文件,有很多XML工具有這種功能,可以網(wǎng)上搜索一下

這里分成三個層級:

(1)根元素(mapper元素):對應一個SqlMapper文件,有一個namespace屬性,表示它的子元素的一個邏輯分類。需注意的是,這里的namespace屬性不同于XML命名空間,前者是mybatis自身的一個邏輯分類,后者是用于定義XML文件中可以出現(xiàn)的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腳本的文本,以及動態(tài)腳本元素,稱之為腳本級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)將一級元素包裝為一個元素組statementGroup

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

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

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

(6)其它的一些優(yōu)化,比如將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配置文件小結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Springboot項目打war包docker包找不到resource下靜態(tài)資源的解決方案

    Springboot項目打war包docker包找不到resource下靜態(tài)資源的解決方案

    今天小編就為大家分享一篇關(guān)于Springboot項目打war包docker包找不到resource下靜態(tài)資源的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 詳解Java中CountDownLatch的用法

    詳解Java中CountDownLatch的用法

    這篇文章主要為大家詳細介紹了Java中CountDownLatch類的用法,本文通過一些簡單的示例進行了簡單介紹,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • 深入了解java Lombok的使用方法

    深入了解java Lombok的使用方法

    這篇文章主要介紹了深入了解java Lombok的使用,Lombok是一個通過注解以達到減少代碼的Java庫,如通過注解的方式減少get,set方法,構(gòu)造方法等,需要的朋友可以參考下
    2019-06-06
  • Java編程Iterator迭代器設計原理及實現(xiàn)代碼示例

    Java編程Iterator迭代器設計原理及實現(xiàn)代碼示例

    這篇文章主要介紹了Java編程Iterator迭代器設計原理及實現(xiàn)代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Netty啟動流程注冊多路復用源碼解析

    Netty啟動流程注冊多路復用源碼解析

    這篇文章主要介紹了Netty啟動流程注冊多路復用源碼分析,繼續(xù)分析channel是如何注冊到selector中的,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • JVM指令的使用深入詳解

    JVM指令的使用深入詳解

    這篇文章主要給大家介紹了關(guān)于JVM指令使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • java實現(xiàn)文件和base64相互轉(zhuǎn)換

    java實現(xiàn)文件和base64相互轉(zhuǎn)換

    這篇文章主要為大家詳細介紹了java如何實現(xiàn)文件和base64相互轉(zhuǎn)換,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • Java幾個重要的關(guān)鍵字詳析

    Java幾個重要的關(guān)鍵字詳析

    這篇文章主要介紹了Java幾個重要的關(guān)鍵字詳析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-07-07
  • spring boot2結(jié)合mybatis增刪改查的實現(xiàn)

    spring boot2結(jié)合mybatis增刪改查的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于spring boot2結(jié)合mybatis增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot2具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫

    java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫

    這篇文章主要介紹了java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫,需要的朋友可以參考下
    2020-02-02

最新評論