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

发布时间:2022-08-09 11:30:30 作者:iii
来源:亿速云 阅读:350

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 的逻辑删除和字段自动填充功能。

推荐阅读:
  1. MybatisPlus中的删除和逻辑删除及区别介绍
  2. 使用MybatisPlus 如何实现自动填充功能

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

mybatisplus

上一篇:怎么使用JavaScript实现随机颜色生成器

下一篇:Go Java算法之交错字符串问题怎么解决

相关阅读

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

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