【问题标题】:JOOQ update set not populating valuesJOOQ 更新集不填充值
【发布时间】:2018-12-11 04:12:34
【问题描述】:

在 Spring Boot 应用程序中,我使用 JOOQ 构建 SQL,然后通过 JdbcTemplate 执行该 SQL。我没有使用 codegen 或使用 JOOQ 执行查询。我遇到的问题是进行更新。我使用table()field() 作为来自org.jooq.impl.DSL 的静态导入。该表在类的顶部声明如下:

private final Table<Record> TABLE = table("rjri.participant");

这是我用来更新的对象的字符串表示形式:

Participant{id='10',{ firstName='Jacob', lastName='Nerney', dateOfBirth='1985-01-14T20:51:39', address='1662 Ryan Ave', city='Murray', state='KY', zip='420711234', phoneNumber='2702274322', email='nern@mail.com'}}

这是我用来构建更新语句的 JOOQ 代码:

final String sql = dslContext.update(TABLE)
            .set(field("first_name"), participant.getFirstName())
            .set(field("last_name"), participant.getLastName())
            .set(field("date_of_birth"),
                    DateTimeFormatter.toDateTimeString(participant.getDateOfBirth()))
            .set(field("address"), participant.getAddress())
            .set(field("city"), participant.getCity())
            .set(field("state"), participant.getState()).set(field("zip"), participant.getZip())
            .set(field("phone"), participant.getPhoneNumber())
            .set(field("email"), participant.getEmail())
            .set(field("modified_date"),
                    DateTimeFormatter.toDateTimeString(LocalDateTime.now()))
            .where("id = " + participant.getId()).getSQL();

但是,当我运行这段代码时,生成的 SQL 是这样的:

update rjri.participant set first_name = ?, last_name = ?, date_of_birth = ?, address = ?, city = ?, state = ?, zip = ?, phone = ?, email = ?, modified_date = ? where (id = 10)

我无法弄清楚为什么没有填充这些值。救救我!

【问题讨论】:

  • ".where("id = " +参与者.getId())" - 不要那样做! You're creating a SQL injection vulnerability despite using jOOQ。除此之外,您从 1) 不使用代码生成器和 2) 不通过 jOOQ 运行查询有什么好处?
  • 幸运的是,我们正在另一个地方验证该 id 字段,因此我们在使用 where() 时采取了预防措施。实际上,我可以使用 codegen 并使用 jooq 执行,但是如果我们遇到问题,我的团队负责人实际上更倾向于完全放弃 jooq。我推动我们至少使用 dsl 编写查询。我的意思是,这家伙反对使用 lombok,因为它增加了构建依赖;总的来说,似乎真的对 codegen 不利。
  • 我必须坚持,永远不要依赖这样的外部预防措施。这种预防措施可能会消失,你的脆弱性就会暴露出来。请改写where("id = ?", participant.getId())。告诉“这个人”他错了 :) 代码生成是一件很棒的事情。优化器从 SQL 生成复杂的算法,javac 从 Java 源代码生成字节码,而 JIT 从字节码生成机器码。问他是否愿意自己做所有这些。
  • 谢谢。我正在经历并修复其中的一些东西。

标签: java spring-boot jdbctemplate jooq


【解决方案1】:

您可以使用Query.getSQL(ParamType) 方法强制jOOQ 内联所有绑定变量。但很有可能,出于性能原因,您最好使用准备好的语句,在这种情况下,您应该使用 Query.getSQL() 提取 SQL 字符串并使用 Query.getBindValues() 提取绑定变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2019-02-19
    • 2021-06-18
    • 2022-06-29
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多