程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 使用XSD校驗Mybatis的SqlMapper配置文件(1),xsdsqlmapper

使用XSD校驗Mybatis的SqlMapper配置文件(1),xsdsqlmapper

編輯:JAVA綜合教程

使用XSD校驗Mybatis的SqlMapper配置文件(1),xsdsqlmapper


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

現在來看怎麼擴展,首先創建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; } } View Code

這裡借用了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等等。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved