mybatis-plus 基于 Mapper接口的 delete

基于BaseMapper的crud

  • 通用 CRUD 封装 BaseMapper接口,
  • Mybatis-Plus 启动时,自动解析实体表关系映射转换为 Mybatis 内部对象注入容器,内部包含常见的单表操作

delete

java 复制代码
"根据 entity 条件,删除记录"
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

"根据 ID 删除"
int deleteById(Serializable id);

"删除(根据ID 批量删除)"
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

"根据 columnMap 条件,删除记录"
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
类型 参数名 描述
Wrapper wrapper 实体对象封装操作类(可以为 null)
Collection<? extends Serializable> idList 主键 ID 列表(不能为 null 以及 empty)
Serializable id 主键 ID
Map<String, Object> columnMap 表字段 map 对象
啥是 Serializable (序列化)
数据类型 是否可序列化 说明
基本类型/包装类 ✅ 是 int, Integer
String ✅ 是 默认实现Serializable
集合类 ✅ 是 ArrayList, HashMap
自定义类 ✅ 是(需实现接口) 显式或间接实现Serializable
枚举类型 ✅ 是 默认支持
未实现接口的类 ❌ 否 抛出NotSerializableException
包含不可序列化字段 ❌ 否(需处理) 需用transient或自定义序列化
静态字段 ❌ 否 不参与序列化



总结

  1. 按条件删除 :优先用 delete(Wrapper),支持复杂条件(>、<、like、AND/OR 等),Lambda 写法可避免列名硬编码错误;
  2. 单ID删除 :用 deleteById,最简单高效,适用于删除单条记录;
  3. 批量ID删除 :用 deleteBatchIds,注意传入的 ID 集合不能为空,否则会触发全表删除风险;
  4. 简单等值删除 :用 deleteByMap,仅支持 = 条件,适合少量、简单的等值删除场景。

注意:所有删除方法返回值都是「受影响的行数」,可通过该值判断删除是否成功;实际业务中建议先查询再删除,或开启事务,避免误删数据。


delete 举例详解

前置准备

假设我们有如下基础环境:

  1. 实体类 User(对应数据库表 user):
java 复制代码
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user") // 数据库表名
public class User {
    @TableId(type = IdType.AUTO) // 自增ID
    private Long id; // 用户ID
    private String username; // 用户名
    private Integer age; // 年龄
    private String email; // 邮箱
}
  1. Mapper 接口 UserMapper(继承 BaseMapper 获得内置删除方法):
java 复制代码
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    "无需手动编写删除方法,BaseMapper 已提供"
}
  1. 注入 UserMapper(Spring Boot 环境):
java 复制代码
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    "以下示例方法都写在这个类中"
}

各删除方法示例

1. delete(Wrapper wrapper):按条件删除(支持复杂条件)

适用场景:需要按多条件(如大于、小于、模糊匹配等)删除记录。

java 复制代码
"删除年龄大于30且用户名包含"test"的用户"

public int deleteByWrapper() {
    // 1. 构建条件封装器(推荐用 LambdaQueryWrapper,避免硬编码列名)
    QueryWrapper<User> wrapper = new QueryWrapper<User>()
            .gt("age", 30) // age > 30
            .like("username", "test"); // username 包含 "test"
    
    // 2. 调用删除方法,返回受影响的行数
    int affectedRows = userMapper.delete(wrapper);
    System.out.println("删除了 " + affectedRows + " 条记录");
    return affectedRows;
}



" 更优雅的 Lambda 写法(避免列名写错) "
public int deleteByLambdaWrapper() {
    QueryWrapper<User> lambdaWrapper = new QueryWrapper<User>()
            .lambda()
            .gt(User::getAge, 30)
            .like(User::getUsername, "test");
    
    return userMapper.delete(lambdaWrapper);
}
2. deleteById(Serializable id):按单个ID删除

适用场景:已知唯一ID,删除单条记录(最常用)。

java 复制代码
"删除ID为1的用户"

public int deleteById() {
    Long userId = 1L; // 要删除的用户ID
    int affectedRows = userMapper.deleteById(userId);
    System.out.println("删除了 " + affectedRows + " 条记录");
    return affectedRows;
}
3. deleteBatchIds(Collection<? extends Serializable> idList):批量按ID删除

适用场景:一次性删除多条已知ID的记录(如批量删除选中的用户)。

java 复制代码
"批量删除ID为1、2、3的用户"

public int deleteBatchIds() {
    // 构建ID集合(注意:集合不能为空,否则会报错)
    Collection<Long> idList = Arrays.asList(1L, 2L, 3L);
    int affectedRows = userMapper.deleteBatchIds(idList);
    System.out.println("批量删除了 " + affectedRows + " 条记录");
    return affectedRows;
}
4. deleteByMap(Map<String, Object> columnMap):按列名-值映射删除

适用场景:按简单的等值条件删除(仅支持 = 条件,不支持 >、<、like 等)。

java 复制代码
"删除用户名为"zhangsan"且年龄为20的用户"

public int deleteByMap() {
    // 1. 构建列名-值映射(key 是数据库列名/实体属性名,value 是要匹配的值)
    Map<String, Object> columnMap = new HashMap<>();
    columnMap.put("username", "zhangsan"); // 等值匹配 username = 'zhangsan'
    columnMap.put("age", 20); // 等值匹配 age = 20
    
    // 2. 调用删除方法(多个条件是 AND 关系)
    int affectedRows = userMapper.deleteByMap(columnMap);
    System.out.println("删除了 " + affectedRows + " 条记录");
    return affectedRows;
}
相关推荐
oak隔壁找我1 天前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪1 天前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷1 天前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了1 天前
Java 自动化部署
java·后端
ma_king1 天前
入门 java 和 数据库
java·数据库·后端
后端AI实验室1 天前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞1 天前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing1 天前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven972 天前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德2 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty