これは私が今抱えている特定の問題ではなく、頭を包み込むことができないものです. ここで質問やインターネット上の情報を見つけることができませんでした。
java.lang.Integer
(プリミティブの)などのラッパー クラスint
は、最初から Java に存在していました。しかし、JDBCの開発者は、 Java プリミティブgetInt
を使用して、などのメソッドを実装することを選択しました。getLong
プリミティブの問題は、それらが SQL を表現できないことNULL
です。
この問題を回避するために、JDBC 開発者は、列が である場合にやなどのデフォルトのプリミティブ値を返す多くのメソッドを作成し、ユーザーが であると想定されているかどうかを確認する関数を導入しました。さらに悪いことに、 PreparedStatementなどの他の多くのメソッドがラッパー オブジェクトの代わりにプリミティブを受け入れ、ユーザーは対応する列を に設定するために条件付きで使用する必要があります。0
false
NULL
wasNull()
null
setInt
setNull
NULL
これにより、ユーザーがJDBC API を使用する方法が不必要に複雑になっていることがわかりました。JDBC のResultSetオブジェクトが、列に SQL があるときにgetInteger
Javanull
をInteger オブジェクトNULL
として返すと、チェックの手間がかからず非常に便利でしwasNull
た。Java のボックス化解除は、 Integerオブジェクトをint
プリミティブ変数に割り当て、それを に変換する必要がある場合を自動的に処理し0
ます。PreparedStatementにメソッドがある場合setInteger
、ユーザーはこれを使用して適切な列 (SQL 値を含む) の値を設定するだけで、NULL
null にする必要があるかどうかを確認して元に戻すという面倒な作業は必要ありません。setNull
.
現在でも、この異常を修正するために JDBC に変更は加えられていません。JDBC は、すでに Java 1.7 または 1.8 になった後もプリミティブ型を使用し続けます(そうですか?)。Java の組み込みのボックス化とボックス化解除により、プリミティブ型を想定して作成された古いアプリケーションは、ラッパーを使用するように更新されたバージョンの JDBC で引き続き正しく動作することが保証されます。では、プリミティブの代わりにラッパー オブジェクトを使用するように JDBC をアップグレードしようとする人が誰もいないのはなぜでしょうか?
PS: JDBC に関するこの無意味な問題に対する推奨される代替ソリューションを聞くことができれば幸いです。