cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

JDBCに関する覚書

主にjavaからMySQLを操作する状況で

日付の操作

java.sql.Dateでは、newするとき、longの値を必要とする(他の方法は推奨されていない)

http://blog.goo.ne.jp/xmldtp/e/60de09e233588c1db59cb39ca2acf33a

らしいので、通常、現在時刻で作成するときは、(このあとPreparedStatement#setDate()することが多い)

new java.sql.Date(System.currentTimeMillis());

日付の操作をするときには、グレゴリアンカレンダー(Date系を直接操作することは非推奨)を利用して

GregorianCalendar gc = new GregorianCalendar();
Date now = new java.sql.Date(gc.getTimeInMillis());
ps.setDate(i++, now);
gc.add(Calendar.DATE, 14);
Date twoWeeksHence = new java.sql.Date(gc.getTimeInMillis());
ps.setDate(i++, twoWeeksHence);

みたいにする。
Javaの道:FAQ(2.日付・時刻)
Javaで基本操作(その4):日時操作(GregorianCalendarで操作、Dateを変換) - ウィリアムのいたずらの開発日記

トランザクション

MySQLトランザクションするとき

AutoCommitがオンになっているかどうかを知る
SELECT @@autocommit
トランザクションを開始する
START TRANSACTION

JDBCでは必要ない

まず、トランザクションの開始ですが、JDBC では明示的なトランザクションの開始 ( Begin Transaction ) は必要ありません。トランザクションの開始は、前回のトランザクションの終了後、最初の SQL 文を実行するステートメントオブジェクトのメソッドにより暗黙的に行われます。

http://www.ogis-ri.co.jp/otc/hiroba/technical/DTP/step1/index.html#ref5
JDBCでAutoCommitを切る

※connはConnection

conn.setAutoCommit(false);
JDBCトランザクションを行う

成功した処理の末にはcommit()を行う。

conn.commit();

例外ではrollback()を行う。

catch(SQLException){
    try {
        conn.rollback();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
}

※Connectionを閉じるとトランザクションが終了するので、トランザクションの間は同一Connectionを使い回す必要があると勝手に思っている。
(わざわざそのためにConnectionを引数として受け取るようにメソッドをオーバーロードしたり)

自動コミットモード:イザ!
コネクションのコミットとロールバック:イザ!