💡
原文中文,约7900字,阅读约需19分钟。
📝
内容提要
本文探讨了动态 SQL 的执行流程,强调动态 SQL 与静态 SQL 的区别。动态 SQL 通过 SqlNode 实现,遵循单一职责原则,并使用装饰器模式。动态 SQL 的上下文信息由 DynamicContext 创建,处理动态标签并拼接 SQL。#{} 占位符通过 JDBC 的 PreparedStatement 绑定参数,避免 SQL 注入风险,而 $ 占位符则直接拼接,存在注入风险。
🎯
关键要点
- 动态 SQL 的执行流程与静态 SQL 有明显区别,主要通过 SqlNode 实现。
- 动态 SQL 遵循单一职责原则,并使用装饰器模式来增强代码可读性。
- 动态 SQL 的上下文信息由 DynamicContext 创建,处理动态标签并拼接 SQL。
- 使用 #{} 占位符时,JDBC 的 PreparedStatement 会绑定参数,避免 SQL 注入风险。
- 使用 $ 占位符时,SQL 直接拼接,存在 SQL 注入风险。
- 动态标签的处理逻辑使用了装饰器模式和静态代理模式,增强了 SQL 处理的灵活性。
- IfSqlNode 通过 OGNL 表达式判断条件,决定是否拼接 SQL 片段。
- 动态 SQL 的最终处理结果可能包含 ? 占位符,后续逻辑与静态 SQL 执行流程相同。
❓
延伸问答
动态 SQL 和静态 SQL 有什么区别?
动态 SQL 通过 SqlNode 实现,能够根据上下文信息拼接 SQL,而静态 SQL 则是固定的 SQL 语句。
如何避免 SQL 注入风险?
使用 #{} 占位符时,JDBC 的 PreparedStatement 会绑定参数,从而避免 SQL 注入风险。
动态 SQL 的上下文信息是如何创建的?
动态 SQL 的上下文信息由 DynamicContext 创建,用于处理动态标签并拼接 SQL。
动态标签的处理逻辑是怎样的?
动态标签的处理逻辑使用了装饰器模式和静态代理模式,以增强 SQL 处理的灵活性。
IfSqlNode 是如何工作的?
IfSqlNode 通过 OGNL 表达式判断条件,如果条件为真,则将对应的 SQL 片段拼接到 SQL 中。
使用 $ 占位符会有什么风险?
使用 $ 占位符时,SQL 直接拼接,存在 SQL 注入风险,因为它不会进行参数绑定。
➡️