• 不要用jOOQ串联字符串


    jOOQ开箱即支持大量的SQL语法。因此,大多数用户在使用JDBC编写动态SQL时,不会像以前那样采用字符串连接的方式。 但时不时地,jOOQ不支持某个厂商的特定功能(是的,它发生了)。在这种情况下,jOOQ支持各种"普通SQL "API,它可以用来构造几乎所有类型的jOOQ API元素,比如。

    1. // Static import is implied, as always
    2. import static org.jooq.impl.DSL.*;
    3. // Column expressions
    4. Field<String> f = field("cool_function(1, 2, 3)", String.class);
    5. // Predicates
    6. Condition c = condition("col1 col2");
    7. // Tables
    8. Table> t = table("wicked_table_valued_function(x, y)");
    9. 复制代码

    但是,有时候,你需要动态地传递一个参数给这样的函数,比如说另一个列的表达式。而你想以一种类型安全的方式做到这一点,因为jOOQ代码生成器已经产生了类型安全的列表达式。所以你可能会倾向于串联,尽管如此。

    1. field("cool_function(1, " + MY_TABLE.MY_COLUMN + ", 3)");
    2. 复制代码

    **千万不要这样做!**因为这些原因。

    1. 尽管jOOQ在一般情况下是非常安全的SQL注入,但事实上你还是可以在这里引入一个普通的SQL注入漏洞。在这种情况下不会,因为该列是生成的代码,但也许,你会把用户的输入连接起来。请注意,为了增加SQL注入保护,可以通过添加我们的PlainSQL检查器,使用检查器框架或Google ErrorProne,在全局范围内防止普通SQL的使用,只在需要时允许本地使用。
    2. 和以往的字符串连接一样,你很容易出现SQL语法错误。在这种情况下,生成的SQL不针对任何方言,因为MY_TABLE.MY_COLUMN.toString() ,没有任何上下文信息,如SQLDialect 和所有其他配置标志。

    相反,使用jOOQ的普通SQL模板小语言,它允许模板占位符,如{0}, {1}, {2} 。

    1. field("cool_function(1, {0}, 3)", MY_TABLE.MY_COLUMN);
    2. 复制代码

    如果你经常这样做,你可以在你自己的迷你DSL中考虑这个调用。

    1. public static Field<String> coolFunction(Field field) {
    2. field("cool_function(1, {0}, 3)", field);
    3. }
    4. 复制代码

    而现在,像这样调用。

    1. coolFunction(MY_TABLE.MY_COLUMN)
    2. 复制代码

    作为一个经验法则:使用jOOQ,你应该永远不需要借助于SQL字符串连接,你可以始终使用以下两种方法。

    • 类型安全的jOOQ DSL API
    • 普通的SQL模板API(最好是把这种用法隐藏在你自己的类型安全DSL API后面)。

     

  • 相关阅读:
    【干货分享】.NET人脸识别解决方案
    Acwing 800. 数组元素的目标和
    Linux宝塔面板高并发优化方案
    阻容降压电阻应用
    ABB机器人欧拉角与四元数的相互转化以及旋转矩阵的求法
    SpringBoot——关于banner
    Spring Boot 5 创建个人中心页面(API+Vue)
    制造业企业数字化转型
    【深入理解Typescript】—— 第一章:为什么要使用Typescript
    CrossOver 23 正式发布:可在 Mac 上运行部分 DX12 游戏
  • 原文地址:https://blog.csdn.net/YYniannian/article/details/126087836