通用枚举
为什么需要枚举类
类的对象只有有限个,确定的。举例如下:
- 星期:Monday(星期一)、......、Sunday(星期天)
- 性别:Man(男)、Woman(女)
- 季节:Spring(春节)......Winter(冬天)
- 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
- 就职状态:Busy、Free、Vocation、Dimission
- 订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Return(退货)、Checked(已确认)Fulfilled(已配货)、
- 线程状态:创建、就绪、运行、阻塞、死亡
当需要定义一组常量时,强烈建议使用枚举类
当我们想要表示一组信息,这组信息只能从一些固定的值中进行选择,不能随意写,在这种场景下,枚举就非常的合适。例如我们想要表示性别,性别只有两个值,要么是男性,要么是女性,那我们就可以使用枚举来描述性别。
@EnumValue
@EnumValue是Mybatis Plus框架中的一个注解,用于指定枚举类型属性在数据库中的映射值。当我们使用Java中的枚举类型作为实体类的属性时,如果想要将枚举类型属性的值映射到数据库中以便于查询和存储,就需要使用@EnumValue注解来定义枚举类中具体的映射值。
具体使用
【1】我们先在表中添加一个字段,表示性别,这里我们一般使用int来描述,因为int类型可以通过0和1这两个值来表示两个不同的性别
【2】编写枚举类
public enum GenderEnum { MAN(0,"男"), WOMAN(1,"女"); private Integer gender; private String genderName; GenderEnum(Integer gender, String genderName) { this.gender = gender; this.genderName = genderName; } }
【3】实体类添加相关字段
@Data @AllArgsConstructor @NoArgsConstructor public class User extends Model<User> { private Long id; private String name; private Integer age; private String email; private GenderEnum gender; private Integer status; }
【4】添加数据
@Test void enumTest(){ User user = new User(); user.setName("liu"); user.setAge(29); user.setEmail("liu@powernode.com"); user.setGenderEnum(GenderEnum.MAN); user.setStatus(1); userMapper.insert(user); }
此时我们查看控制台,会发现添加失败了
原因是我们无法将一个枚举类型作为int数字插入到数据库中。不过我们对于枚举类型都给了对应的int的值,所以这里我们只需要进行一个配置,就可以将枚举类型作为数字插入到数据库中,为属性gender,添加上@EnumValue注解
【5】修改枚举类
public enum GenderEnum { MAN(0,"男"), WOMAN(1,"女"); @EnumValue private Integer gender; private String genderName; GenderEnum(Integer gender, String genderName) { this.gender = gender; this.genderName = genderName; } }
此时我们再次执行添加操作,发现可以成功添加数据,而枚举类型的值也作为数据被插入到数据库中
字段类型处理器
为什么需要字段类型处理器
在某些场景下,我们在实体类中是使用Map集合作为属性接收前端传递过来的数据的,但是这些数据存储在数据库时,我们使用的是json格式的数据进行存储,json本质是一个字符串,就是varchar类型。那怎么做到实体类的Map类型和数据库的varchar类型的互相转换,这里就需要使用到字段类型处理器来完成。
类型处理器,用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值
它可以帮助开发者处理实体类中不同类型的属性,在与数据库进行交互时自动进行类型转换,避免了手动转换的麻烦。
具体使用
【1】我们先在实体类中添加一个字段,Map类型
@Data @AllArgsConstructor @NoArgsConstructor public class User extends Model<User> { private Long id; private String name; private Integer age; private String email; private GenderEnum gender; private Integer status; private Map<String,String> contact;//联系方式 }
【2】在数据库中我们添加一个字段,为varchar类型
【3】为实体类添加上对应的注解,实现使用字段类型处理器进行不同类型数据转换
@Data @AllArgsConstructor @NoArgsConstructor @TableName(autoResultMap = true)//查询时将json字符串封装为Map集合 public class User extends Model<User> { private Long id; private String name; private Integer age; private String email; private GenderEnum gender; private Integer status; @TableField(typeHandler = FastjsonTypeHandler.class)//指定字段类型处理器 private Map<String,String> contact;//联系方式 }
【4】字段类型处理器依赖Fastjson这个Json处理器,所以我们需要引入对应的依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency>
【5】测试添加操作
@Test void typeHandler(){ User user = new User(); user.setName("zhang"); user.setAge(28); user.setEmail("zhang@powernode.com"); user.setGender(GenderEnum.MAN); user.setStatus(1); HashMap<String, String> contact = new HashMap<>(); contact.put("phone","010-1234567"); contact.put("tel","13388889999"); user.setContact(contact); userMapper.insert(user); }
执行的SQL语句如下
==> Preparing: INSERT INTO powershop_user ( id, name, age, email, gender, status, contact ) VALUES ( ?, ?, ?, ?, ?, ?, ? )==> Parameters: 1617915941843202049(Long), zhang(String), 28(Integer), zhang@powernode.com(String), 0(Integer), 1(Integer), {"phone":"010-1234567","tel":"13388889999"}(String)
<== Updates: 1
通过观察SQL语句,我们发现当插入一个Map类型的字段的时候,该字段会转换为String类型
查看数据库中的信息,发现添加成功
【6】测试查询操作,通过结果发现,从数据库中查询出来的数据,已经被转到Map集合
@Test void typeHandlerSelect(){ List<User> users = userMapper.selectList(null); System.out.println(users); }