条件构造器
mybatisPlus支持各种复杂的where条件, 满足日常的开发

wrapper类就是条件构造器

提供了很多子类



条件构造器的用法:
- QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
- UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
- 尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码
自定义SQL
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分
① 基于Wrapper构建where条件
List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
// 1.构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount);
② 在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
③ 自定义SQL,并使用Wrapper条件
<update id="updateBalanceByIds">
UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
service接口

接口使用流程:
1.自定义 Service 接口继承 IService
-
作用 :让自定义的 Service 接口具备 MP
IService
中封装的通用 CRUD(创建、读取、更新、删除 )等基础方法,无需手动编写简单的增删改查逻辑。 -
代码示例:
// 自定义 IUserService 接口,继承 MP 的 IService,泛型指定操作的实体类 User
public interface IUserService extends IService<User> {
// 可在此扩展自定义业务方法,如复杂查询、业务逻辑组合等
}
2.自定义 Service 实现类,继承 ServiceImpl****并实现自定义接口
-
作用 :
ServiceImpl
类已经实现了IService
接口的通用方法,继承它后,自定义实现类可直接复用这些通用操作;同时实现自定义IUserService
接口,保证接口方法的实现与自定义业务逻辑补充。 -
代码示例:
// UserServiceImpl 实现类,继承 ServiceImpl(需指定对应的 Mapper 接口和实体类),并实现 IUserService
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
// 若 IUserService 有自定义方法,在此实现;也可直接使用父类 ServiceImpl 继承来的通用方法,如 save、update、remove、list 等
}
常见CURD:
新增

|-----------------------------------------|------------------------------------|
| 方法 | 作用 |
| save(T)
| 保存单个实体对象到数据库,返回是否成功(boolean
类型 ) |
| saveBatch(Collection<T>)
| 批量保存实体对象集合,默认批次大小,返回操作结果 |
| saveBatch(Collection<T>, int)
| 带自定义批次大小的批量保存,灵活控制批量操作频次 |
| saveOrUpdateBatch(Collection<T>)
| 批量保存或更新,根据实体主键判断,存在则更新、不存在则新增 |
| saveOrUpdateBatch(Collection<T>, int)
| 自定义批次大小的批量保存或更新 |
| saveOrUpdate(T)
| 单个实体的保存或更新,依据主键判断操作类型 |
| saveOrUpdate(T, Wrapper<T>)
| 结合条件的单个实体保存或更新,条件用于辅助判断等场景 |
修改

|---------------------------------------|---------------------------------------------------------------------------------|
| 方法 | 作用 |
| updateById(T)
| 根据实体对象的主键更新对应记录,更新非 null
字段 |
| update(Wrapper<T>)
| 通过条件构造器 Wrapper
构建更新条件,更新符合条件的记录(需配合 set
操作,一般在 Lambda 语法或自定义 SQL 里设置更新内容 ) |
| update(T, Wrapper<T>)
| 指定实体对象(设置要更新的字段值 )和条件构造器 Wrapper
(设置更新条件 ),更新符合条件的记录 |
| updateBatchById(Collection<T>)
| 批量根据主键更新实体对象集合,每条记录更新非 null
字段 |
| updateBatchById(Collection<T>, int)
| 自定义批次大小的批量主键更新 |
| saveOrUpdate(T)
| 前面新增分类里也有,兼具保存或更新逻辑,依据主键判断 |
查询

|-------------------------------------------------|------------------------------------------------------------------------------------------------------------------|
| 方法 | 作用 |
| getById(Serializable)
| 根据主键 ID 查询单个实体对象 |
| getOne(Wrapper<T>)
| 通过条件构造器 Wrapper
查询单个实体,若结果超过一条会抛异常 |
| getOne(Wrapper<T>, boolean)
| 带是否抛出异常参数,结果多条时,false
则返回第一条 |
| listByIds(Collection<? extends Serializable>)
| 根据主键 ID 集合,查询对应的实体列表 |
| listByMap(Map<String, Object>)
| 根据 Map
中的键值对(对应数据库字段 - 值 )查询实体列表 |
| list(Wrapper<T>)
| 通过条件构造器 Wrapper
构建查询条件,查询符合条件的实体列表 |
| list()
| 查询对应实体类的全表数据列表 |
| page(E, Wrapper<T>)
| 结合分页参数 E
(如 Page
对象 )和条件构造器 Wrapper
,实现分页查询 |
| page(E)
| 仅用分页参数 E
进行全表分页查询 |
| lambdaQuery()
| 获取 Lambda 语法的查询链 LambdaQueryChainWrapper
,方便用 Lambda 表达式写条件,如 service.lambdaQuery().eq(User::getId, 1).list()
|
| lambdaQuery(T)
| 带实体对象的 Lambda 查询链,可基于实体初始值辅助构造条件 |
| lambdaUpdate()
| 获取 Lambda 语法的更新链 LambdaUpdateChainWrapper
,用于便捷构建更新操作 |
删除

|-------------------------------------------------|------------------------------------------|
| 方法 | 作用 |
| removeById(Serializable)
| 根据主键 ID 删除对应的实体记录 |
| removeById(Serializable, boolean)
| 带是否逻辑删除(若开启逻辑删除 )的参数,控制删除行为 |
| removeById(T)
| 通过实体对象(主要用主键 )删除记录 |
| removeByMap(Map<String, Object>)
| 根据 Map
中的键值对(数据库字段 - 值 )作为条件,删除符合条件的记录 |
| remove(Wrapper<T>)
| 用条件构造器 Wrapper
构建删除条件,删除对应记录 |
| removeByIds(Collection<?>)
| 根据主键 ID 集合,批量删除对应记录 |
| removeByIds(Collection<?>, boolean)
| 带逻辑删除控制参数的批量主键删除 |
| removeBatchByIds(Collection<?>)
| 批量删除主键对应记录,内部处理批次等逻辑 |
| removeBatchByIds(Collection<?>, boolean)
| 带逻辑删除控制的批量主键删除 |
| removeBatchByIds(Collection<?>, int)
| 自定义批次大小、带逻辑删除控制的批量主键删除 |
| removeBatchByIds(Collection<?>, int, boolean)
| 更细粒度控制(批次大小、逻辑删除 )的批量主键删除 |
统计

|---------------------|-------------------------------------|
| 方法 | 作用 |
| count()
| 统计对应实体类全表的记录总数 |
| count(Wrapper<T>)
| 根据条件构造器 Wrapper
构建的条件,统计符合条件的记录数量 |
分页查询

|------|-------------------------------------------|--------------------------------------------|----------------------------------------|
| 方法分类 | 方法签名 | 功能说明 | 典型使用场景 |
| 分页查询 | E page(E page, Wrapper<T> queryWrapper)
| 传入分页对象(如 Page
)和 Wrapper
条件,实现带条件的分页查询 | 分页+条件(如年龄>25 岁)查询用户,同时获取总条数、总页数等分页元数据 |
| 分页查询 | E page(E page)
| 仅通过分页对象(Page
)做全表分页,返回分页结果(含数据+分页信息) | 对大数据量表(如系统操作日志)做全表分页展示,按页加载避免一次性查全表 |
列表查询

|------|-------------------------------------------------------------|----------------------------------------------------|----------------------------------------------------------|
| 方法分类 | 方法签名 | 功能说明 | 典型使用场景 |
| 列表查询 | List<T> listByIds(Collection<? extends Serializable> ids)
| 根据主键集合批量查询,传入 ID 集合,返回对应实体列表 | 批量获取指定 ID 的用户信息,如 listByIds(Arrays.asList(1L, 2L, 3L))
|
| 列表查询 | List<T> listByMap(Map<String, Object> map)
| 用 Map
封装简单条件(字段名 - 值)查询,返回实体列表 | 按 {"name": "张三", "age": 20}
查用户,适配无需复杂条件的场景 |
| 列表查询 | List<T> list(Wrapper<T> queryWrapper)
| 结合 Wrapper
(如 LambdaQueryWrapper
)构建复杂条件查询,返回列表 | 多条件组合(如年龄>18 且性别为男)查询,满足复杂业务筛选需求 |
| 列表查询 | List<T> list()
| 查询对应实体类全表数据,返回所有记录 | 加载数据量小的字典表(如状态枚举表)全量内容 |
Lambda 操作

|-----------|----------------------------------------------------|-------------------------------------------|---------------------------------------------------------------------------|
| 方法分类 | 方法签名 | 功能说明 | 典型使用场景 |
| Lambda 操作 | LambdaQueryChainWrapper<T> lambdaQuery()
| 获取 Lambda 查询链,支持链式调用+Lambda 表达式写条件,简化查询构建 | 链式写法:lambdaQuery().eq(User::getId, 1).like(User::getName, "张").list()
|
| Lambda 操作 | LambdaQueryChainWrapper<T> lambdaQuery(T entity)
| 基于传入实体的初始值,结合 Lambda 链补充条件查询 | 已有部分实体数据(如姓名),再叠加年龄条件:lambdaQuery(user).gt(User::getAge, 18).list()
|
| Lambda 操作 | LambdaUpdateChainWrapper<T> lambdaUpdate()
| 获取 Lambda 更新链,用链式+Lambda 表达式定义更新字段和条件 | 链式更新:lambdaUpdate().set(User::getStatus, 1).eq(User::getId, 1).update()
|