自定义枚举的应用

参考:https://segmentfault.com/a/1190000010755321

一:场景,

1 OPEN(10),         //开启
2     CLOSE(11),         //关闭
3     OFF_LINE(12),     //离线
4     FAULT(200),     //故障
5     UNKNOWN(255);     //未知

来代表5种状态。

  前台传入的是OPEN 。然后数据库中保存的是10.(插入)

  数据库中查询到的是10.输出的是OPEN  (查询)

一:1)实体类

package com.ssm.bean;

import com.ssm.enums.ComputerState;

public class Process {
    private Integer id;
    private String name;
    private ComputerState status; //是一个枚举类 类型
    public Process() {
    }

    public Process(Integer id, String name, ComputerState status) {
        this.id = id;
        this.name = name;
        this.status = status;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ComputerState getStatus() {
        return status;
    }

    public void setStatus(ComputerState status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Process{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", status=" + status +
                '}';
    }
}

2):写一个  ComputerState  枚举类:

package com.ssm.enums;

public enum ComputerState implements BaseCodeEnum{
    OPEN(10),         //开启
    CLOSE(11),         //关闭
    OFF_LINE(12),     //离线
    FAULT(200),     //故障
    UNKNOWN(255);     //未知

    private int code;
    ComputerState(int code) { this.code = code; }

    @Override
    public int getCode() {
        return this.code;
    }
}

3):实现的BaseCodeEnum枚举类。

/**
 * 接口只有一个返回编码的方法,返回值将被存入数据库。
 */
public interface BaseCodeEnum {
    int getCode();
}

4):自定义CodeEnumTypeHandler  转换器。

package com.ssm.enums;

import com.ssm.utils.CodeEnumUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CodeEnumTypeHandler<E extends Enum<?> & BaseCodeEnum> extends BaseTypeHandler<BaseCodeEnum> {

    private Class<E> type;

    public CodeEnumTypeHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.type = type;
    }

    /**
     * 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型
     *   保存的时候,传入的是:ComputerState.OPEN   保存到数据库的是:10
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, BaseCodeEnum parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter.getCode());
    }

    /**
     * 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型
     *
     *       数据库中是10  输出的值是:OPEN
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */
    @Override
    public BaseCodeEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        int code = rs.getInt(columnName);
        return rs.wasNull() ? null : codeOf(code);
    }

    /**
     * 用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型
     *    这个是通过字段的索引的。还没有测出来怎么使用。
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public BaseCodeEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
       /* int code = rs.getInt(columnIndex);
        return rs.wasNull() ? null : codeOf(code);*/
       return null;
    }

    /**
     * 用定义调用存储过程后,如何把数据库类型转换为对应的Java类型
     * @param cs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public BaseCodeEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        /*int code = cs.getInt(columnIndex);
        return cs.wasNull() ? null : codeOf(code);*/
        return null;
    }

    private E codeOf(int code){
        try {
            return CodeEnumUtil.codeOf(type, code);
        } catch (Exception ex) {
            throw new IllegalArgumentException("Cannot convert " + code + " to " + type.getSimpleName() + " by code value.", ex);
        }
    }
}

5):在mybatis-config.xml中配置

<!--使用枚举类。从数据库中查询的是10,转换成枚举类里的OPEN(查询)。传递是:OPEN 保存到数据库中是:10(保存)  -->
    <typeHandlers>
        <typeHandler handler="com.ssm.enums.CodeEnumTypeHandler" javaType="com.ssm.enums.ComputerState"/>
    </typeHandlers>

 

posted @ 2018-04-28 13:52  陆伟  阅读(272)  评论(0编辑  收藏  举报