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:
新增
方法 | 作用 |
| 保存单个实体对象到数据库,返回是否成功( |
| 批量保存实体对象集合,默认批次大小,返回操作结果 |
| 带自定义批次大小的批量保存,灵活控制批量操作频次 |
| 批量保存或更新,根据实体主键判断,存在则更新、不存在则新增 |
| 自定义批次大小的批量保存或更新 |
| 单个实体的保存或更新,依据主键判断操作类型 |
| 结合条件的单个实体保存或更新,条件用于辅助判断等场景 |
修改
方法 | 作用 |
| 根据实体对象的主键更新对应记录,更新非 |
| 通过条件构造器 |
| 指定实体对象(设置要更新的字段值 )和条件构造器 |
| 批量根据主键更新实体对象集合,每条记录更新非 |
| 自定义批次大小的批量主键更新 |
| 前面新增分类里也有,兼具保存或更新逻辑,依据主键判断 |
查询
方法 | 作用 |
| 根据主键 ID 查询单个实体对象 |
| 通过条件构造器 |
| 带是否抛出异常参数,结果多条时, |
| 根据主键 ID 集合,查询对应的实体列表 |
| 根据 |
| 通过条件构造器 |
| 查询对应实体类的全表数据列表 |
| 结合分页参数 |
| 仅用分页参数 |
| 获取 Lambda 语法的查询链 |
| 带实体对象的 Lambda 查询链,可基于实体初始值辅助构造条件 |
| 获取 Lambda 语法的更新链 |
删除
方法 | 作用 |
| 根据主键 ID 删除对应的实体记录 |
| 带是否逻辑删除(若开启逻辑删除 )的参数,控制删除行为 |
| 通过实体对象(主要用主键 )删除记录 |
| 根据 |
| 用条件构造器 |
| 根据主键 ID 集合,批量删除对应记录 |
| 带逻辑删除控制参数的批量主键删除 |
| 批量删除主键对应记录,内部处理批次等逻辑 |
| 带逻辑删除控制的批量主键删除 |
| 自定义批次大小、带逻辑删除控制的批量主键删除 |
| 更细粒度控制(批次大小、逻辑删除 )的批量主键删除 |
统计
方法 | 作用 |
| 统计对应实体类全表的记录总数 |
| 根据条件构造器 |
分页查询
方法分类 | 方法签名 | 功能说明 | 典型使用场景 |
分页查询 |
| 传入分页对象(如 | 分页+条件(如年龄>25 岁)查询用户,同时获取总条数、总页数等分页元数据 |
分页查询 |
| 仅通过分页对象( | 对大数据量表(如系统操作日志)做全表分页展示,按页加载避免一次性查全表 |
列表查询
方法分类 | 方法签名 | 功能说明 | 典型使用场景 |
列表查询 |
| 根据主键集合批量查询,传入 ID 集合,返回对应实体列表 | 批量获取指定 ID 的用户信息,如 |
列表查询 |
| 用 | 按 |
列表查询 |
| 结合 | 多条件组合(如年龄>18 且性别为男)查询,满足复杂业务筛选需求 |
列表查询 |
| 查询对应实体类全表数据,返回所有记录 | 加载数据量小的字典表(如状态枚举表)全量内容 |
Lambda 操作
方法分类 | 方法签名 | 功能说明 | 典型使用场景 |
Lambda 操作 |
| 获取 Lambda 查询链,支持链式调用+Lambda 表达式写条件,简化查询构建 | 链式写法: |
Lambda 操作 |
| 基于传入实体的初始值,结合 Lambda 链补充条件查询 | 已有部分实体数据(如姓名),再叠加年龄条件: |
Lambda 操作 |
| 获取 Lambda 更新链,用链式+Lambda 表达式定义更新字段和条件 | 链式更新: |