您好,登录后才能下订单哦!
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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。