S2Dao

S2Daoを試してみました。
ほんとにインターフェースとSQLだけでDaoができちゃうんですね〜。これ覚えてしまったらもうJDBCなんて使いたくなくなるかも。

でも独自のデータ型を使いたい場合はどうするんだろう?と思ったのでS2DaoのExampleをベースに試してみました。
まずは独自のデータ型として、時刻を持たない日付型を定義。


package examples.dao;

import java.util.Date;

public class YMDate {
private static final long ONE_DAY_MILLIS = 24 * 60 * 60 * 1000;

private long time;

public YMDate(Date date) {
this.time = (date.getTime() / ONE_DAY_MILLIS) * ONE_DAY_MILLIS;
}

public long getTime() {
return time;
}
}

次にEmployeeクラスのhiredateプロパティの型をYMDateに変更します。(getter,setterも一緒に)
この段階でEmployeeClientを実行すると例外が発生。ResultSetからEmployeeへ値を設定するときにYMDate型のプロパティには変換できないよう。これは予想通り。
そこで、Beanプロパティへの設定をしているところを探してみると、org.seasar.extension.jdbc.ValueTypeを使っているようなのでYMDate用のValueTypeを作る。

package examples.dao;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.seasar.extension.jdbc.ValueType;

public class YMDateType implements ValueType {

public Object getValue(ResultSet resultSet, int index) throws SQLException {
return new YMDate(resultSet.getDate(index));
}

public Object getValue(ResultSet resultSet, String columnName) throws SQLException {
return new YMDate(resultSet.getDate(columnName));
}

public void bindValue(PreparedStatement ps, int index, Object value) throws SQLException {
YMDate date = (YMDate) value;
ps.setDate(index, new Date(date.getTime()));
}
}

ValueTypeはorg.seasar.extension.jdbc.types.ValueTypes#registerValueType(Class, ValueType)で登録しなければいけないみたいなので、とりあえずEmployeeDaoClientでやっておきます。

ValueTypes.registerValueType(YMDate.class, new YMDateType());
そして実行。おお、ちゃんと動きました。こんなに簡単にできちゃっていいのかな?
不安なので、あとでちゃんとテスト書いてみようとおもいます。実際、動いたのはSELECTのときだけだし、INSERTやUPDATEも試しとかないと。

一応ここまでをまとめると、独自のデータ型を使いたいときには

  • 独自のデータ型用のValueTypeを実装する
  • 作ったValueTypeをValueTypesへ登録する

これでできるかもしれないです。