S2Daoで値付Enumをマッピングしてみるテスト
S2Daoで値付Enumをマッピングしてみるテスト。
まず値付Enumインターフェース。
public interface ValuedEnum { int getValue(); String getName(); String name(); }
次にそれを実装したenum
public enum GenderType implements ValuedEnum, Serializable { MAIL(1,"男性") , FEMAIL(2,"女性") ; private final int value; private final String name; GenderType(int value, String name){ this.value = value; this.name = name; } public int getValue() { return value; } public String getName() { return name; } }
こんなもんかな。これをDBのGENDERカラム(DECIMAL)とマッピング。
まずValueTypeクラスを作成。
public class ValuedEnumValueType implements ValueType { private Class<ValuedEnum> type; public ValuedEnumValueType(Class<ValuedEnum> type) { this.type = type; } public void bindValue(PreparedStatement ps, int index, Object value) throws SQLException { if (value == null) { ps.setNull(index, Types.DECIMAL); } else { ps.setInt(index, ((ValuedEnum)value).getValue()); } } public Object getValue(ResultSet resultSet, int index) throws SQLException { int value = resultSet.getInt(index); if (resultSet.wasNull()) { return null; } return convert(value); } public Object getValue(ResultSet resultSet, String columnName) throws SQLException { int value = resultSet.getInt(columnName); if (resultSet.wasNull()) { return null; } return convert(value); } private ValuedEnum convert(int value) { ValuedEnum enumValue = ValuedEnumUtils.getEnum(type, value); return enumValue; } }
んで、diconファイルに・・・
<component name="genderTypeValueType" class="test.ValuedEnumValueType"> <arg>@test.GenderType@class</arg> </component>
最後にS2Dao VALUE_TYPEアノテーション使うですね。
ValueTypes#registerValueTypeでもいけるのか。。
diconファイルの方がスマートかな。。