当我们的数据有一些重复值时,如男/女,我们干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也给映射进去就很尴尬了!