yipuran-mybatis
GitHub - yipuran/yipuran-mybatis: mybatis used application
をリリースやり直した。
enum のタイプハンドラを書いたのだが、
コード値を抱え持ち、コード値を参照するインターフェースに
static メソッドを書いていたのだが、enum 実装として膨れ上がってしまいあまりよくない。
よって、staticメソッドを廃止して、バージョンは、4.6 にした。
enum のインターフェースは、以下のとおり簡単にする。
import java.io.Serializable; /** * Generic enum interface. */ public interface EnumBase<E extends Enum<E>> extends Serializable { /** * コード値を返却. * @return コード値 */ public Object getValue(); }
これによりタイプハンドラも、書き直した。
使い方は変わらない。
import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.yipuran.util.EnumBase; /** * コード値内包 enum タイプハンドラ. * @param <E> */ public class EnumValueTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E>{ private Class<EnumBase<E>> cls; /** * コンストラクタ. * @param cls enumクラス */ public EnumValueTypeHandler(Class<EnumBase<E>> cls) { this.cls = cls; } @SuppressWarnings("unchecked") @Override public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException{ if (parameter==null) { ps.setObject(i, null); }else{ ps.setObject(i, ((EnumBase<E>)parameter).getValue()); } } @SuppressWarnings("unchecked") @Override public E getNullableResult(ResultSet rs, String columnName) throws SQLException{ try { Object o = rs.getObject(columnName); return (E) Arrays.stream(cls.getEnumConstants()).filter(e->e.getValue().equals(o)).findAny().orElse(null); }catch(SQLException e) { throw e; } } @SuppressWarnings("unchecked") @Override public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException{ try { Object o = rs.getObject(columnIndex); return (E) Arrays.stream(cls.getEnumConstants()).filter(e->e.getValue().equals(o)).findAny().orElse(null); }catch(SQLException e) { throw e; } } @SuppressWarnings("unchecked") @Override public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException{ try { Object o = cs.getObject(columnIndex); return (E) Arrays.stream(cls.getEnumConstants()).filter(e->e.getValue().equals(o)).findAny().orElse(null); }catch(SQLException e) { throw e; } } }