可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

WasNull 调用

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

处理这些事件的 SPI 方法是 unnecessaryWasNullCall()missingWasNullCall()

只有直接使用 JDBC API 时才会出现此问题,因为 jOOQ 和大多数 ORM 都正确地抽象了此 JDBC 遗留问题。 在 JDBC 中,当获取原始类型(某些类型仅以其原始形式可用)时,需要随后调用 ResultSet.wasNull(),以查看之前的原始类型是否确实为 NULL 值,而不是 0false 值。

为什么这不好?

在此领域可能会出现两种误用

  • 当应该进行 wasNull() 调用时(可空类型,作为原始类型获取)未进行调用,可能导致客户端出现错误结果。
  • wasNull() 调用过于频繁,或者在不需要进行调用时(不可空类型,或作为引用类型获取的类型)进行了调用,可能会导致非常轻微的性能开销,具体取决于驱动程序。

这里给出了一个例子

// A custom DiagnosticsListener SPI implementation
class WasNull implements DiagnosticsListener {
    @Override
    public void unnecessaryWasNullCall(DiagnosticsContext ctx) {
        System.out.println("Unnecessary wasNull() call: " + ctx.resultSetUnnecessaryWasNullCall());
    }

    @Override
    public void missingWasNullCall(DiagnosticsContext ctx) {
        System.out.println("Missing wasNull() call: " + ctx.resultSetMissingWasNullCall());
    }
}

然后

// Configuration is configured with the target DataSource, SQLDialect, etc. for instance Oracle.
try (Connection c = DSL.using(configuration.derive(new WasNull()))
                       .diagnosticsConnection();
     Statement s = c.createStatement()) {

    try (ResultSet rs = s.executeQuery("SELECT year_of_birth FROM author")) {

        // The YEAR_OF_BIRTH column is nullable, so a 0 int could really mean null
        while (rs.next())
            System.out.println("Year of birth: " + rs.getInt(1));
    }
}

反馈

您对此页面有任何反馈吗? 我们很乐意听到您的反馈!

The jOOQ Logo