mp核心功能

发布于:2025-07-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

条件构造器

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


网站公告

今日签到

点亮在社区的每一天
去签到