java.util.Date と java.sql.Date の違い

java

はじめに

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;