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

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

通用枚举

为什么需要枚举类

类的对象只有有限个,确定的。举例如下:

  • 星期: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);
}

相关文章
|
5月前
|
前端开发 Java 数据库连接
MyBatis查询优化:枚举在条件构建中的妙用
MyBatis查询优化:枚举在条件构建中的妙用
|
数据库连接 测试技术 数据库
MybatisPlus之通用枚举&代码生成器&多数据源
今天我们来了解MyBatisplus 的通用枚举和代码生成器和多数据源。
|
4月前
|
SQL 存储 测试技术
深入了解MyBatis-Plus中的枚举处理器及实例演示
深入了解MyBatis-Plus中的枚举处理器及实例演示
79 0
|
10月前
MyBatis-Plus之枚举
MyBatis-Plus之枚举
57 0
|
5月前
|
XML JSON fastjson
mybatis-plus字段类型处理器
mybatis-plus字段类型处理器
45 0
|
6月前
|
存储 数据库
MybatisPlus通用枚举
MybatisPlus通用枚举
45 0
|
9月前
|
Java 数据库连接 数据库
解析Java中的MyBatis Plus注解 @EnumValue:优雅处理枚举值映射
在数据库操作中,枚举类型的值往往需要与数据库表中的某个字段进行映射,以便在操作中能够进行相应的转换。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@EnumValue`,使开发者能够更加灵活地处理枚举值与数据库字段的映射关系,从而减少了繁琐的转换逻辑。本文将详细介绍 `@EnumValue` 注解的用法及其在持久层开发中的应用。
1256 0
|
9月前
|
Java 数据库连接 数据库
深入了解Java中的MyBatis Plus注解 @IEnum:优雅处理枚举映射
在数据库操作中,经常需要将Java中的枚举类型映射到数据库表中的某个字段。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@IEnum`,使得开发者能够更加优雅地处理枚举与数据库字段之间的映射关系。本文将详细介绍 `@IEnum` 注解的用法及其在持久层开发中的应用。
383 0
|
2月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
46 1