Fork me on GitHub

枚举处理器——自定义枚举处理器(进阶)

上一篇的枚举处理器的配置初步解决了枚举问题 ,但有的时候,值既不是枚举的字面值,也不是枚举的索引值,这时就需要自行设计枚举处理器了。
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. 测试结果如下:

 

 

 这时自定义枚举处理器发挥了作用,测试正常进行。

posted @ 2020-12-28 11:50  叶语婷  阅读(202)  评论(0编辑  收藏  举报