枚举处理器——自定义枚举处理器(进阶)
上一篇的枚举处理器的配置初步解决了枚举问题 ,但有的时候,值既不是枚举的字面值,也不是枚举的索引值,这时就需要自行设计枚举处理器了。
1. 对Enabled类进行修改,代码如下:
package com.example.simple.type; public enum Enabled { enabled(1), //启用 disabled(0); //禁用 private final int value; private Enabled(int value) { this.value = value; } public int getValue() { return value; } }
2. 在com.example.simple.type包下新建EnabledTypeHander类,用于生成自定义枚举处理器,EnabledTypeHandler 实现了 TypeHandler 接口,并且针对4个接口方法对Enabled类型进行了转换。
代码如下:
package com.example.simple.type; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; /* * Enabled类型处理器 * */ public class EnabledTypeHander implements TypeHandler<Enabled> { private final Map<Integer,Enabled> enabledMap = new HashMap<Integer, Enabled>(); public EnabledTypeHander(){ for(Enabled enabled: Enabled.values()){ enabledMap.put(enabled.getValue(),enabled); } } /* * 定义当前数据如何保存到数据库中 * */ @Override public void setParameter(PreparedStatement preparedStatement, int i, Enabled enabled, JdbcType jdbcType) throws SQLException { // 将枚举的code设置进去 preparedStatement.setInt(i,enabled.getValue()); } /* * rs.getInt(int index); rs.getInt(String columName); 你可以通过索引或者列名来获得查询结果集中的某一列的值。 例如:while(rs.next) { rs.getInt(1)//等价于rs.getInt("flowid"); rs.getString(5)//等价于rs.getInt("student_name"); } 注意:getInt()和getString()方法的索引值从1开始,表示第一个字段。 * */ /* *获取值,按照列名拿 * */ @Override public Enabled getResult(ResultSet resultSet, String columnName) throws SQLException { Integer value = resultSet.getInt(columnName); // 获取枚举对象 return enabledMap.get(value); } /* *获取值,按照索引拿 * */ @Override public Enabled getResult(ResultSet resultSet, int columnIndex) throws SQLException { Integer value = resultSet.getInt(columnIndex); return enabledMap.get(value); } /* * 存储过程获取值 * */ @Override public Enabled getResult(CallableStatement callableStatement, int columnIndex) throws SQLException { Integer value = callableStatement.getInt(columnIndex); return enabledMap.get(value); } }
3.在mybatis_config.xml中进行配置:
<typeHandlers> <typeHandler handler="com.example.simple.type.EnabledTypeHandler" javaType="com.example.simple.type.Enabled"/> </typeHandlers>
4. 测试结果如下:
这时自定义枚举处理器发挥了作用,测试正常进行。