Mybatis如何处理枚举值

Mybatis针对枚举值的处理

源码
介绍
1. 用户管理中存储男女对应的key值100、101
2. 定义枚举类GenderEnum 继承 DbEnum接口
//DbEnum:
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public interface DbEnum extends Serializable {
    public Integer getKey();

}

在这里插入图片描述

// GenderEnum枚举类
@AllArgsConstructor
public enum GenderEnum implements DbEnum{

    MAIL(100, "男"),
    FEMAIL(101, "女"),
    UNKNOWN(102, "未知");
    ;


    private Integer key;
	@JsonValue
    private String value;

    public String getValue() {
        return value;
    }

    @Override
    public Integer getKey() {
        return key;
    }
}

在这里插入图片描述

3.定义枚举类的处理器
public class EnumTypeHandler extends BaseTypeHandler<DbEnum> {

    private Class<DbEnum> enumClass;

    public EnumTypeHandler(Class<DbEnum> enumClass) {
        this.enumClass = enumClass;
    }

    /**
     * 设置存入数据库的值
     * @param preparedStatement
     * @param i
     * @param dbEnum
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, DbEnum dbEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, dbEnum.getKey());
    }

    /**
     * 从数据库返回的处理
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public DbEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int anInt = resultSet.getInt(s);
        return getEnum(anInt);
    }

    /**
     * 用来查询操作,直接利用结果集返回,columnName为列名
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public DbEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return getEnum(resultSet.getInt(i));
    }

    /**
     * 用来存储过程的查询操作,直接利用结果集返回,columnIndex是列索引
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public DbEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return getEnum(callableStatement.getInt(i));
    }

    private DbEnum getEnum(Integer key) {
        DbEnum[] enumConstants = enumClass.getEnumConstants();
        if (Objects.nonNull(enumConstants)) {
            for (DbEnum enumConstant : enumConstants) {
                if (Objects.equals(enumConstant.getKey(), key)) {
                    return enumConstant;
                }
            }
        }
        return null;
    }
}

4.在xml文件中枚举字段定义枚举处理器
1)查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l1uUroKB-1668767763154)(img_2.png)]

2)插入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BXplX65p-1668767763154)(img_3.png)]

5.结果
1)插入

在这里插入图片描述

在这里插入图片描述

2) 查询

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPXqmoOE-1668767942126)(img_5.png)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值