mybatis-plus + springboot 集成枚举类enum自动映射!

本文介绍了如何在Java中使用枚举类型与MyBatis-Plus进行有效结合,以简化数据库操作。通过配置yml文件,设置枚举包路径,创建带有`@EnumValue`和`@JsonValue`注解的枚举类,实现数据库字段与枚举之间的自动转换。同时,为了解决前端传递值的问题,提供了获取枚举的静态方法。在实体类中使用枚举类型字段,使得插入和查询更加便捷。但枚举不能为空的问题仍待解决。
摘要由CSDN通过智能技术生成

当我们的数据有一些重复值时,如男/女,我们干java的一般不会在去建一个性别表专门来放一个性别,男/女。

一般都是用一个枚举类,但是用了枚举我们就得转换来转换去的。

本来今天是要去my-batis转转,看看有没有数据库中时间字段的处理方法,结果看到了一个枚举类的辅助工具!果断拿来应用一波。

首先是yml配置,把路径改成你枚举的路径:

mybatis-plus:
  typeEnumsPackage: com.base.enums

然后开始写枚举类,要配一个

package com.base.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * Sex 性别
 * @author linnine
 *
 */
@Getter
@AllArgsConstructor
@Slf4j
public enum Sex {
    /**
     * 男
     */
    MAN(1,"男"),
    /**
     * 女
     */
    WOMAN(2,"女");

    /**
     * 数据库字段
     */
    @EnumValue
    private final Integer code;

    /**
     * 映射成结果
     */
    @JsonValue
    private final String value;

}

与平常的枚举类不同的是,在code上加了一个@EnumValue,这样在插入的时候,就会使用这个code的值插入到数据库。
在这里插入图片描述
一开始以为在value上面加个@JsonValue就能在查出来的时候自动映射成男/女,结果并没有,给我映射成了MAN!我也是醉了!
在这里插入图片描述
几经百度后,发现要在枚举类中重写toString方法,并且直接返回他的value,或者你想返回什么骚操作都可以,反正就写在这个返回值里。

/**
 * 用来映射,需要手动重写!
 * @return
 */
@Override
public String toString() {
    return this.value;
}

解释完枚举类的配置后,还需要一步,那就是把实体类的字段改成枚举类;

/**
 * @author linnine
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user_text")
public class UserText {

  @TableId(value = "user_id", type = IdType.AUTO)
  private long userId;
  private String userName;
  //本来这里放的是数值类型的code,这里需要直接放枚举,mybatis-plus会自动帮我们转换
  private Sex userSex;

}

这样以后我们写实体类的时候就不用手动赋值来赋值去了。

插入的方法就变成了如下。

@Test
void contextLoads() {
    UserText userText = new UserText();
    userText.setUserName("小明");
    userText.setUserSex(Sex.MAN);
    baseService.save(userText);
}

但是又有一个问题要解决,那就是前端并不会传过来一个枚举类型,要么传值,要么传code,所以我们需要加这么两个方法。

	public static Sex getEnum(String value){
       for (Sex obj:Sex.values()
            ) {
           if (obj.value.equals(value)){
               return obj;
           }
       }
       log.error("未知value[{}]",value);
       return NULL;
   }
   //重载以兼容两个参数,传code或者value都可
   public static Sex getEnum(Integer code){
       for (Sex obj:Sex.values()
       ) {
           if (obj.code.equals(code)){
               return obj;
           }
       }
   	   log.error("未知code[{}]",code);
       return NULL;
   }

还得在最上面加个NULL的枚举,因为可能会传过来一些枚举值没有的值,所以要先传一个默认值,避免程序错误,然后将错误的值记录下来。

所以在插入的时候就可以变成这样。

UserText userText = new UserText();
userText.setUserName("小明");
userText.setUserSex(Sex.getEnum("男"));
baseService.save(userText);

个人暂时感觉完美,哈哈!除了那个要多谢一个toString的,有没有人知道为什么那个@JsonValue无作为的原因!

今天发现,可以写个BaseEnum,然后复制黏贴的时候改个名,里面的类名idea自动帮忙改好了,就很方便!


自从搞了前端才发现,从前端传过来的值,又自动帮我们映射好了,也就是说我们不会去判断不会用去转,自动接收过来了,但是有一个问题,就是这个坑爹的枚举类不能为空!这就很蛋疼了!

因为我又一些小功能是只改1 个字段,然后就炸了,传过来是一个空值,映射不到,但是我又不敢写一个空的msg的枚举,不然mybatis到时候自动帮我把这个枚举为空的0也给映射进去就很尴尬了!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值