这篇文章主要介绍了Mybatis的动态Sql组合模式详情,这篇文章从组合模式的角度分析了Mybatis动态sql的部分,SqlNode是组合模式的Component接口,更多相关内容需要的小伙伴可以参考一下
前言
当同一类型的很多对象组成一个树结构的时候,可以考虑使用组合模式,组合模式涉及三个类:
Component接口:定义树的各个节点的一些操作
Left类:这个是树的叶子结点,实现Component接口,对于节点的管理它不去实现,只实现业务逻辑
Composite类:这个是树的非叶子节点,实现Component接口,不但实现业务逻辑,同时会管理子节点,会有个Component接口的集合类来管理子节点
Component角色
SqlNode就是扮演组合模式中的Component角色,Sql标签会解析成SqlNode对象,
public interface SqlNode {
boolean apply(DynamicContext context);
}
Composite角色
MixedSqlNode类扮演组合模式的Composite角色:
它也是解析<otherwise>
标签的类
public class MixedSqlNode implements SqlNode {
private final List<SqlNode> contents;
public MixedSqlNode(List<SqlNode> contents) {
this.contents = contents;
}
@Override
public boolean apply(DynamicContext context) {
contents.forEach(node -> node.apply(context));
return true;
}
}
它有个SqlNode的集合类,记录SqlNode对象,apply方法就是遍历集合,依次调用自己的apply()方法
剩余其他SqlNode的实现类就充当组合模式的Left类了:
Left类角色
TextSqlNode
TextSqlNode是包含${}的动态sql片段,它的apply()方法的实现:
@Override
public boolean apply(DynamicContext context) {
GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter));
context.appendSql(parser.parse(text));
return true;
}
private GenericTokenParser createParser(TokenHandler handler) {
return new GenericTokenParser("${", "}", handler);
}
创建GenericTokenParser解析器,然后解析包含${}的sql片段,解析后保存到DynamicContext中
TrimSqlNode
TrimSqlNode是解析出的trim标签的对象,trim标签可以去除sql的and、逗号或者拼接where关键字等,
private final SqlNode contents;
@Override
public boolean apply(DynamicContext context) {
FilteredDynamicContext filteredDynamicContext = new FilteredDynamicContext(context);
boolean result = contents.apply(filteredDynamicContext);
filteredDynamicContext.applyAll();
return result;
}
先调用SqlNode 的apply方法 ,然后调用FilteredDynamicContext的applyAll()方法进行前后缀的处理,FilteredDynamicContext在DynamicContext包装了一层,利用了装饰者模式,除了DynamicContext的存储解析结果和参数功能外还能进行前后缀的处理
IfSqlNode
IfSqlNode是解析出if 标签、when标签的类,
public class IfSqlNode implements SqlNode {
private final ExpressionEvaluator evaluator;
private final String test;
private final SqlNode contents;
public IfSqlNode(SqlNode contents, String test) {
this.test = test;
this.contents = contents;
this.evaluator = new ExpressionEvaluator();
}
@Override
public boolean apply(DynamicContext context) {
if (evaluator.evaluateBoolean(test, context.getBindings())) {
contents.apply(context);
return true;
}
return false;
}
}
ExpressionEvaluator是解析工具类,test记录了if标签的test表达式,apply()方法中ExpressionEvaluator工具类解析test表达式,返回true之后调用具体SqlNode的apply()方法
StaticTextSqlNode
StaticTextSqlNode是非动态的sql片段,apply()方法直接把sql片段追加到DynamicContext的sqlBuilder属性中
public class StaticTextSqlNode implements SqlNode {
private final String text;
public StaticTextSqlNode(String text) {
this.text = text;
}
@Override
public boolean apply(DynamicContext context) {
context.appendSql(text);
return true;
}
}
总结
这篇文章从组合模式的角度分析了Mybatis动态sql的部分,SqlNode是组合模式的Component接口,MixedSqlNode是组合模式的Composite角色,还有其他的SqlNode的实现类TextSqlNode、TrimSqlNode、IfSqlNode、StaticTextSqlNode,它们是解析不同的标签,TextSqlNode解析包含${}的动态sql片段,TrimSqlNode类解析trim标签,IfSqlNode是解析出if 标签、when标签的类,StaticTextSqlNode是非动态的sql片段
到此这篇关于Mybatis的动态Sql组合模式详情的文章就介绍到这了,更多相关Mybatis 组合模式内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Mybatis的动态Sql组合模式详情
基础教程推荐
- springboot自定义starter方法及注解实例 2023-03-31
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java并发编程进阶之线程控制篇 2023-03-07
- java实现多人聊天系统 2023-05-19
- Java实现线程插队的示例代码 2022-09-03
- java基础知识之FileInputStream流的使用 2023-08-11
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java数据结构之对象比较详解 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- Java文件管理操作的知识点整理 2023-05-19