spring boot mybatis 枚举类运用问题

第一:

我们使用mybatis的时候 java类会定义成枚举类与数据库表进行映射,而mybaits 默认插入取的枚举的名称,

列如 : RETURN(10,“退货”),存入数据库则是return ;而我们需要的是存入 code 10。未解决本问题则需要自己定义类来重写实现,需要继承BaseTypeHandler :

package com.biz.primus.model.scan.code.enums;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @ClassName BaseEnumTypeHandler
 * @Description  枚举类型处理类
 * @Author Jaye
 * @Date 2019/3/27
 **/
public class BaseEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
    private Class<E> type;

    public BaseEnumTypeHandler() {
    }

    public BaseEnumTypeHandler(Class<E> type) {
        this.type = type;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
        if (jdbcType == null) {
            ps.setString(i, parameter.toString());
        } else {
            ps.setObject(i, parameter.name(), jdbcType.TYPE_CODE);
        }
    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return get(rs.getString(columnName));
    }

    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return get(rs.getString(columnIndex));
    }

    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return get(cs.getString(columnIndex));
    }



    private <E extends Enum<E>> E get(String v) {
        if (v == null) {return null;}
        if (StringUtils.isNumeric(v)) {
            return get((Class<E>) type, Integer.parseInt(v));
        } else {
            return Enum.valueOf((Class<E>) type, v);
        }
    }

    private <E extends Enum<E>> E get(Class<E> type, int v) {
        Method method = null;
        E result = null;
        try {
            method = type.getMethod("get", int.class);
            result = (E) method.invoke(type, v);
        } catch (NoSuchMethodException e) {
            result = Enum.valueOf(type, String.valueOf(v));
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return result;

    }
}

在上面 BaseEnumTypeHandler 中的 setNonNullParameter 实现里 我们将 原来的   修改为 parameter.toString()  然后在枚举类重写toString方法 返回你需要存入的字段 如:RETURN(10,“退货”), 你则需要返回 code 10, 

@Override
public String toString() {
    return RETURN.code.toString();
}

然后在你插入的 mybatis xml中的 对应字段上加入 

typeHandler handler="你自定义类的路劲"

这样插入数据库后的值就是 10 而不是RETURN 。 插入问题完工

第二 :

查询数据返回实体类时需要把刚才存入的10转化为枚举类型 ,就需要再上面自定义类的 get方法中做处理,即把你获取到的10 转成对应的枚举类。

然后 再返回的 resultMap 中类型指定为 typeHandler handler="你自定义类的路劲"  完工

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值