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;
}
相关推荐
青云计划11 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿11 小时前
Jsoniter(java版本)使用介绍
java·开发语言
探路者继续奋斗12 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-194313 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
A懿轩A13 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
乐观勇敢坚强的老彭14 小时前
c++寒假营day03
java·开发语言·c++
biubiubiu070614 小时前
谷歌浏览器无法访问localhost:8080
java
大黄说说14 小时前
新手选语言不再纠结:Java、Python、Go、JavaScript 四大热门语言全景对比与学习路线建议
java·python·golang
烟沙九洲14 小时前
Java 中的 封装、继承、多态
java
识君啊14 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端