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