• 需求,就是我们需求统一管理字段,比如我们规定a是开始 b是结束,那么在数据库存储的时候就可以存储单个字符

枚举

  • 我们先来了解下Java的枚举
  • Java的枚举我简单理解就是特殊的类,类所有的写法,枚举也可以有~

简单枚举

1
2
3
4
5
6
7
8
public enum enum1 {
RED, GREEN, BLANK, YELLOW;

//main函数为测试内容,你可以直接删除才是真正的枚举类
public static void main(String[] args) {
System.out.println(enum1.BLANK);//输出BLANK
}
}

带构造函数的枚举

  • 就是可以存储多个数据啦
    • 需求就是我们希望这个枚举可以有多个信息,而不是变量名和值一样,比如我规定a代表code为200,message为”成功’这种
1
2
3
4
5
//你可以理解为带构造函数的存储的信息如下~
a -> {
code:200,
message:"成功",
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public enum enum2 {
//注意,这里不是构造函数名称,而是自定义的枚举名称,如SUCCESS,FAIL
SUCCESS(200,"成功"),//注意要逗号分隔,最后一个不添加逗号
FAIL(500,"失败")
//分号最好另起一行,隔断作用
;

//添加成员变量
private int code;//代码
private String message;//消息
//添加构造函数
enum2(int code,String message){
this.code = code;
this.message = message;
}

//添加Getter,当然你也可以使用lombok
public int getCode(){
return this.code;
}
public String getMessage(){
return this.message;
}


//main函数为测试内容,你可以直接删除才是真正的枚举类
public static void main(String[] args) {
enum2 one = enum2.FAIL;
System.out.println(one.getCode());//输出500
System.out.println(one.getMessage());//输出失败
}
}

结合mybatis-plus实现枚举映射存储

  • 就是数据库存储a,然后用户看到的是更复杂的数据
    • 比如数据库存储1 后面查询返回给用户的实际是”已开始”
  • 目前依赖如下,可以看到mybatis-plus为3.5.12

配置

  • 貌似3.5不需要配置什么枚举扫描类的包和handler了,只需要添加@EnumValue和@JsonValue就可以

使用

  • 创建枚举
    • 这里创建了枚举EnumTest3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Getter
public enum EnumTest3 {
END(-1,"中止"),
STARTED(1,"已开始"),
COMPLETE(2,"已结束"),
PROCESS(3,"流程中");
;
@EnumValue
private int code;//实际存入数据库的
//@JsonValue记得添加,否则不会自动映射!
@JsonValue
private String status;//用户看到的
EnumTest3(int code,String status){
this.code = code;
this.status = status;
}
}

  • entity更换为枚举类型
    • entity就是数据库和实体类的对应
1
2
3
4
5
6
7
8
9
10
11
import com.example.demo_6.enums.EnumTest3;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("enum_test")
public class EnumTest {
@TableId(type = IdType.AUTO)
private int id;
private EnumTest3 status;//测试枚举字段
}

  • TestEnumReq类内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example.demo_6.Req;

import com.example.demo_6.enums.EnumTest3;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestEnumReq {
//用户传递过来的数据
private EnumTest3 status;
}

  • controller测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.example.demo_6.controller;

import com.example.demo_6.Req.TestEnumReq;
import com.example.demo_6.entity.EnumTest;
import com.example.demo_6.enums.EnumTest1;
import com.example.demo_6.enums.EnumTest3;
import com.example.demo_6.mapper.EnumTestMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/enumTest")
public class TestEnumController {
@Autowired
EnumTestMapper enumTestMapper;
@PostMapping("/insert")
//这个是测试前端传递的参数有没有正确存储到数据库
//这样子前端可以传1也可以传递"已开始"
//这样子前端传递 "已开始"就只会在数据库存储1 , "已结束"就只会在数据库存储2
public int one(@RequestBody TestEnumReq enumReq) {
EnumTest test1 = new EnumTest();
test1.setStatus(enumReq.getStatus());
return enumTestMapper.insert(test1);
}
@PostMapping("/list")
//这个是测试返回给前端的数据有没有映射上去,比如数据库里面是1,返回给用户的"已开始"
public List<EnumTest> list() {
return enumTestMapper.selectList(null);
}
}

  • 数据库内容

  • 调用**/enumTest/list**接口输出内容

参考学习文章