mp核心功能

条件构造器

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() |

相关推荐
阿里云云原生2 分钟前
AI Gateway 分析:OpenRouter vs Higress
微服务·云原生
〃冷·夏ぐ14 分钟前
Java内存模型(JMM)
java·开发语言
bug菌16 分钟前
你以为用Java做个记事本很简单?我...
java·后端·java ee
●VON17 分钟前
重生之我在暑假学习微服务第五天《Docker部署项目篇》
java·学习·docker·微服务·云原生·架构·暑假
Cosolar18 分钟前
深入 Quartz 的内核:它是如何“到点就把任务叫醒”的
java·后端·面试
泉城老铁23 分钟前
Spring Boot 对接支付宝支付的详细流程和步骤
java·后端·架构
noravinsc24 分钟前
django 按照外键排序
数据库·django·sqlite
ALLSectorSorft37 分钟前
相亲小程序聊天与互动系统模块搭建
java·数据库·sql·microsoft·oracle
鼠鼠我捏,要死了捏1 小时前
MySQL 索引设计与查询性能优化实践指南
数据库·mysql·性能优化
HMBBLOVEPDX1 小时前
MySQL的单行函数:
数据库·mysql·函数