Mybatis枚举映射数据库int存储转换

1、背景

使用Mybatis存储枚举类型,数据库中以int类型存储,需要进行类型转换(handler适配)

2、代码实现

枚举类定义:

public interface IEnum
{
    int getValue();

    void setValue(int value);
}
public enum EnumWhatIfChangeType implements IEnum
{

    /**
     * 不变
     */
    UnChange(0),
    
    /**
     * 变化
     */
    Changed(1);

    private int value;
    
    private EnumWhatIfChangeType(int value)
    {
        this.value = value;
    }
    
    @Override
    public int getValue()
    {
        return this.value;
    }

    @Override
    public void setValue(int value)
    {
        this.value = value;
    }

}

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;

public class EnumValueTypeHandler extends BaseTypeHandler<IEnum>
{

    private Class<IEnum> type;

    /**
     * 构造函数<br>
     */
    public EnumValueTypeHandler(Class<IEnum> type)
    {
        this.type = type;
    }

    @Override
    public IEnum getNullableResult(ResultSet rs, String columnName)
        throws SQLException
    {
        int value = rs.getInt(columnName);
        if (rs.wasNull())
        {
            return null;
        }
        else
        {
            return convertToEnum(value);
        }
    }

    @Override
    public IEnum getNullableResult(ResultSet rs, int columnIndex)
        throws SQLException
    {
        int value = rs.getInt(columnIndex);
        if (rs.wasNull())
        {
            return null;
        }
        else
        {
            return convertToEnum(value);
        }
    }

    @Override
    public IEnum getNullableResult(CallableStatement cs, int columnIndex)
        throws SQLException
    {
        // 数据库中存储int类型
        int value = cs.getInt(columnIndex);
        if (cs.wasNull())
        {
            return null;
        }
        else
        {
            return convertToEnum(value);
        }
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, IEnum param,
                                    JdbcType jdbcType) throws SQLException
    {
        ps.setInt(i, param.getValue());
    }

    private IEnum convertToEnum(int value)
    {
        IEnum[] iEnums = type.getEnumConstants();
        for (IEnum iEnum : iEnums)
        {
            if (iEnum.getValue() == value)
            {
                return iEnum;
            }
        }
        return null;
    }
}

Mapper.xml中<resultMap中>添加转换:
 

    <resultMap type="com.xxx.xxPM" id="xxPM">
        <result property="changeType" column="CHANGETYPE" javaType="com.xxx.EnumChangeType" typeHandler="com.xxx.handler.EnumValueTypeHandler" />  
    </resultMap>

参考博客:

https://blog.csdn.net/jerome_s/article/details/53965293

扫描二维码关注公众号,回复: 4959273 查看本文章

https://www.cnblogs.com/cc-java/p/6593589.html

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/86518088