MybatisPlus 处理保存实体对象时,对于枚举类型的数据库存储问题
创始人
2024-03-08 07:31:53

MybatisPlus 处理保存实体对象时,对于枚举类型的数据库存储问题

  • 1. 前言
    • 1.1 先看问题代码
    • 1.2 存在的问题
  • 2. 解决前言问题
    • 2.1 自定义枚举
    • 2.2 附源码:
  • 3. 参考
  • 4. 推荐 Mybatis、MybatisPlus 其他相关问题的文章

1. 前言

1.1 先看问题代码

  • 如下:
  • 枚举类:
    在这里插入图片描述
  • 实体:
    用自带的枚举解析器:
    @TableField(typeHandler = EnumTypeHandler.class)
    
    在这里插入图片描述
  • service 里:通过mybatisPlus自带方法保存对象
    在这里插入图片描述

1.2 存在的问题

  • 发现问题,如下:
    数据库存的不是我想要的枚举的key,想存 1 和 2,这种方式没有实现
    在这里插入图片描述
    在这里插入图片描述
  • 所以需自己写枚举转换器

2. 解决前言问题

2.1 自定义枚举

  • 看代码:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    核心代码还是看下面源码吧
  • 看效果:
    在这里插入图片描述
    问题解决

2.2 附源码:

  1. MyBaseEnum.java
    package com.liu.susu.enums.handler;/*** description** @author susu* @date 2022-12-01**/
    public interface MyBaseEnum {Object getCode();String getDesc();}
    
  2. ValueEnumTypeHandler.java
    package com.liu.susu.enums.handler;import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedTypes;import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;/*** 值枚举转换处理器* @param  枚举类型*/
    @MappedTypes({MyBaseEnum.class})
    public class ValueEnumTypeHandler & MyBaseEnum> extends BaseTypeHandler {private Class type;public ValueEnumTypeHandler(Class type) {if (type == null) {throw new IllegalArgumentException("Type argument cannot be null");}this.type = type;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, MyBaseEnum parameter, JdbcType jdbcType)throws SQLException {
    //        ps.setInt(i, parameter.getCode());ps.setObject(i, parameter.getCode());}@Overridepublic E getNullableResult(ResultSet rs, String columnName) throws SQLException {int code = rs.getInt(columnName);return rs.wasNull() ? null : codeOf(code);}@Overridepublic E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {int code = rs.getInt(columnIndex);return rs.wasNull() ? null : codeOf(code);}@Overridepublic E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {int code = cs.getInt(columnIndex);return cs.wasNull() ? null : codeOf(code);}private E codeOf(int code){try {return codeOf(type, code);} catch (Exception ex) {throw new IllegalArgumentException("Cannot convert" + code + "to" + type.getSimpleName() + "by code value.", ex);}}private static  & MyBaseEnum> E codeOf(Class enumClass, Object code) {E[] enumConstants = enumClass.getEnumConstants();for (E e : enumConstants) {if (e.getCode() == code) {return e;}}return null;}}
  3. SexEnum.java
    在这里插入图片描述
    package com.liu.susu.enums;import com.baomidou.mybatisplus.annotation.EnumValue;
    import com.liu.susu.enums.handler.MyBaseEnum;public enum SexEnum implements MyBaseEnum {BOY("1","男孩"),GIRL("2","女孩");//    @EnumValueprivate String code;private String desc;SexEnum(String code, String desc) {this.code = code;this.desc = desc;}@Overridepublic String getCode() {return this.code;}@Overridepublic String getDesc() {return this.desc;}}
    
  4. 实体(实体里要注意换成ValueEnumTypeHandler):
    @TableField(typeHandler = ValueEnumTypeHandler.class)private SexEnum sex;
    
    在这里插入图片描述

3. 参考

  • 上述源码参考文章地址:
    基于 SpringBoot+MybatisPlus+Jackson 优雅使用枚举值的方案.

4. 推荐 Mybatis、MybatisPlus 其他相关问题的文章

  • 关于mybatis 枚举的其他问题可以看下面文章
    • Mysql + Mybatis 开发中的各种小问题
    • mybatis自定义枚举类型的转换器以及各种使用场景.
    • springBoot项目 ObjectMapper 序列化统一格式处理(含枚举问题)
    • 解决 LocalDateTime 的序列化与反序列化问题
    • springboot项目前后端分离:统一返回数据格式+mybatis 分页(含枚举格式统一)
    • MybatisPlus简单使用与自定义sql以及通过自定义sql实现多表联查的分页查询
    • 解决雪花算法id精度丢失问题(自定义序列化类将Set<Long> 转化成 Set<String>)
    • mybatis调用Oracle存储过程(给出无参、入参、出参调用等详细例子)——真的的保姆级别.

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...