mybatis-plus逻辑删除恢复
时间: 2023-04-28 11:04:40 浏览: 727
Mybatis-Plus提供了逻辑删除的功能,可以通过在实体类中添加一个标记字段(一般为deleted),来标记该记录是否被删除。当执行删除操作时,实际上是将该标记字段的值修改为已删除的状态,而不是真正的删除该记录。
如果需要恢复被逻辑删除的记录,只需要将该记录的标记字段的值修改为未删除的状态即可。可以通过Mybatis-Plus提供的update方法来实现。
例如,假设我们有一个User实体类,其中包含一个deleted字段,表示该用户是否被删除。我们可以通过以下代码来实现逻辑删除和恢复操作:
// 逻辑删除
userMapper.updateById(new User().setId(userId).setDeleted(true));
// 恢复被删除的记录
userMapper.updateById(new User().setId(userId).setDeleted(false));
需要注意的是,如果使用了逻辑删除功能,查询数据时需要加上查询条件,过滤掉已经被删除的记录。可以通过Mybatis-Plus提供的wrapper来实现:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("deleted", false);
List<User> userList = userMapper.selectList(wrapper);
相关问题
mybatis-plus逻辑删除字段可以用字符串类型吗,可以的话怎么实现
MyBatis-Plus 是 MyBatis 的一个增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 支持逻辑删除功能,这意味着可以通过配置来实现记录的逻辑删除,而不是真正的物理删除。
逻辑删除通常是通过在数据表中添加一个字段(如 `deleted`)来实现的,该字段标记记录是否被逻辑删除。MyBatis-Plus 允许这个字段是任何可比较的类型,包括整型、字符串类型等。对于字符串类型的逻辑删除字段,通常会使用两个固定的值来表示逻辑删除的状态,比如`"Y"`表示已删除,`"N"`表示未删除。
要实现字符串类型的逻辑删除,你需要在 MyBatis-Plus 的配置中指定逻辑删除的字段名以及删除值和未删除值。这可以通过以下步骤实现:
1. 在你的实体类中,使用 `@TableLogic` 注解来标记逻辑删除字段,并且设置对应的逻辑删除值和恢复值。
```java
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
public class YourEntity {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "deleted")
@TableLogic(value = "N", delval = "Y")
private String deleted;
// 其他字段和getter/setter方法
}
```
在上面的代码中,`deleted` 字段被标记为逻辑删除字段,`"N"` 代表未删除,`"Y"` 代表已删除。
2. 在 MyBatis-Plus 的全局配置文件(如 `application.yml`)中配置逻辑删除插件。
```yaml
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 逻辑删除字段名
logic-delete-value: Y # 逻辑删除值
logic-not-delete-value: N # 未删除值
```
通过上述配置,MyBatis-Plus 在进行增删改查操作时会自动处理逻辑删除字段。当执行删除操作时,它不会真正从数据库中删除记录,而是将 `deleted` 字段的值更新为 `"Y"`。查询操作时,则会自动忽略那些标记为已删除的记录。
MyBatis-Plus 需要物理删除
MyBatis-Plus是一个基于MyBatis的简化持久层开发工具,它提供了更多的便利性和扩展性。当涉及到数据删除操作时,通常默认的行为是在数据库层面软删除,也就是通过添加一个is_delete字段(如 deleted_at)来标记某个记录是否已被删除,而不是直接从表中移除。
如果你想实现物理删除,即真正的从数据库表中删除数据,MyBatis-Plus并没有直接提供这样的功能,因为这并不符合它的设计原则,即尽可能地避免操作底层数据库。但是,你可以通过自定义SQL或者手动编写JPA或者Hibernate等 ORM框架的方式来实现物理删除:
1. **自定义方法**:在Mapper接口中添加一个方法,比如`deleteByIdWith physicDelete`,并配置具体的 SQL 删除语句。
```java
@Mapper
public interface UserMapper {
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteById(int id);
// 物理删除
@Delete("DELETE FROM user WHERE id = #{id} AND is_delete = 0")
int deleteUserByIdWithPhysicDelete(int id);
}
```
2. **启用全局配置**:如果所有实体都需要物理删除,可以在全局配置文件中设置删除策略。
3. **手动代码控制**:在业务逻辑中,判断需要物理删除再进行调用相应的方法。
需要注意的是,物理删除可能导致一些潜在问题,例如事务回滚后的恢复困难、数据审计跟踪复杂等。所以在实际项目中,除非有特殊需求,否则推荐继续使用默认的软删除方式。
阅读全文
相关推荐
















