spring boot + mybaits 处理枚举类 enum

本文介绍如何在SpringBoot与MyBatis中有效处理枚举类型,通过自定义枚举处理器,使枚举值能正确转换为数据库中的整型值,避免直接使用枚举名称带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

枚举:

//实现层调用

orderMapper.getOrder(OrderStatus.DISCOUNT);

sql打印:

实际sql: select * from order where orderStatus = DISCOUNT

预期sql: select * from order where orderSatus = 11;

 

在不使用更改写法

orderMapper.getOrder(OrderStatus.DISCOUNT.getCode());

前提条件下。

源码:org.apache.ibatis.type.BaseTypeHandler  抽象类

 

 

 

抽象方法 :

 

需要重写 继承 BaseTypeHandler 重写方法

package order.handler;

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

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import common.enums.BaseEnum;

public class StringEnumTypeHandler extends BaseTypeHandler<BaseEnum> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum parameter, JdbcType jdbcType)
            throws SQLException {
     //核心方法 指定枚举获取code的方法。同理 orderMapper.getOrder(OrderStatus.DISCOUNT.getCode());
        ps.setString(i, parameter.getCode().toString());

    }

    @Override
    public BaseEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String val = rs.getString(columnName);
        return getEnum(Integer.parseInt(val));
    }

    @Override
    public BaseEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

         return getEnum(Integer.parseInt(rs.getString(columnIndex)));
    }

    @Override
    public BaseEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

        return getEnum(Integer.parseInt(cs.getNString(columnIndex)));
    }

    private BaseEnum getEnum(int val) {
        Class<BaseEnum> sexClass = BaseEnum.class;
        BaseEnum[] sexs = sexClass.getEnumConstants();

        for (BaseEnum se : sexs) {
            if (se.getCode() == val) {
                return se;
            }
        }
        return null;
    }
}

 

 配置mybatis.config 

orderMapper.xml

修改前:where type = #{type,jdbcType = int}

修改后:

 

基类: 

 

所有的枚举都实现这个接口,然后动态加载方法调用枚举的getCode()方法。即可

 

posted on 2019-05-14 18:06 zhouixi 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/1-Admin/p/10863703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值