S2Dao
S2Daoを試してみました。
ほんとにインターフェースとSQLだけでDaoができちゃうんですね〜。これ覚えてしまったらもうJDBCなんて使いたくなくなるかも。
でも独自のデータ型を使いたい場合はどうするんだろう?と思ったのでS2DaoのExampleをベースに試してみました。
まずは独自のデータ型として、時刻を持たない日付型を定義。
次にEmployeeクラスのhiredateプロパティの型をYMDateに変更します。(getter,setterも一緒に)
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;
}
}
この段階でEmployeeClientを実行すると例外が発生。ResultSetからEmployeeへ値を設定するときにYMDate型のプロパティには変換できないよう。これは予想通り。
そこで、Beanプロパティへの設定をしているところを探してみると、
org.seasar.extension.jdbc.ValueType
を使っているようなのでYMDate用のValueTypeを作る。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()));
}
}
org.seasar.extension.jdbc.types.ValueTypes#registerValueType(Class, ValueType)
で登録しなければいけないみたいなので、とりあえずEmployeeDaoClientでやっておきます。そして実行。おお、ちゃんと動きました。こんなに簡単にできちゃっていいのかな?
ValueTypes.registerValueType(YMDate.class, new YMDateType());
不安なので、あとでちゃんとテスト書いてみようとおもいます。実際、動いたのはSELECTのときだけだし、INSERTやUPDATEも試しとかないと。
一応ここまでをまとめると、独自のデータ型を使いたいときには
- 独自のデータ型用のValueTypeを実装する
- 作ったValueTypeをValueTypesへ登録する
これでできるかもしれないです。