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