spring boot + mybaits 處理枚舉類 enum

枚舉:java

//實現層調用sql

orderMapper.getOrder(OrderStatus.DISCOUNT);apache

sql打印:mybatis

實際sql: select * from order where orderStatus = DISCOUNTapp

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

 

在不使用更改寫法spa

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

前提條件下。xml

源碼:org.apache.ibatis.type.BaseTypeHandler  抽象類blog

 

 

 

抽象方法 :

 

須要重寫 繼承 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()方法。便可

相關文章
相關標籤/搜索