java.util.Date と java.sql.Date の違い
はじめに
java.sql.Date 使ったことなかったのでjava.util.Dateと何が違うのか調べました。 調べて分かったのは java.sql.Dateは PreparedStatement に値を渡すときに使うようです。java.sql.Dateを使ったプログラムを実際にプログラムを作ってみました。DBはMySQLを使っています。
試してみる
以下はサンプルのテーブルのcreate table文になります。MySQLのDATETIME型は日付と時間の情報を持っています。ミリ秒まで保持したい場合はDATETIME(3)と指定する必要があります。
create table sample( column1 DATETIME(3) );
日時を登録するだけのプログラムです。最初にjava.sql.Date 型を使った場合、MySQLに登録されたのは日付の情報のみで時分秒の情報は0になっていました。 時間情報も保存したい場合は java.sql.Timestamp 型を使ったところ保存できました。下のサンプルでは区別がつくようにDate型は現在時刻、Timestamp型の現在時刻から1日引いたもの2件のレコードを登録しています。
import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Timestamp; import java.util.Calendar; public class SampleDate { public static void main(String[] args) { try { Date sqlDate = new Date(Calendar.getInstance().getTimeInMillis()); Timestamp timestamp = new Timestamp(Calendar.getInstance().getTimeInMillis() - 1000*60*60*24); Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://[サーバ]:[ポート]/[DB名]?user=[ユーザ名]&password=[パスワード]"); PreparedStatement statement = connection.prepareStatement("insert into sample values ( ? );"); // java.sql.Date を使った場合 statement.setDate( 1, sqlDate ); statement.execute(); // java.sql.Timestamp を使った場合 statement.setTimestamp( 1, timestamp); statement.execute(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
MySQLに接続するためにはJDBCドライバが必要になります。以下からダウンロードしてビルドパスに追加しましょう。
MySQL :: Download Connector/J
確認する
以下が確認用のSQLになります。Dateの場合は日付の情報のみでTimestampの場合は時分秒ミリ秒まで保存できていることを確認しました。
select DATE_FORMAT(column1,'%Y/%m/%d %H:%i:%S.%f') from sample;