基于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或自定义序列化 |
| 静态字段 | ❌ 否 | 不参与序列化 |
总结
- 按条件删除 :优先用
delete(Wrapper),支持复杂条件(>、<、like、AND/OR 等),Lambda 写法可避免列名硬编码错误; - 单ID删除 :用
deleteById,最简单高效,适用于删除单条记录; - 批量ID删除 :用
deleteBatchIds,注意传入的 ID 集合不能为空,否则会触发全表删除风险; - 简单等值删除 :用
deleteByMap,仅支持 = 条件,适合少量、简单的等值删除场景。
注意:所有删除方法返回值都是「受影响的行数」,可通过该值判断删除是否成功;实际业务中建议先查询再删除,或开启事务,避免误删数据。
delete 举例详解
前置准备
假设我们有如下基础环境:
- 实体类
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; // 邮箱
}
- 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 已提供"
}
- 注入 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;
}