🌏 抛出问题
如果让你实现这么一个功能:将性别使用数字存储到数据库中,但是前端需要获取到的是具体的性别描述(比如男女),你会怎么实现?
相信有很多的小伙伴想到的就是,在前端或者后端使用if语句判断从数据库中获取到的值,如果是0的话就返回或者输出女,如果是1的话就返回或者输出男。可以 但不优雅
那我用switch判断总算优雅了吧
优雅 但不够装13
不够装13也是错?低调不是错,但是我们要让老板感觉花这些钱雇自己他值了,甚至还要让他感觉他赚到了。
🌎 解决问题
对于MP的通用枚举,官方文档如是说道:mybatis-plus的官方文档对通用枚举的介绍,总结来说就是简单的三个步骤:创建枚举类、修改配置文件、修改实体类字段属性,接下来就以一个案例加深小伙伴们的理解
第一步: 创建枚举类,并给相应的字段添加相应的注解,两个注解的注释都在代码中给出了
import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonValue; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author : mereign * @date : 2022/3/18 - 15:28 * @desc : 性别的枚举类 */ @Getter @AllArgsConstructor public enum SexEnum { FEMALE(0, "女"), MALE(1, "男"), GROUP(2, "组合"), NONE(3, "不详"); // 将注解标识的属性值存储到数据库中 @EnumValue private Integer sex; // 将注解标识的属性值返回给前端 @JsonValue private String sexName; }
第二步: 配置文件
mybatis-plus: # 声明枚举类所在包 type-enums-package: com.xiaoyu.enums
第三步: 修改实体类字段属性,其他的属性都照常设置
/** * 性别(0女1男2组合3不明) */ private SexEnum sex;
前端控制器中使用的方法是MP中自带的list方法
/** * 查询所有歌手 * @return */ @RequestMapping(value = "/allSinger", method = RequestMethod.GET) public Object allSinger() { // 查询所有的歌手信息并返回 return service.list(); }
测试
怎么回事?前端并没有输出任何内容,难道是装13不成?别急,让我们使用测试类简单分析一波 根据测试类的返回值可以得知,从数据库中查询到的sex字段值既不是0|1也不是男|女而是null,这到底是怎么回事?
经过半天的百度和试错,最终将原因锁定在字段类型上,原来是我们的数据库中sex的类型是tinyint而枚举类中使用@EnumValue修饰的字段类型是integer,由于字段类型不匹配导致返回的是一个null,这也就能够解释得通为什么前端不显示sex了。 我的解决方案是将数据库中的类型改为int,虽然说数据库中使用tinyint可以节省数据库的存储空间,但是由于本人的能力有限,无法找到tinyint对应的java类型,最后无奈修改了数据库的表结构,如果小伙伴们有妙招的话,还请评论区告诉小扎扎如此操作前端就显示信息了