温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MyBatisPlus逻辑删除和字段自动填充怎么实现

发布时间:2022-08-09 11:30:30 来源:亿速云 阅读:372 作者:iii 栏目:开发技术

MyBatisPlus逻辑删除和字段自动填充怎么实现

引言

MyBatisPlus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatisPlus 提供了许多强大的功能,其中逻辑删除和字段自动填充是两个非常实用的功能。本文将详细介绍如何在 MyBatisPlus 中实现逻辑删除和字段自动填充,并通过示例代码帮助读者更好地理解和应用这些功能。

1. MyBatisPlus 简介

MyBatisPlus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上进行了扩展,提供了许多便捷的功能,如通用 CRUD 操作、分页插件、性能分析插件、全局拦截器等。MyBatisPlus 的目标是简化开发,提高开发效率。

2. 逻辑删除

2.1 什么是逻辑删除

逻辑删除是指在数据库中并不真正删除数据,而是通过一个标志位来标记数据是否被删除。通常,这个标志位是一个布尔类型的字段,例如 deleted,当 deletedtrue 时表示数据已被删除,为 false 时表示数据未被删除。

逻辑删除的好处是可以保留数据的历史记录,方便后续的数据恢复和审计。

2.2 在 MyBatisPlus 中实现逻辑删除

MyBatisPlus 提供了对逻辑删除的支持,可以通过简单的配置实现逻辑删除功能。

2.2.1 配置逻辑删除字段

首先,在实体类中定义一个逻辑删除字段,并使用 @TableLogic 注解标记该字段为逻辑删除字段。

import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("user") public class User { private Long id; private String name; private Integer age; private String email; @TableLogic private Integer deleted; } 

在上面的代码中,deleted 字段被标记为逻辑删除字段。@TableLogic 注解表示该字段用于逻辑删除。

2.2.2 配置逻辑删除值

接下来,需要在 MyBatisPlus 的配置文件中配置逻辑删除的值。通常,deleted 字段的值为 0 表示未删除,1 表示已删除。

mybatis-plus: global-config: db-config: logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值 

在上面的配置中,logic-delete-value 表示逻辑已删除的值,logic-not-delete-value 表示逻辑未删除的值。

2.2.3 使用逻辑删除

配置完成后,MyBatisPlus 会自动处理逻辑删除。当执行删除操作时,MyBatisPlus 会将 deleted 字段的值更新为 1,而不是真正删除数据。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testLogicDelete() { userMapper.deleteById(1L); } } 

在上面的代码中,userMapper.deleteById(1L) 会执行逻辑删除操作,将 id1 的用户的 deleted 字段更新为 1

2.2.4 查询时排除已删除数据

在执行查询操作时,MyBatisPlus 会自动排除 deleted 字段为 1 的数据。

@Test public void testSelect() { List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); } 

在上面的代码中,userMapper.selectList(null) 会查询所有 deleted 字段为 0 的用户数据。

2.3 逻辑删除的注意事项

  1. 数据库表设计:在数据库表设计中,需要为逻辑删除字段设置默认值,通常为 0(未删除)。
  2. 查询条件:在使用 MyBatisPlus 进行查询时,默认会排除已删除的数据。如果需要查询所有数据(包括已删除的数据),可以使用 @TableField(select = false) 注解来排除逻辑删除字段的自动过滤。
  3. 物理删除:如果需要真正删除数据,可以使用 deleteByIddeleteBatchIds 方法,并手动设置 deleted 字段为 1

3. 字段自动填充

3.1 什么是字段自动填充

字段自动填充是指在插入或更新数据时,自动为某些字段赋值。例如,在插入数据时自动填充创建时间,在更新数据时自动填充更新时间。

字段自动填充可以简化开发,避免手动为这些字段赋值。

3.2 在 MyBatisPlus 中实现字段自动填充

MyBatisPlus 提供了对字段自动填充的支持,可以通过实现 MetaObjectHandler 接口来实现字段自动填充。

3.2.1 定义自动填充字段

首先,在实体类中定义需要自动填充的字段,并使用 @TableField 注解标记这些字段为自动填充字段。

import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date; @Data @TableName("user") public class User { private Long id; private String name; private Integer age; private String email; @TableLogic private Integer deleted; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; } 

在上面的代码中,createTime 字段在插入数据时自动填充,updateTime 字段在插入和更新数据时自动填充。

3.2.2 实现 MetaObjectHandler 接口

接下来,需要实现 MetaObjectHandler 接口,并在 insertFillupdateFill 方法中为自动填充字段赋值。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } } 

在上面的代码中,insertFill 方法在插入数据时自动填充 createTimeupdateTime 字段,updateFill 方法在更新数据时自动填充 updateTime 字段。

3.2.3 使用字段自动填充

配置完成后,MyBatisPlus 会自动处理字段自动填充。当执行插入或更新操作时,MyBatisPlus 会自动为 createTimeupdateTime 字段赋值。

@Test public void testInsert() { User user = new User(); user.setName("Tom"); user.setAge(20); user.setEmail("tom@example.com"); userMapper.insert(user); } @Test public void testUpdate() { User user = userMapper.selectById(1L); user.setName("Jerry"); userMapper.updateById(user); } 

在上面的代码中,userMapper.insert(user) 会插入一条用户数据,并自动填充 createTimeupdateTime 字段。userMapper.updateById(user) 会更新用户数据,并自动填充 updateTime 字段。

3.3 字段自动填充的注意事项

  1. 字段类型:自动填充字段的类型必须与 MetaObjectHandler 中定义的类型一致。
  2. 字段名称:自动填充字段的名称必须与 MetaObjectHandler 中定义的字段名称一致。
  3. 默认值:如果自动填充字段在数据库中有默认值,可以在 MetaObjectHandler 中不进行填充,或者在插入数据时手动设置默认值。

4. 综合示例

下面通过一个完整的示例来演示如何在 MyBatisPlus 中实现逻辑删除和字段自动填充。

4.1 数据库表设计

首先,设计一个 user 表,包含 idnameageemaildeletedcreate_timeupdate_time 字段。

CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, email VARCHAR(100), deleted INT DEFAULT 0, create_time DATETIME, update_time DATETIME ); 

4.2 实体类定义

接下来,定义 User 实体类,并使用 @TableLogic@TableField 注解标记逻辑删除字段和自动填充字段。

import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.util.Date; @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableLogic private Integer deleted; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; } 

4.3 实现 MetaObjectHandler 接口

然后,实现 MetaObjectHandler 接口,并在 insertFillupdateFill 方法中为自动填充字段赋值。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } } 

4.4 配置逻辑删除值

application.yml 中配置逻辑删除的值。

mybatis-plus: global-config: db-config: logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值 

4.5 测试逻辑删除和字段自动填充

最后,编写测试代码来测试逻辑删除和字段自动填充功能。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testInsert() { User user = new User(); user.setName("Tom"); user.setAge(20); user.setEmail("tom@example.com"); userMapper.insert(user); } @Test public void testUpdate() { User user = userMapper.selectById(1L); user.setName("Jerry"); userMapper.updateById(user); } @Test public void testLogicDelete() { userMapper.deleteById(1L); } @Test public void testSelect() { List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); } } 

在上面的测试代码中,testInsert 方法测试插入数据并自动填充 createTimeupdateTime 字段,testUpdate 方法测试更新数据并自动填充 updateTime 字段,testLogicDelete 方法测试逻辑删除功能,testSelect 方法测试查询功能并排除已删除的数据。

5. 总结

本文详细介绍了如何在 MyBatisPlus 中实现逻辑删除和字段自动填充功能。通过逻辑删除,可以在不真正删除数据的情况下标记数据为已删除状态,从而保留数据的历史记录。通过字段自动填充,可以在插入或更新数据时自动为某些字段赋值,从而简化开发。

MyBatisPlus 提供了强大的功能支持,使得开发者可以更加高效地进行数据库操作。希望本文的内容能够帮助读者更好地理解和应用 MyBatisPlus 的逻辑删除和字段自动填充功能。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI