目录
通用枚举
为什么需要枚举类
@EnumValue
具体使用
字段类型处理器
为什么需要字段类型处理器
具体使用
通用枚举
为什么需要枚举类
类的对象只有有限个,确定的。举例如下:
- 星期: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);
}