メモ  > Java > JDBC(MySQL)

MySQLのDATETIMEカラムに対して、Javaのjava.sql.Timestamp型を条件として指定する場合

Timestamp型はタイムゾーンを持つため、JDBC接続時にタイムゾーンを指定する必要があります。
JDBCのURLにserverTimezone=XXXXを付けます。
例)JSTの場合

jdbc:mysql://ホスト/データベース名?serverTimezone=JST

文字コードをUTF-8で接続する。

MySQLにUTF-8で繋ぐには、JDBCのURLにuseUnicode=true&characterEncoding=utf8を付けます。

jdbc:mysql://ホスト/データベース名?useUnicode=true&characterEncoding=utf8

DATE型カラムがNULLの場合の挙動を指定する。

DATE型のカラム(DATEやTIMESTAMPなど)がNULL(0000-00-00 ...)の場合デフォルトでは例外が発生します。
例外では非常に困る場合は、挙動を変更するオプションがあります。
JDBCのURLにzeroDateTimeBehavior=convertToNullを付けます。

jdbc:mysql://ホスト/データベース名?zeroDateTimeBehavior=convertToNull

convertToNullの部分がオプションになりますが、いくつかあります。
・exception ( デフォルト ) - SQLState の S1009 で SQLException を投入。
・convertToNull - データの代わりに NULL を戻す。
・round - データを、0001-01-01 という最も近い整数に丸める。

参考)http://dev.mysql.com/doc/refman/5.1/ja/connector-j-installing-upgrading.html

S2Daoでの設定

S2Daoを利用する際はjdbc.diconなどにJDBCのURLを設定するかと思いますが
以下のようにプロパティを設定するときは&を&にしてあげる必要があります。

jdbc:mysql://ホスト/データベース名?useUnicode=true&characterEncoding=UTF-8

フェッチの設定

MySQLでフェッチを利用するには以下のようにフェッチサイズを指定します。

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY
                           , java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

setFetchSizeでInteger.MIN_VALUEを指定しているのがポイントです。
Oracleのように自由に数値を指定できるわけではないので注意が必要です。

参考)http://dev.mysql.com/doc/refman/5.1/ja/connector-j-reference-implementation-notes.html


関連するページ

メモ  > Java > java.text.MessageFormat
メモ  > Android > Galaxy S2 LTE(SC-03D)をroot化する その2
メモ  > Java > 文字列関連
メモ  > C# > .NET Framework 4のメール送信で、長い日本語ファイル名の添付をする方法
メモ  > Android > Galaxy S2 LTE(SC-03D)の電池アイコンを変更する