コード値を抱える enum のタイプハンドラ

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;
      }
   }
}