MybatisPlus 处理保存实体对象时,对于枚举类型的数据库存储问题以及解决 @EnumValue 失效问题

news/2024/7/3 5:49:59

MybatisPlus 处理保存实体对象时,对于枚举类型的数据库存储问题以及解决 @EnumValue 失效问题

  • 1. 前言
    • 1.1 先看问题代码
    • 1.2 存在的问题
  • 2. 解决前言问题(自定义)
    • 2.1 自定义枚举转换器
    • 2.2 附源码:
    • 2.3. 参考
  • 3. 解决 上述 @EnumValue 失效问题
    • 3.1 首先,配置文件
    • 3.2 实现效果的方式
      • 3.2.1 使用 @EnumValue 注解
      • 3.2.2 使用 implements IEnum<String>
    • 3.3 注意实体
    • 3.4 测试看效果
      • 3.4.1 插入数据
      • 3.4.2 查询数据
    • 3.5 官网详解
  • 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 <E> 枚举类型
     */
    @MappedTypes({MyBaseEnum.class})
    public class ValueEnumTypeHandler<E extends Enum<?> & MyBaseEnum> extends BaseTypeHandler<MyBaseEnum> {
    
        private Class<E> type;
    
        public ValueEnumTypeHandler(Class<E> type) {
            if (type == null) {
                throw new IllegalArgumentException("Type argument cannot be null");
            }
            this.type = type;
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, MyBaseEnum parameter, JdbcType jdbcType)
                throws SQLException {
    //        ps.setInt(i, parameter.getCode());
            ps.setObject(i, parameter.getCode());
        }
    
        @Override
        public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
            int code = rs.getInt(columnName);
            return rs.wasNull() ? null : codeOf(code);
        }
    
        @Override
        public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            int code = rs.getInt(columnIndex);
            return rs.wasNull() ? null : codeOf(code);
        }
    
        @Override
        public 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 <E extends Enum<?> & MyBaseEnum> E codeOf(Class<E> 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","女孩");
    
    //    @EnumValue
        private String code;
        private String desc;
    
        SexEnum(String code, String desc) {
            this.code = code;
            this.desc = desc;
        }
    
        @Override
        public String getCode() {
            return this.code;
        }
    
        @Override
        public String getDesc() {
            return this.desc;
        }
    
    }
    
  4. 实体(实体里要注意换成ValueEnumTypeHandler):
    @TableField(typeHandler = ValueEnumTypeHandler.class)
        private SexEnum sex;
    
    在这里插入图片描述

2.3. 参考

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

3. 解决 上述 @EnumValue 失效问题

  • 上面自定义虽然解决问题了,但是略显麻烦,既然有简单的方法肯定还是想用简单的,就是想解决问题就失效了呢?继续往下看吧

3.1 首先,配置文件

  • 需要配置枚举的扫描包
    (其中 type-enums-package 也可用 typeEnumsPackage):
    mybatis-plus:
      type-aliases-package: com.liu.susu.*.entity
      type-enums-package: com.liu.susu.*.entity.enums;com.liu.susu.message.enums
    
    在这里插入图片描述

3.2 实现效果的方式

3.2.1 使用 @EnumValue 注解

  • 代码如下:
    在这里插入图片描述
    package com.liu.susu.message.enums;
    
    import com.baomidou.mybatisplus.annotation.EnumValue;
    import com.fasterxml.jackson.annotation.JsonValue;
    
    public enum SexEnum {
        BOY("1", "男孩"),
        GIRL("2", "女孩");
    
        SexEnum(String code, String desc) {
            this.code = code;
            this.desc = desc;
        }
    
        @EnumValue //标注:存数据库里存 1 2
        private final String code;
    
        @JsonValue //给前端返回时用
        private final String desc;
    
    }
    
    

3.2.2 使用 implements IEnum

  • 如下:
    在这里插入图片描述
    package com.liu.susu.message.enums;
    
    import com.baomidou.mybatisplus.annotation.IEnum;
    
    public enum ColourEnum implements IEnum<String> {
        BLACK("b", "黑色"),
        WHITE("w", "白色");
    
        private String value;
    
        private String name;
    
        ColourEnum(String value, String name) {
            this.value = value;
            this.name = name;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    
    

3.3 注意实体

  • 不要使用 typeHandler = EnumTypeHandler.class!!!!,如下:
    在这里插入图片描述

3.4 测试看效果

3.4.1 插入数据

  • 代码如下:
    在这里插入图片描述
    在这里插入图片描述
  • 看效果:
    在这里插入图片描述

3.4.2 查询数据

  • 查询,如下:
    在这里插入图片描述
  • 好了,简单省事又解决问题,所以有空多看官网

3.5 官网详解

  • 官网地址:
    https://baomidou.com/pages/8390a4/#.

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

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

http://lihuaxi.xjx100.cn/news/298859.html

相关文章

菜狗杯Misc抽象画wp

目录一、拿到题目先干嘛二、具体的解密操作1.把文本放到CyberChef中用Magic解密2.把完整的解密内容复制出来3.打开010并以hex格式粘贴内容4.点一下HEX5.保存成png三、用工具拿到隐写内容一、拿到题目先干嘛 题目附件是一个txt&#xff0c;打开里面就是各种字符&#xff0c;拿去…

【新知实验室-TRTC开发】实时音视频之集美真心话

目录 前言&#xff1a; 一、说说TRTC呗 语音互动直播 语聊房 语音电台 二、成为TRTC的体验官 1、1分钟了解TRTC产品 2、2分钟新手入门 3、别忘了入场券&#xff0c;也别告诉别人哦 三、3分钟完成新应用搭建 1、解压下载源码 2、修改JS文件 3、修改index文件 4、和集…

HTML简单的个人博客网站 DIV学生网页设计作品 dreamweaver作业静态HTML网页设计模板 个人网页作业制作

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

基于Java旅游网站管理系统、Java旅游线路和景点网站系统设计与实现 毕业设计开题报告

本科生毕业论文 基于java(springboot框架)旅游网站管理系统 开题报告 学 院&#xff1a; 专 业&#xff1a; 计算机科学与技术 年 级&#xff1a; 学生姓名&#xff1a; 指导教师&…

hevc pps解析

在编码视频流中&#xff0c;一个CVS包含多幅图像&#xff0c;每幅图像可能包括一个或者多个SS&#xff0c;每个SS头提供其所引用的PPS标示号&#xff0c;以此得到相应PPS中的共用信息&#xff0c;对于同一幅图像&#xff0c;其内所有的SS都用同一个PPS&#xff0c;需要注意的是…

【M365运维】浏览器TLS/SSL选项导致的故障

【问题】用户报告说O365常用三件套Teams、Outlook、OD突然间都用不了 - Teams: Error code - caa70004 - Outlook&#xff1a; 连接不到O365服务&#xff0c;一直显示正在尝试连接... 手动发送/接收邮件&#xff0c;报 0x8004011D错。 【排查及解决】 - 先查了O365服务的健康状…

基于Java+Springboot+Vue+elememt疫情返乡人员管控系统设计实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅收藏&#x1f447;&…

新加坡国立大学尤洋:我的四个选择,本质的喜欢催动长久的坚持丨青源专栏...

为了启发青年学者思考职业发展&#xff0c;激发科研灵感&#xff0c;智源社区推出青源专栏&#xff0c;定期邀请青源会员分享他们的研究思考和科研感悟。新加坡国立大学计算机系校长青年教授、青源会会员尤洋分享了他在高性能计算研究、创业经历以及在新加坡的生活所感。从求学…