这不是我现在遇到的具体问题,只是我无法解决的问题。我在这里找不到任何问题或互联网上有关此的信息。
Java 中从一开始就存在包装类,例如java.lang.Integer
(对于原语)。int
但是JDBCgetInt
的开发人员选择getLong
使用 Java 原语来实现方法。原语的问题是它们不能代表 SQL NULL
。
为了解决这个问题,JDBC 开发人员编写了许多方法来返回默认的原始值,例如0
,false
当列是时NULL
,并引入了一个wasNull()
函数供用户检查它是否应该是null
。更糟糕的是,当许多其他方法(例如PreparedStatement 的 setInt
接受原语而不是包装对象)时,用户必须有条件地使用setNull
将相应列设置为NULL
.
我发现这为其用户使用JDBC API 的方式增加了不必要的复杂性。如果 JDBC 的ResultSet对象在列有 SQL 时getInteger
将 Javanull
作为Integer 对象NULL
返回,那将非常方便而无需检查wasNull
。Java 的拆箱会自动处理必须将Integer对象分配给int
原始变量的情况,将其转换为0
. 如果PreparedStatement有一个setInteger
方法,用户可以简单地使用它来为合适的列设置值 - 包括 SQLNULL
值 - 而无需检查它是否应该为 null 并恢复为setNull
.
即使到现在,也没有对 JDBC 进行任何更改来纠正此异常。即使我们已经在 Java 1.7 或 1.8 中,JDBC 仍继续使用原始类型(对吗?)。Java 的内置装箱和拆箱将确保使用原始类型编写的旧应用程序将继续与更新为使用包装器的 JDBC 版本一起正常工作。那么,为什么没有人费心升级 JDBC 以使用包装对象代替原语呢?
PS:很高兴听到针对 JDBC 这个荒谬问题的推荐替代解决方案。