MyBatisPlus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatisPlus 提供了许多强大的功能,其中逻辑删除和字段自动填充是两个非常实用的功能。本文将详细介绍如何在 MyBatisPlus 中实现逻辑删除和字段自动填充,并通过示例代码帮助读者更好地理解和应用这些功能。
MyBatisPlus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上进行了扩展,提供了许多便捷的功能,如通用 CRUD 操作、分页插件、性能分析插件、全局拦截器等。MyBatisPlus 的目标是简化开发,提高开发效率。
逻辑删除是指在数据库中并不真正删除数据,而是通过一个标志位来标记数据是否被删除。通常,这个标志位是一个布尔类型的字段,例如 deleted
,当 deleted
为 true
时表示数据已被删除,为 false
时表示数据未被删除。
逻辑删除的好处是可以保留数据的历史记录,方便后续的数据恢复和审计。
MyBatisPlus 提供了对逻辑删除的支持,可以通过简单的配置实现逻辑删除功能。
首先,在实体类中定义一个逻辑删除字段,并使用 @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
注解表示该字段用于逻辑删除。
接下来,需要在 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
表示逻辑未删除的值。
配置完成后,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)
会执行逻辑删除操作,将 id
为 1
的用户的 deleted
字段更新为 1
。
在执行查询操作时,MyBatisPlus 会自动排除 deleted
字段为 1
的数据。
@Test public void testSelect() { List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); }
在上面的代码中,userMapper.selectList(null)
会查询所有 deleted
字段为 0
的用户数据。
0
(未删除)。@TableField(select = false)
注解来排除逻辑删除字段的自动过滤。deleteById
或 deleteBatchIds
方法,并手动设置 deleted
字段为 1
。字段自动填充是指在插入或更新数据时,自动为某些字段赋值。例如,在插入数据时自动填充创建时间,在更新数据时自动填充更新时间。
字段自动填充可以简化开发,避免手动为这些字段赋值。
MyBatisPlus 提供了对字段自动填充的支持,可以通过实现 MetaObjectHandler
接口来实现字段自动填充。
首先,在实体类中定义需要自动填充的字段,并使用 @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
字段在插入和更新数据时自动填充。
接下来,需要实现 MetaObjectHandler
接口,并在 insertFill
和 updateFill
方法中为自动填充字段赋值。
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
方法在插入数据时自动填充 createTime
和 updateTime
字段,updateFill
方法在更新数据时自动填充 updateTime
字段。
配置完成后,MyBatisPlus 会自动处理字段自动填充。当执行插入或更新操作时,MyBatisPlus 会自动为 createTime
和 updateTime
字段赋值。
@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)
会插入一条用户数据,并自动填充 createTime
和 updateTime
字段。userMapper.updateById(user)
会更新用户数据,并自动填充 updateTime
字段。
MetaObjectHandler
中定义的类型一致。MetaObjectHandler
中定义的字段名称一致。MetaObjectHandler
中不进行填充,或者在插入数据时手动设置默认值。下面通过一个完整的示例来演示如何在 MyBatisPlus 中实现逻辑删除和字段自动填充。
首先,设计一个 user
表,包含 id
、name
、age
、email
、deleted
、create_time
和 update_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 );
接下来,定义 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; }
然后,实现 MetaObjectHandler
接口,并在 insertFill
和 updateFill
方法中为自动填充字段赋值。
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()); } }
在 application.yml
中配置逻辑删除的值。
mybatis-plus: global-config: db-config: logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值
最后,编写测试代码来测试逻辑删除和字段自动填充功能。
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
方法测试插入数据并自动填充 createTime
和 updateTime
字段,testUpdate
方法测试更新数据并自动填充 updateTime
字段,testLogicDelete
方法测试逻辑删除功能,testSelect
方法测试查询功能并排除已删除的数据。
本文详细介绍了如何在 MyBatisPlus 中实现逻辑删除和字段自动填充功能。通过逻辑删除,可以在不真正删除数据的情况下标记数据为已删除状态,从而保留数据的历史记录。通过字段自动填充,可以在插入或更新数据时自动为某些字段赋值,从而简化开发。
MyBatisPlus 提供了强大的功能支持,使得开发者可以更加高效地进行数据库操作。希望本文的内容能够帮助读者更好地理解和应用 MyBatisPlus 的逻辑删除和字段自动填充功能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。