ほげにっき

hogedigoの日記

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ファイルの方がスマートかな。。