优化与扩展Mybatis的SqlMapper解析

时间:2022-07-09 02:26:22

接上一篇博文,这一篇来讲述怎么实现SchemaSqlMapperParserDelegate——解析SqlMapper配置文件。

要想实现SqlMapper文件的解析,还需要仔细分析一下mybatis的源码,我画了一个图来协助理解,也可以帮助形成一个整体概念:

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

当然,这幅图不止是原生的解析,也包括了XSD模式下的解析,下面对着这幅图来说明一下。

一、Mybatis全局配置

Mybatis的全局配置,对应内存对象为Configuration,是重量级对象,和数据源DataSource、会话工厂SqlSessionFactory属于同一级别,一般来说(单数据源系统)是全局单例。从SqlSessionFactoryBean的doGetConfigurationWrapper()方法可以看到,有三种方式构建,优先级依次为:

1.spring容器中注入,由用户直接注入一个Configuration对象

2.根据mybatis-config.xml中加载,而mybatis-config.xml的路径由configLocation指定,配置文件使用组件XMLConfigBuilder来解析

3.采用mybatis内部默认的方式,直接new一个配置对象Configuration

这里为了简单,偷一个懒,不具体分析XMLConfigBuilder了,而直接采用spring中注入的方式,这种方式也给了扩展Configuration一个极大的*。

二、读取所有SqlMapper.xml配置文件

也有两种方式,一种是手工配置,一种是使用自动扫描。推荐的自然是自动扫描,就不多说了。

加载所有SqlMapper.xml配置文件之后就是循环处理每一个文件了。

三、解析单个SqlMapper.xml配置文件

单个SqlMapper.xml文件的解析入口是SqlSessionFactoryBean的doParseSqlMapperResource()方法,在这个方法中,自动侦测是DTD还是XSD,然后分两条并行路线分别解析:

1、DTD模式:创建XMLMapperBuilder对象进行解析

2、XSD模式:根据ini配置文件,找到sqlmapper命名空间的处理器SchemaSqlMapperNamespaceParser,该解析器将具体的解析工作委托给SchemaSqlMapperParserDelegate类。

四、解析Statement级元素

Statement级元素指的是根元素<mapper>的一级子元素,这些元素有cache|cache-ref|resultMap|parameterMap|sql|insert|update|delete|select,其中insert|update|delete|select就是通常所说的增删改查,用于构建mybatis一次执行单元,也就是说,每一次mybatis方法调用都是对 insert|update|delete|select 元素的一次访问,而不能说只访问select的某个下级子元素;其它的一级子元素则是用于帮助构建执行单元(resultMap|parameterMap|sql)或者影响执行单元的行为的(cache|cache-ref)。

所以一级子元素可以总结如下:

  1. 执行单元元素:insert | update | delete | select
  2. 单元辅助元素:resultMap | parameterMap | sql
  3. 执行行为元素:cache | cache-ref

这些元素是按如下方式解析的:

1、DTD模式:使用XMLMapperBuilder对象内的方法分别解析

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

上面负责解析的每行代码都是一个内部方法,比如解析select|insert|update|delete元素的方法:

aaarticlea/png;base64,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*YE5u1twQL8nld7idcvqltqygfNdFI/TOHJ13+U4V1Wx+Pimvuv0XY5YVXA3422uP7bN1ySwO+EvkieY6jZE24vbXVLc3YIDRdHW2WubVo62847JfwMQbf2uKtrGtdvchMA2X5PA7nSOtp7uE9E2umAgyHa5ywnm7ZMXG8w76gZ6VfO5gp/jh7qxZ4u6rLl0X5n0WVXzbKKoPbVJ9gq661Ud8qeEk8POHxbNm1uzmDcozw2uq3IPW0au7mvuSc+8U2Y/e1aV2zPT+XnK6TzJxacw45yXq6ruG6wkd+pUzztvULEq/VBvTvxzsqN/T5ojT45oq18VAI6Ko237Kdvp6qOtyIXJWn9jUWg2MMOrHiFIkP4t8izYs+bkQ3Nf5afLhqrgYTKjiNrcmMn25jKcjYNQVTqUuWbdxh/RzKF6jVzd17Mn9UO9nz3BJZlrg4dm1NPdu/QN4qk5kd6KolWZC9PjBNk0/iG5wpaRT/QLgGgLeBREW89HxIi2Jh2wPKGzqL1zFrOkSzxt6evsVbqvnPxxxB9WSmOi+Z4nCsUPRcuua9a4B8QpTP/bfK/nRe9Jc5EtgVu08fy13f8XeX+IzJ2INX8w+8YNOkZbc5yi7dW1/mUckVyBdpy1XdsVRlvPJQd6wf4Ze0XbQ2ReFTd21prle4y2SeZQzr4Vi8wN7uyrV6X3pLlFdbvd00b/dX5q+9CViHri2gAz2urrCtqjbW6Lqre3dFjztG7M8wIAoBVHW9HGmWsnom1h7a6jbcVc1eNM5fsqM1d9eC2KUGahHtk/mg5k/mV3jGLOvnWze1rWrcqMtqJv3KDv/pxrORPZ/Sym/6ytGLzxrG3ROHVnuLucOyfaAu2Itmsj2hJtRTnRVjQg2vrbEG2HjLbBHwEAJNnR1lOiy2PXHG0nK6UVZcqLfIys6KIC/dGuXJuKNZc+vC8M/2Q8pfKHTpxFtblZclPrLs4/dnuirSei1eXdorwu9p5/IvMZrF5V4z8SSqOt84moiGu5TzJ5/kCv85zzggRzkaXR1vmn/4rtrV6Df1VHpf80ApD09vckvqPYPKc6bzZGtPUzrz1NVh2ibyGIvwRAjBzXivHFqk4/V8wb93VusnNw/766L09E23n5sSqZX+tqDynJxSTXluyYW7ZYTNzGuTcqVpVbmNlXr0qPHJT7d5dYVXJA/94QozlXFeyZE/Pi0biZKM+lPXFlalybHNC8PjUuTz4s2iKzV25qsSqxn0UDs7t4xidO2QJul/k9Idpun//P9xgAb5n7wvM1JDParrYSYNeItkhInuDEwHjX3B2essHwhAK9EG3xlrhAAmMz//wNAMBeEG0BAAAwCKItAAAABkG0BQAAwCCItgAAABgE0RYAAACDINoCAABgEGfRVtxsTN+NzHOvsrlhoi3flwQAALAdZzfanVI3y40Da9HDpGGi7US6BQAA2IwwlnmCKdF2jmgLAACwEUTbVkRbAACAjSiOtskrFopGmIi2AAAAWEBBtK3+kFmMaAsAAIDuOGvbAekWAABgC7jWthW5FgAAYCOItq2ItgAAABthR9vSKxCItgAAALiIs1s2BE6NcuXJBp5ZibYAAADo7jKxjGgLAACA7oi2Tci1AAAA20G0BQAAwCCItgAAABgE0RYAAACDINoCAABgEERbAAAADIJoCwAAgEEQbQEAADCIs2grbic28N3I+G5aAACAMZzdaPf4Q9AiDqxFD5M2FW0n0i0AAMAQwkjnCaZEWwAAAGwQ0XaaiLYAAABDKI62ySsWikaYiLYAAABYQEG0FZ8hM9sEiLYAAADorsNZ22n2DQmeEabtRduJdAsAALB/Ha61rRhha9GWXAsAADCAztF2j99rOxFtAQAAhmBHW0+JLo8RbQEAANDd2S0bAqdGufKg1j8r0RYAAADdXSbSEW0BAADQHdGWXAsAADAIoi0AAAAGQbQFAADAIIi2AAAAGATRFgAAAIMg2gIAAGAQRFsAAAAMgmgLAACAQZxFW89NxfQNyZz3JOsebfluWgAAAJzdaPf4g2idbKMfJi1x1pZ0CwAAcOXCOCiC6amKaAsAAIANItoCAABgEN5oOy8n2gIAAGCDiLYAAAAYhCvaFmXZS0XbiXQLAABw3bzRNpbrwllbAAAAXETBx8hybYi2AAAA2AKiLQAAAAZxdsuG3CUHJ7nai9+NbCLaAgAAXL3LxEGiLQAAALobJNqSawEAADBItAUAAACItgAAABgE0RYAAACDINoCAABgEP8PGxpW0nrJ6WYAAAAASUVORK5CYII=" alt="" />

可以看到,具体解析又转给XMLStatementBuilder了,而最终每一个select|insert|update|delete元素在内存中表现为一个MappedStatement对象。

2、XSD模式:这里引入一个Statement级元素解析接口IStatementHandler

public interface IStatementHandler {

    void handleStatementNode(Configuration configuration, SchemaSqlMapperParserDelegate delegate, XNode node);
}

每个实现类负责解析一种子元素,原生元素对应实现类有:

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

然后创建一个注册器类SchemaHandlers来管理这些实现类。

这个过程主要有两步:

(1)应用启动时,将IStatementHandler的实现类和对应命名空间的相应元素事先注册好

//静态代码块,注册默认命名空间的StatementHandler
register("cache-ref", new CacheRefStatementHandler());
register("cache", new CacheStatementHandler());
register("parameterMap", new ParameterMapStatementHandler());
register("resultMap", new ResultMapStatementHandler());
register("sql", new SqlStatementHandler());
register("select|insert|update|delete", new CRUDStatementHandler());

(2)在解析时,根据XML中元素的命名空间和元素名,找到IStatementHandler的实现类,并调用接口方法

/**
* 执行解析
*/
public void parse() {
if (!configuration.isResourceLoaded(location)) {
try {
Element root = document.getDocumentElement();
String namespace = root.getAttribute("namespace");
if (Tool.CHECK.isBlank(namespace)) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
builderAssistant.setCurrentNamespace(namespace);
doParseStatements(root);
} catch (Exception e) {
throw new BuilderException("Error parsing Mapper XML["+location+"]. Cause: " + e, e);
} configuration.addLoadedResource(location);
bindMapperForNamespace();
}
doParsePendings();
} /**
* 解析包含statements及其相同级别的元素[cache|cache-ref|parameterMap|resultMap|sql|select|insert|update|delete]等
* @param parent
*/
public void doParseStatements(Node parent) {
NodeList nl = parent.getChildNodes();
for (int i = 0, l = nl.getLength(); i < l; i++) {
Node node = nl.item(i);
if (!(node instanceof Element)) {
continue;
}
doParseStatement(node);
}
} /**
* 解析一个和statement同级别的元素
* @param node
*/
public void doParseStatement(Node node) {
IStatementHandler handler = SchemaHandlers.getStatementHandler(node);
if (null == handler) {
throw new BuilderException("Unknown statement element <" + getDescription(node) + "> in SqlMapper ["+location+"].");
} else {
SchemaXNode context = new SchemaXNode(parser, node, configuration.getVariables());
handler.handleStatementNode(configuration, this, context);
}
}

这样,只要事先编写好IStatementHandler的实现类,并调用SchemaHandlers的注册方法,解析就能顺利进行,而不管是原生的元素,还是自定义命名空间的扩展元素。

举个例子,和select|insert|update|delete对应的实现类如下:

public class CRUDStatementHandler extends StatementHandlerSupport{

    @Override
public void handleStatementNode(Configuration configuration, SchemaSqlMapperParserDelegate delegate, XNode node) {
String databaseId = configuration.getDatabaseId();
if(databaseId != null){
buildStatementFromContext(configuration, delegate, node, databaseId);
}
buildStatementFromContext(configuration, delegate, node, null);
} private void buildStatementFromContext(Configuration configuration, SchemaSqlMapperParserDelegate delegate, XNode node, String requiredDatabaseId) {
XMLStatementBuilder statementParser = SqlSessionComponetFactorys.newXMLStatementBuilder(configuration, delegate.getBuilderAssistant(),
node, requiredDatabaseId);
try {
statementParser.parseStatementNode();
} catch (IncompleteElementException e) {
configuration.addIncompleteStatement(statementParser);
}
}
}

这里,也将具体解析转给XMLStatementBuilder了,只不过这里不是直接new对象,而是通过工厂类创建而已。

五、LanguageDriver

从上面知道DTD和XSD又汇集到XMLStatementBuilder了,而在这个类里面,间接的创建了LanguageDriver的实现类,用来解析脚本级的SQL文本和元素,以及处理SQL脚本中的参数。LanguageDriver的作用实际上就是组件工厂,和我们的ISqlSessionComponentFactory类似:

public interface LanguageDriver {

  /**
* 创建参数处理器*/
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql); /**
* 根据XML节点创建SqlSource对象
*/
SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType); /**
* 根据注解创建SQLSource对象
*/
SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType);
}

这里因为要再次区分DTD和XSD,需要使用我们自己的实现类,并在Configuration里面配置,又因为是使用XML配置,所以第三个方法就不管了:

public class SchemaXMLLanguageDriver extends XMLLanguageDriver {

// 返回ExpressionParameterHandler,可以处理表达式的参数处理器
@Override
public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject,
BoundSql boundSql) {
return SqlSessionComponetFactorys.newParameterHandler(mappedStatement, parameterObject, boundSql);
}

// 如果是DTD,则使用XMLScriptBuilder,否则使用SchemaXMLScriptBuilder,从而再次分开处理
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType) {
XMLScriptBuilder builder = SqlSessionComponetFactorys.newXMLScriptBuilder(configuration, script, parameterType);
return builder.parseScriptNode();
}
}

六、解析Script级元素

Script级元素指的是除根元素和一级子元素之外的元素(当然也不包括注释元素了。。。),是用来构建Statement级元素的,包括SQL文本和动态配置元素(include|trim|where|set|foreach|choose|if),这些元素按如下方式解析:

1、DTD模式:使用XMLScriptBuilder解析,这里mybatis倒是使用了一个解析接口,可惜的是内部的私有接口,并且在根据元素名称获取接口实现类时也是莫名其妙(竟然每次获取都先创建所有的实现类,然后返回其中的一个,这真是莫名其妙的一塌糊涂!):

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

另外,SQL文本则是使用TextSqlNode解析。

2、XSD模式:和Statement级元素类似,这里引入一个Script级元素解析接口IScriptHandler

public interface IScriptHandler {

    void handleScriptNode(Configuration configuration, XNode node, List<SqlNode> targetContents);
}

每个实现类负责解析一种子元素,也使用SchemaHanders来管理这些实现类。具体也是两个步骤:

(1)静态方法中注册

//注册默认命名空间的ScriptHandler
register("trim", new TrimScriptHandler());
register("where", new WhereScriptHandler());
register("set", new SetScriptHandler());
register("foreach", new ForEachScriptHandler());
register("if|when", new IfScriptHandler());
register("choose", new ChooseScriptHandler());
//register("when", new IfScriptHandler());
register("otherwise", new OtherwiseScriptHandler());
register("bind", new BindScriptHandler());

(2)在使用SchemaXMLScriptBuilder解析时根据元素命名空间和名称获取解析器

public static List<SqlNode> parseDynamicTags(Configuration configuration, XNode node) {
List<SqlNode> contents = new ArrayList<SqlNode>();
NodeList children = node.getNode().getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
XNode child = node.newXNode(children.item(i));
short nodeType = child.getNode().getNodeType();
if (nodeType == Node.CDATA_SECTION_NODE || nodeType == Node.TEXT_NODE) {
String data = child.getStringBody("");
data = decorate(configuration.getDatabaseId(), data);//对SQL文本进行装饰,从而嵌入SQL配置函数的处理
ExpressionTextSqlNode expressionTextSqlNode = new ExpressionTextSqlNode(data);//使用表达式SQL文本,从而具有处理表达式的能力
if (expressionTextSqlNode.isDynamic()) {
contents.add(expressionTextSqlNode);
setDynamic(true);
} else {
contents.add(new StaticTextSqlNode(data));
}
} else if (nodeType == Node.ELEMENT_NODE) { // issue
// #628
IScriptHandler handler = SchemaHandlers.getScriptHandler(child.getNode());//使用处理器机制,从而可以方便、*地扩展
if (handler == null) {
throw new BuilderException("Unknown element <" + child.getNode().getNodeName() + "> in SQL statement.");
}
handler.handleScriptNode(configuration, child, contents);
setDynamic(true);
}
}
return contents;
}

七、处理$fn_name{args}、${(exp)}和#{(exp)}

这里引进了两个概念来扩展mybatis的配置:

1、SQL配置函数

(1)SQL配置函数,只用于配置SQL文本,和SQL函数不同,SQL函数是在数据库中执行的,而SQL配置函数只是JAVA中生成SQL脚本时候解析

(2)SQL配置函数形如 $fn_name{args},其中函数名是字母或下划线开头的字母数字下划线组合,不能为空(为空则是mybatis原生的字符串替换语法)

(3)SQL配置函数在mybatis加载时解析一次,并将解析结果存储至SqlNode对象中,不需要每次运行都解析

(4)SQL配置函数的定义和解析接口ISqlConfigFunction如下:

public interface ISqlConfigFunction {

    /**
* 优先级,如果有多个同名函数,使用order值小的
* @return
*/
public int getOrder(); /**
* 函数名称
* @return
*/
public String getName(); /**
* 执行SQL配置函数
* @param databaseId 数据库ID
* @param args 字符串参数
* @return
*/
public String eval(String databaseId, String[] args);
}

(5)SQL配置函数的设别表达式如下(匆匆写就,尚未测试充分)

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

(6)ISqlConfigFunction也使用SchemaHandlers统一注册和管理。

(7)SQL配置函数名不区分大小写,但参数区分大小写。

2、扩展表达式

(1)作用是扩展mybatis原生的${}和#{}

(2)在原生用法中属性的外面包一对小括号,就成为扩展表达式,形如${(exp)}、#{(exp)}

(3)扩展表达式每次执行都需要解析,其中${()}表达式解析后直接替换SQL字符串,而#{(exp)}则将解析后的结果作为参数调用JDBC的set族方法设置进数据库

(4)扩展表达式的定义和解析接口IExpressionHandler如下:

public interface IExpressionHandler {

    public boolean isSupport(String expression, String databaseId);

    public Object eval(String expression, Object parameter, String databaseId);
}

第一个方法用于判断是否支持需要解析的表达式,第二个方法用于根据传入参数和数据库ID来解析表达式。

如果有多个处理器可以支持需要解析的表达式,将取第一个,这是典型的责任链模式,也是Spring MVC中大量使用的模式。

(5)扩展表达式的设别很简单,就是在mybatis已经识别的基础上,判断是否以小括号开头,并以小括号结尾。

(6)IExpressionHandler也使用SchemaHandlers统一注册和管理 。

(7)扩展表达式区分大小写。

上面就是整个解析过程的一个概述了,总结一下引进的几个接口:

  1. 语句级元素解析处理器IStatementHandler
  2. 脚本级元素解析处理器IScriptHandler
  3. SQL配置函数ISqlConfigFunction
  4. 扩展表达式处理器IExpressionHandler

今天到此为止,下一篇博客就描述怎么应用这些扩展。