mybatisPlus之通用枚举及字段类型处理器

目录

通用枚举

为什么需要枚举类

 @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这两个值来表示两个不同的性别

mybatisPlus之通用枚举及字段类型处理器_第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 {
    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("[email protected]");
    user.setGenderEnum(GenderEnum.MAN);
    user.setStatus(1);
    userMapper.insert(user);
}

此时我们查看控制台,会发现添加失败了

mybatisPlus之通用枚举及字段类型处理器_第2张图片

原因是我们无法将一个枚举类型作为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;
    }
}

 此时我们再次执行添加操作,发现可以成功添加数据,而枚举类型的值也作为数据被插入到数据库中

mybatisPlus之通用枚举及字段类型处理器_第3张图片

 字段类型处理器

为什么需要字段类型处理器

在某些场景下,我们在实体类中是使用Map集合作为属性接收前端传递过来的数据的,但是这些数据存储在数据库时,我们使用的是json格式的数据进行存储,json本质是一个字符串,就是varchar类型。那怎么做到实体类的Map类型和数据库的varchar类型的互相转换,这里就需要使用到字段类型处理器来完成。

类型处理器,用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值

 它可以帮助开发者处理实体类中不同类型的属性,在与数据库进行交互时自动进行类型转换,避免了手动转换的麻烦。

具体使用

【1】我们先在实体类中添加一个字段,Map类型

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User extends Model {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private GenderEnum gender;
    private Integer status;
    private Map contact;//联系方式
}

【2】在数据库中我们添加一个字段,为varchar类型

mybatisPlus之通用枚举及字段类型处理器_第4张图片

【3】为实体类添加上对应的注解,实现使用字段类型处理器进行不同类型数据转换

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(autoResultMap = true)//查询时将json字符串封装为Map集合
public class User extends Model {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private GenderEnum gender;
    private Integer status;
    @TableField(typeHandler = FastjsonTypeHandler.class)//指定字段类型处理器
    private Map contact;//联系方式
}

【4】字段类型处理器依赖Fastjson这个Json处理器,所以我们需要引入对应的依赖  


    com.alibaba
    fastjson
    1.2.76

 【5】测试添加操作

@Test
void typeHandler(){
    User user = new User();
    user.setName("zhang");
    user.setAge(28);
    user.setEmail("[email protected]");
    user.setGender(GenderEnum.MAN);
    user.setStatus(1);
    HashMap 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), [email protected](String), 0(Integer), 1(Integer), {"phone":"010-1234567","tel":"13388889999"}(String)
<==    Updates: 1 

  通过观察SQL语句,我们发现当插入一个Map类型的字段的时候,该字段会转换为String类型

查看数据库中的信息,发现添加成功

mybatisPlus之通用枚举及字段类型处理器_第5张图片

 【6】测试查询操作,通过结果发现,从数据库中查询出来的数据,已经被转到Map集合

@Test
void typeHandlerSelect(){
    List users = userMapper.selectList(null);
    System.out.println(users);
}

mybatisPlus之通用枚举及字段类型处理器_第6张图片

你可能感兴趣的:(mybatisPlus,java,开发语言,mybatis,数据库,spring,springboot)