组合模式在MyBatis源码中的应用
本节主要介绍组合模式在 MyBatis 中一个非常经典的案例。
MyBatis 在解析各种 Mapping 文件中的 SQL 语句时,涉及了一个非常关键的类叫作 SqlNode。XML 中的每一个 Node(节点)都会被解析为一个 SqlNode 对象,最后把所有 SqlNode 都拼装到一起,就成为了一条完整的 SQL 语句。例如以下我们经常用到的动态 SQL 语句。
SqlNode 的源码如下:
SqlNode 是所有动态节点都实现的接口,它会根据传入的参数 context 解析该 SqlNode 记录的 SQL 语句片段,并调用 DynamicContext.appendSql( ) 方法将解析后的 SQL 语句片段追加到 DynamicContext 的 sqlBuilder 中保存。当所有 SqlNode 都完成解析时,可以通过 DynamicContext.getSql( ) 获取一条完整的 SQL 语句。
DynamicContext 类中部分源码如下:
TextSqlNode 类中实现的 apply( ) 方法如下:
以上我们只列出了 TextSqlNode 类实现 apply( ) 的部分代码,对其它源码实现感兴趣的小伙伴可以去研究一下,这里给大家展示一下类图,如下图所示。
MyBatis 在解析各种 Mapping 文件中的 SQL 语句时,涉及了一个非常关键的类叫作 SqlNode。XML 中的每一个 Node(节点)都会被解析为一个 SqlNode 对象,最后把所有 SqlNode 都拼装到一起,就成为了一条完整的 SQL 语句。例如以下我们经常用到的动态 SQL 语句。
- <select id="getStudent" parameterType="long" resultType="com.entity.Student">
- select id,name,age from student
- <where>
- <if test="id!=null and id != ''">
- AND id=#{id}
- </if>
- </where>
- </select>
- public interface SqlNode {
- boolean apply(DynamicContext context);
- }
DynamicContext 类中部分源码如下:
- public class DynamicContext {
- ...
- public void appendSql(String sql) {
- this.sqlBuilder.append(sql);
- this.sqlBuilder.append(" ");
- }
- public String getSql() {
- return this.sqlBuilder.toString().trim();
- }
- ...
- }
- public boolean apply(DynamicContext context) {
- GenericTokenParser parser = this.createParser(new TextSqlNode.BindingTokenParser(context, this.injectionFilter));
- context.appendSql(parser.parse(this.text));
- return true;
- }

所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算