@TableLogic注解(推荐)

@TableLogic注解表示逻辑删除

效果

在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法会变成修改

场景

1.实体类中属性加上@TableLogic,

    @TableLogic
    private Integer dataStatus;

2.调用BaseMapper的deleteById(id)或者调用IService的removeById(id)

效果:
没有@TableLogic注解调用deleteById/removeById,直接删除数据。

SQL: delete from table where id = 1

有注解走Update方法

SQL:Update table set isDelete = 1 where id = 1
/*
@TableLogic注解参数
  value = "" 未删除的值,默认值为0
  delval = "" 删除后的值,默认值为1
*/
@TableLogic(value="原值",delval="改值")

扩展

当使用了@TableLogic注解,调用update方法是并不会将该字段放入修改字段中,而是在条件字段中。即使你给dataStatus赋值也不会修改。

SQL: Update table set 字段1 = 值1,字段2 = 值2 where id = 1 and data_status = 0

相关源码

/**
 * SQL 逻辑删除注入器
 *
 * @author hubin
 * @since 2018-06-12
 * @deprecated {@link DefaultSqlInjector} 里面已集成逻辑删除功能,entity 内字段注解 {@link TableLogic} 即可开启
 */
@Deprecated
public class LogicSqlInjector extends DefaultSqlInjector {
}

全局配置(不推荐,仅科普)

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDeleted # 全局逻辑删除的实体字段名
      logic-delete-value: 1         # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0     # 逻辑未删除值(默认为 0)

特殊场景

对于 MyBatis-Plus 中配置了逻辑删除的表,默认情况下会执行逻辑删除操作,将 @TableLogic 标记的字段更新为特定的逻辑删除值(例如将 is_deleted 更新为 1)。如果想要实现物理删除而不是逻辑删除,可以使用以下两种方法:

方法一

使用 deleteByIddeleteBatchIds 方法并结合 @SQL 注解来编写原生 SQL 语句进行物理删除。

@Mapper
public interface DemoMapper extends BaseMapper<Demo> {

    @SQL("DELETE FROM demo WHERE id = #{id}")
    void deletePhysicallyById(Long id);

    @SQL("DELETE FROM demo WHERE id IN (:ids)")
    void deletePhysicallyBatchIds(@Param("ids") List<Long> ids);
}

方法二

通过继承 BaseMapper 并自定义方法来实现物理删除。

@Mapper
public interface DemoMapper extends BaseMapper<Demo> {

    void deletePhysicallyById(Serializable id);

    void deletePhysicallyBatchIds(Collection<? extends Serializable> ids);
}

然后,在 XML 映射文件中编写对应的 SQL 语句。

<mapper namespace="com.example.DemoMapper">
    <delete id="deletePhysicallyById">
        DELETE FROM demo WHERE id = #{id}
    </delete>

    <delete id="deletePhysicallyBatchIds">
        DELETE FROM demo WHERE id IN
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
</mapper>

通过上述方法,可以使用原生 SQL 语句或自定义方法来执行物理删除操作,绕过 MyBatis-Plus 配置的逻辑删除功能。请注意,在进行物理删除之前,请确保已经仔细考虑了数据安全性和完整性的问题,并确认真正需要进行物理删除操作。

文档更新时间: 2023-10-10 09:43   作者:伍润源