MyBatis-Plus 实战教程三 拓展插件(一)https://developer.aliyun.com/article/1391873
接下来,我们要在application.yml中配置逻辑删除字段:
mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
测试:
首先,我们执行一个删除操作:
@Test void testDeleteByLogic() { // 删除方法与以前没有区别 addressService.removeById(59L); }
方法与普通删除一模一样,但是底层的SQL逻辑变了:
查询一下试试:
@Test void testQuery() { List<Address> list = addressService.list(); list.forEach(System.out::println); }
会发现id为59的确实没有查询出来,而且SQL中也对逻辑删除字段做了判断:
综上, 开启了逻辑删除功能以后,我们就可以像普通删除一样做CRUD,基本不用考虑代码逻辑问题。还是非常方便的。
注意:
逻辑删除本身也有自己的问题,比如:
- 会导致数据库表垃圾数据越来越多,从而影响查询效率
- SQL中全都需要对逻辑删除字段做判断,影响查询效率
因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。
通用枚举
User类中有一个用户状态字段:
像这种字段我们一般会定义一个枚举,做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型,对应的PO也是Integer。因此业务操作时必须手动把枚举与Integer转换,非常麻烦。
因此,MybatisPlus提供了一个处理枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换。
定义枚举
我们定义一个用户状态的枚举:
代码如下:
package com.onenewcode.mpdemo.enums; import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.Getter; @Getter public enum UserStatus { NORMAL(1, "正常"), FREEZE(2, "冻结") ; private final int value; private final String desc; UserStatus(int value, String desc) { this.value = value; this.desc = desc; } }
然后把User类中的status字段改为UserStatus 类型:
要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值。
MybatisPlus提供了@EnumValue注解来标记枚举属性:
配置枚举处理器
在application.yaml文件中添加配置:
mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
测试
@Test void testService() { List<User> list = userService.list(); list.forEach(System.out::println); }
最终,查询出的User类的status字段会是枚举类型
JSON类型处理器
数据库的user表中有一个info字段,是JSON类型
格式像这样:
{“age”: 20, “intro”: “佛系青年”, “gender”: “male”}
而目前User实体类中却是String类型:
这样一来,我们要读取info中的属性时就非常不方便。如果要方便获取,info的类型最好是一个Map或者实体类。
而一旦我们把info改为对象类型,就需要在写入数据库时手动转为String,再读取数据库时,手动转换为对象,这会非常麻烦。
因此MybatisPlus提供了很多特殊类型字段的类型处理器,解决特殊字段类型与数据库类型转换的问题。例如处理JSON就可以使用JacksonTypeHandler处理器。
定义实体
首先,我们定义一个单独实体类来与info字段的属性匹配:
代码如下:
package com.onenewcode.mpdemo.domain.po; import lombok.Data; @Data public class UserInfo { private Integer age; private String intro; private String gender; }
使用类型处理器
接下来,将User类的info字段修改为UserInfo类型,并声明类型处理器:
同时,为了让页面返回的结果也以对象格式返回,我们要修改UserVO中的info字段:
仓库地址
https://github.com/onenewcode/mp-demo.git