Mybatis Plus应用(二)逻辑删除的实践
MyBatisPlusadmin 发布于:2022-07-02 22:23:15
阅读:loading
逻辑删除在某些应用场景还是有些作用的,本站在实现时对于某些功能的数据也使用了逻辑删除,本篇文章则讲述一下MyBatis Plus的逻辑删除是如何应用的,具体如下。
曾经逻辑删除在使用实现时有块逻辑也一直没用弄清楚,即新增数据时未设置逻辑删除的字段,它的数据是如何存储的呢,网上百科知识无果,最终将其官方提供的项目示例源代码拉取下来后,拆解功能实现,最终发现是在数据库见表时的字段上设置了默认值为标识逻辑删除的值,实际上已经内置或者定制了逻辑删除的未删除参数值,为何不在insert数据时拿到此数据和逻辑删除的字段进行字段数据的存储呢,反而要额外的通过数据库字段的默认值来实现;或者是在定义表的实体对象时直接给出逻辑删除未删除的初始化参数值,未知当前新版本是否有此改进。特别说明,本站开始编码时已是两年前了,届时的最新版本为3.3.1。
逻辑删除默认使用的标识是0与1,0表示未删除,1表示已删除,啊这玩意真是扯淡了,0和1的对应的true和false的意义又多了一层记忆成本,实际上0和1分别对应的true和false在行业内有成型且通用的规范吗,本身JavaScript、Linux、MySQL等等它们里面的也区分0和1对应的标识,不可被定制修改,所以只能理解性的记忆,而对于这种个人或者团队定制的逻辑标识还是少来增加记忆成本为好,不过幸好它提供了两个参数来定制未删除和已删除的标识,本站使用标记逻辑删除的数据库字段为“dataStatus”,对于未删除和已删除的标识分别为USABLE、DISABLE,标识清晰,无需特别记忆,认识单词即可,逻辑删除的参数配置为mybatis-plus.global-config.db-config下的logic-delete-value和logic-not-delete-value(具体的逻辑参数参数可见前面一篇文章介绍),参考实现如下。
Table命名为Sys_User系统用户表,涵盖了常用的数字类型、字符串类型、枚举类型、日期类型和逻辑删除字段,特别注意逻辑删除额外标记了@TableLogic注解,参考代码如下所示:
package cn.chendd.mybatisplus.user.model;
import ...;
/**
* 用户信息实体对象
*
* @author chendd
* @date 2022/6/30 21:30
*/
@Data
@TableName("sys_user")
public class User {
/**
* 用户id
*/
@TableId(value = "userId" , type = IdType.ASSIGN_ID)
@TableField("userId")
private Long userId;
/**
* 用户名称
*/
@TableField("userName")
private String userName;
/**
* 性别
*/
@TableField("sex")
private SexEnum sex;
/**
* 出生日期
*/
@TableField("birthday")
private Date birthday;
/**
* 数据状态,可用或禁用
*/
@TableField("dataStatus")
@TableLogic
@JsonIgnore
private String dataStatus;
}
CREATE TABLE `sys_user` (
`userId` bigint(20) NOT NULL COMMENT '用户ID',
`userName` varchar(32) DEFAULT NULL COMMENT '用户姓名',
`sex` varchar(8) DEFAULT NULL COMMENT '性别',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
`dataStatus` varchar(16) DEFAULT 'USABLE' COMMENT '数据是否有效状态',
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
本次测试案例提供了新增、修改、删除、基本列表查询和定制列表查询实现的几种常规的单表操作的测试案例。
package cn.chendd.mybatisplus;
import ...;
/**
* 用户数据测试类
*
* @author chendd
* @date 2022/6/30 21:49
*/
public class UserTest extends BaseBootstrapTest {
@Resource
private UserService userService;
private static Long id;
@Before
public void before() {
if (id == null) {
id = IdWorker.getId();
}
}
@Test
public void insert() {
User user = new User();
//新增时可不指定,有内置的和默认的多种id主键策略
user.setUserId(id);
user.setUserName("chendd");
user.setSex(SexEnum.Boy);
user.setBirthday(new Date());
//新增时无需考虑逻辑删除字段,通过表的默认值填充
this.userService.save(user);
}
@Test
public void update() {
User user = new User();
user.setUserId(id);
user.setUserName("陈冬冬");
user.setSex(SexEnum.Boy);
user.setBirthday(new Date());
//新增时无需考虑逻辑删除字段,通过表的默认值填充
this.userService.saveOrUpdate(user);
}
@Test
public void delete() {
this.userService.removeById(id);
}
@Test
public void selectList() {
this.userService.list();
}
@Test
public void selectWrapper() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("userId" , "userName").orderByAsc("userId");
this.userService.list(wrapper);
}
}
(insert插入数据,并无逻辑删除字段)
(update修改数据,已增加逻辑删除字段)
(delete删除数据,已被替换为update语句)
(普通查询,已增加逻辑删除字段)
(Wrapper查询,限定查询字段和排序)
点赞