由 Mybatis 源码畅谈软件设计(四):动态 SQL 执行流程

💡 原文中文,约8000字,阅读约需19分钟。
📝

内容提要

本文探讨了动态 SQL 的执行流程,强调了其与静态 SQL 的区别。动态 SQL 通过 SqlNode 实现,遵循单一职责原则并应用装饰器模式。示例分析了动态 SQL 的解析过程及其防止 SQL 注入的机制,指出 #{} 占位符通过 JDBC 的 PreparedStatement 绑定参数以确保安全,而 $ 占位符则存在 SQL 注入风险。

🎯

关键要点

  • 本文探讨动态 SQL 的执行流程,强调其与静态 SQL 的区别。
  • 动态 SQL 通过 SqlNode 实现,遵循单一职责原则并应用装饰器模式。
  • 动态 SQL 执行查询时,首先获取 BoundSql 对象。
  • DynamicSqlSource 解析动态 SQL,创建动态上下文信息并处理动态标签。
  • 动态标签的处理逻辑使用装饰器模式和静态代理模式。
  • IfSqlNode 通过 OGNL 判断表达式,决定是否拼接 SQL 片段。
  • 动态 SQL 中的 #{} 占位符通过 JDBC 的 PreparedStatement 绑定参数以避免 SQL 注入。
  • 使用 $ 占位符时,SQL 直接拼接,存在 SQL 注入风险。

延伸问答

动态 SQL 和静态 SQL 有什么区别?

动态 SQL 通过 SqlNode 实现,允许在运行时生成 SQL 语句,而静态 SQL 在编译时就已确定。

动态 SQL 是如何避免 SQL 注入的?

动态 SQL 使用 #{} 占位符通过 JDBC 的 PreparedStatement 绑定参数,从而避免 SQL 注入风险。

动态 SQL 的执行流程是怎样的?

动态 SQL 执行时,首先获取 BoundSql 对象,然后解析动态 SQL,创建上下文信息并处理动态标签,最后生成完整的 SQL。

在 Mybatis 中,如何处理动态标签?

动态标签的处理使用装饰器模式和静态代理模式,通过 SqlNode 的 apply 方法增强 SQL 处理逻辑。

What is the role of IfSqlNode in dynamic SQL?

IfSqlNode 通过 OGNL 判断表达式,决定是否将对应的 SQL 片段拼接到最终的 SQL 中。

使用 $ 占位符时存在哪些风险?

使用 $ 占位符时,SQL 直接拼接,存在 SQL 注入风险,因为输入的内容会直接影响 SQL 语句。

➡️

继续阅读