mybatis-plus实现逻辑删除之后怎么实现物理删除

 一.逻辑删除

        一般在生产环境中都是采用逻辑删除,不会去物理删除数据,实现方式在我上一篇文章有说明。链接:mybatis-plus如何逻辑删除以及逻辑删除时如何实现填充公共字段-CSDN博客

二.物理删除

        许多朋友说那我就想直接物理删除怎么办,这时候我们可以采用不调框架的方法,直接去手动写sql去实现。

        其实我们还有另一种方式就是自定义一个方法实现物理删除。写一个公共的MyBaseMapper去继承BaseMapper,然后定义一个deleteAbsoluteById()方法。后面各个业务的mapper可以通过继承MyBaseMapper来使用。

public interface MyBaseMapper<T> extends BaseMapper<T> {

    /**
     * 物理删除
     *
     * @param id
     * @return
     */
    int deleteAbsoluteById(Serializable id);

}

       光定义一个方法还不行,还要实现逻辑,我们需要建一个类去继承AbstractMethod,在这个类中实现相关逻辑。

public class DeleteAbsoluteById extends AbstractMethod {

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String method = "deleteAbsoluteById";
        SqlMethod sqlMethod = SqlMethod.DELETE_BY_ID;
        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(), tableInfo.getKeyProperty());
        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, Object.class);
        return this.addDeleteMappedStatement(mapperClass, method, sqlSource);
    }

}

        再自定义一个sql注入器继承DefaultSqlInjector,把deleteAbsoluteById()方法加入进去就大功告成。

public class CustomSqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        methodList.add(new DeleteAbsoluteById());
        return methodList;
    }

}

三.批量物理删除

        批量物理删除同理,直接上代码。


public interface MyBaseMapper<T> extends BaseMapper<T> {

    /**
     * 物理删除
     *
     * @param id
     * @return
     */
    int deleteAbsoluteById(Serializable id);

    /**
     * 批量物理删除
     *
     * @param idList
     * @return
     */
    int deleteAbsoluteByIds(@Param(Constants.COLL) Collection<?> idList);

}
public class DeleteAbsoluteByIds extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String method = "deleteAbsoluteByIds";
        SqlMethod sqlMethod = SqlMethod.DELETE_BATCH_BY_IDS;
        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(), SqlScriptUtils.convertForeach(SqlScriptUtils.convertChoose("@org.apache.ibatis.type.SimpleTypeRegistry@isSimpleType(item.getClass())", "#{item}", "#{item." + tableInfo.getKeyProperty() + "}"), "coll", (String) null, "item", ","));
        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, Object.class);
        return this.addDeleteMappedStatement(mapperClass, method, sqlSource);
    }
}
public class CustomSqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        methodList.add(new DeleteAbsoluteById());
        methodList.add(new DeleteAbsoluteByIds());
        return methodList;
    }

}

        到此为止我们就实现了物理删除和批量物理删除。

四.总结

        如有错误之处,欢迎指正。如有疑问,欢迎讨论。

在使用MyBatis-Plus进行删除操作时,可以使用逻辑删除物理删除。如果要使用逻辑删除,可以按照以下步骤进行操作: 1. 配置逻辑删除的值:在配置文件中,可以通过设置`mybatis-plus.global-config.db-config.logic-delete-value`和`mybatis-plus.global-config.db-config.logic-not-delete-value`来指定逻辑删除的值。通常情况下,`logic-delete-value`设置为1表示已删除,`logic-not-delete-value`设置为0表示未删除。\[1\] 2. 在实体类中添加逻辑删除字段:在需要进行逻辑删除的实体类中,添加一个与数据库中的逻辑删除字段对应的属性,并使用`@TableLogic`注解标注该字段。这样,MyBatis-Plus在进行删除操作时会自动更新该字段的值。\[2\] 3. 执行删除操作:使用MyBatis-Plus提供的`delete`方法进行删除操作。在删除的条件中,可以使用`eq`方法指定要删除的记录的条件。例如,`lambdaQuery().eq(Entity::getId, id)`表示删除id等于指定值的记录。\[2\] 需要注意的是,逻辑删除只是将数据的状态标记为已删除,并不会真正从数据库中删除数据。如果需要进行物理删除,可以使用MyBatis-Plus提供的`remove`方法。\[3\] 综上所述,使用MyBatis-Plus进行逻辑删除的操作步骤包括配置逻辑删除的值、在实体类中添加逻辑删除字段,并使用`@TableLogic`注解标注该字段,然后使用`delete`方法进行删除操作。 #### 引用[.reference_title] - *1* *2* *3* [MyBatis-Plus——MyBatis-Plus概述与集成](https://blog.csdn.net/wpc2018/article/details/122089727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值