WasNull 调用
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
处理这些事件的 SPI 方法是 unnecessaryWasNullCall()
和 missingWasNullCall()
只有直接使用 JDBC API 时才会出现此问题,因为 jOOQ 和大多数 ORM 都正确地抽象了此 JDBC 遗留问题。 在 JDBC 中,当获取原始类型(某些类型仅以其原始形式可用)时,需要随后调用 ResultSet.wasNull()
,以查看之前的原始类型是否确实为 NULL
值,而不是 0
或 false
值。
为什么这不好?
在此领域可能会出现两种误用
- 当应该进行
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)); } }
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的反馈!