由 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 注入风险。
➡️

继续阅读