java.util.Date
vs java.sql.Date
: どちらをいつ、なぜ使うのか?
ベストアンサー1
おめでとうございます。JDBC に関する私の一番の悩みである、日付クラスの処理が解決しました。
基本的にデータベースは通常、日付、時刻、タイムスタンプの少なくとも3つの形式の日付時刻フィールドをサポートしています。これらにはそれぞれ対応するクラスがあり、それぞれがJDBCを拡張します。java.util.Date
これら 3 つのそれぞれの簡単な意味は次のとおりです。
java.sql.Date
SQL DATE に相当し、年、月、日を格納しますが、時間、分、秒、ミリ秒は無視されます。また、sql.Date
タイムゾーンには縛られません。java.sql.Time
SQL TIME に対応し、明らかなように、時間、分、秒、ミリ秒に関する情報のみが含まれます。java.sql.Timestamp
カスタマイズ可能な精度でナノ秒単位の正確な日付 (ミリ秒のみをサポートすることに注意してください) である SQL TIMESTAMP に対応します。util.Date
これら 3 つのタイプに関連して JDBC ドライバーを使用するときに最もよくあるバグの 1 つは、タイプが誤って処理されることです。つまり、sql.Date
タイムゾーン固有であり、sql.Time
現在の年、月、日などが含まれます。
最後に:どれを使うべきでしょうか?
実際には、フィールドの SQL タイプによって異なります。には、 、、のPreparedStatement
3 つの値すべてに対するセッターがあります。#setDate()
sql.Date
#setTime()
sql.Time
#setTimestamp()
sql.Timestamp
ps.setObject(fieldIndex, utilDateObject);
実際に、ほとんどの JDBC ドライバーに標準値を与えるとutil.Date
、正しいタイプであるかのようにドライバーがそれを喜んで処理しますが、後でデータを要求すると、実際には何か不足していることに気付く場合があることに注意してください。
私が本当に言いたいのは、日付はまったく使用すべきではないということです。
私が言いたいのは、ミリ秒/ナノ秒を単純なlongとして保存し、使用しているオブジェクトに変換するということです(義務的なジョダタイムプラグ)。実行できるハッキーな方法の 1 つは、日付コンポーネントを 1 つの long として保存し、時間コンポーネントを別の long として保存することです。たとえば、現在は 20100221 と 154536123 になります。これらのマジック ナンバーは SQL クエリで使用でき、データベース間で移植可能で、JDBC/Java Date API のこの部分を完全に回避できます。