news 2026/9/2 16:16:24

MyBatis‑Plus Service 层常用自带方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis‑Plus Service 层常用自带方法

MyBatis‑Plus Service 层常用自带方法

前提:你的UserServiceImpl继承了ServiceImpl<UserMapper, User>
所以所有这些方法,在你的service实现类里面可以直接调用,不用写 mapper、不用写sql。

@ServicepublicclassUserServiceImplextendsServiceImpl<UserMapper,User>implementsIUserService{"这里就能直接用 query()、save()、updateById() ..."}

两套API区分清楚:
1️⃣Service链式(LambdaQuery / query())query().eq().one()
2️⃣Service普通方法savesaveBatchupdateByIdremoveByIdgetById
3️⃣ Mapper层方法:userMapper.selectById()(不推荐在service优先使用)


一、查询类(最常用)

1. query() 链式条件查询【黑马点评在用】

query() 返回一个查询构造器,支持链式拼接条件

page(current, size)

请看 query().page(current, size)


one() 查询一条

// where phone = 13800138000Useruser=query().eq("phone","13800138000").one();
  • 查到1条 → 返回对象
  • 查到0条 → null
  • 查到≥2条 →抛异常

list() 查询多条,返回集合

// 查询状态为正常的所有用户List<User>userList=query().eq("status",1).list();

count() 统计条数

// 查询手机号是否已经存在longcount=query().eq("phone","13800138000").count();if(count>0){//手机号已注册}

getOne(Wrapper) 老版写法(不推荐链式以外的)

现在优先用 query()

lambdaQuery() 👉【生产环境强烈推荐!!】

query()写字符串字段名"phone",拼写错不会编译报错!
lambdaQuery()用实体属性,编译校验,不会写错

Useruser=lambdaQuery().eq(User::getPhone,"13800138000").one();List<User>list=lambdaQuery().eq(User::getStatus,1).list();

企业开发优先 lambdaQuery(),少用 query()

条件方法对照表(链式里面 .之后调用)

方法含义生成SQL
.eq("字段",值)等于phone = ?
.ne("字段",值)不等于phone <> ?
.gt("age",18)大于age > 18
.ge("age",18)大于等于age >=18
.lt("age",18)小于age < 18
.le("age",18)小于等于age <= 18
.like("name","张")模糊查询 %张%name like '%张%'
.likeLeft("name","三")%三name like '%三'
.likeRight("name","张")张%name like '张%'
.in("id", 1,2,3)id在集合里面id in (1,2,3)
.isNull("email")字段为nullemail is null
.isNotNull("email")不为nullemail is not null
.orderByDesc("id")id降序order by id desc
.orderByAsc("id")id升序order by id asc

示例,多条件组合:

List<User>list=lambdaQuery().eq(User::getStatus,1).like(User::getNickName,"张").ge(User::getAge,18).orderByDesc(User::getId).list();

2. getById(id) 根据主键id查询(超级高频)

// 根据主键id查用户Useruser=getById(1L);
  • 查到返回对象,查不到返回null

3. listByIds() 根据多个id批量查询

List<Long>idList=Arrays.asList(1L,2L,3L);List<User>userList=listByIds(idList);

4. list() 不带条件 → 查询整张表全部数据

⚠️ 数据量大禁止使用!!

List<User>all=list();

二、新增类

1. save(entity) 单条新增

Useruser=newUser();user.setPhone("13800138000");user.setNickName("user_abc");//插入一条数据booleansuccess=save(user);
  • 返回 boolean,true插入成功
  • 主键如果是自增,插入成功后,user对象里面id会自动回填!

2. saveBatch() 批量新增(一次插入多条)

List<User>addList=newArrayList<>();addList.add(newUser());addList.add(newUser());//批量插入booleanok=saveBatch(addList);

三、修改更新类

后期的详细补充

1. updateById(entity) 根据主键id更新(最常用)

只更新实体中非null的字段!!!大坑重点

Useruser=newUser();user.setId(1L);user.setNickName("新名字");// 根据id更新昵称booleanok=updateById(user);

生成SQL:update user set nick_name=? where id=?

不会把其他字段置空!只更新你设置过的属性

2. update(实体, 更新条件Wrapper) 条件更新

MP 只会更新实体中你 set 过、不为 null 的字段
你只setNickName,所以只会更新nick_name其他字段完全不动,不会被清空

按条件更新,不是根据主键

// 把所有 status=0 的用户,昵称改成游客UserupdateEntity=newUser();updateEntity.setNickName("游客");booleanok=update(updateEntity,lambdaUpdate().eq(User::getStatus,0));

lambdaUpdate() 链式构建更新条件

四、删除类

1. removeById(id) 根据主键删除

booleanok=removeById(1L);

2. remove(条件Wrapper) 按条件删除

//删除手机号为空的用户booleanok=remove(lambdaQuery().isNull(User::getPhone));

3. removeByIds() 批量删除多个id

List<Long>ids=Arrays.asList(1L,2L);booleanok=removeByIds(ids);

⚠️实际业务几乎不做物理删除!用逻辑删除,加字段is_deleted

五、分页查询 - 高频

"pageNum当前页,pageSize每页条数"Page<User>page=newPage<>(1,5);// 分页查询,状态为1的用户Page<User>resultPage=page(page,lambdaQuery().eq(User::getStatus,1));// 获取分页数据List<User>records=resultPage.getRecords();// 总条数longtotal=resultPage.getTotal();

⚠️分页功能必须配置MyBatis‑Plus分页拦截器,否则分页失效!

六、一张速查表:Service层高频方法

方法作用
getById(id)主键id查单条
save(entity)新增一条
updateById(entity)根据主键更新
removeById(id)主键删除
query().eq().one()条件查一条(字符串字段)
lambdaQuery().eq().one()条件查一条【推荐】
lambdaQuery().eq().list()条件查列表
lambdaQuery().count()条件统计数量
lambdaUpdate()链式条件更新
page(page,wrapper)分页查询

七、容易踩的4个坑(高频出错)

坑1:updateById 只更新非null字段

如果你写:

Useruser=newUser();user.setId(1L);// 没有设置nickNameupdateById(user);

只会更新id,其他字段不动,不会清空。

坑2:one() 查到多条抛异常

如果你用手机号查询,数据库如果不小心存了两条相同手机号,one()直接崩溃。

坑3:query(“phone”)字符串写错,运行时报错,编译不报红

👉解决:生产一律优先lambdaQuery(User::getPhone)

坑4:MP的save不会自动给你填创建时间、更新时间

需要自动填充(createTime、updateTime),要用MetaObjectHandler

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 16:15:38

兰博基尼Temerario对比911 Turbo S:马力之外的门道

把新兰博基尼 Temerario 和保时捷 911 Turbo S 放到同一个对比里&#xff0c;大多数人最先看到的数字差是马力&#xff1a;Temerario 综合输出接近 920 马力&#xff0c;911 Turbo S 是 650 马力。只看这个差距&#xff0c;好像没什么可聊的。但只要你真的研究过两台车的定位、…

作者头像 李华
网站建设 2026/9/2 16:15:13

开题报告写不出来?书霸AI的万能方法救你,官网www.shubaai.com

有没有一种可能&#xff1a;不管你的开题报告卡在哪一步&#xff0c;都有一套通用的方法能帮你走下去&#xff1f;答案是有的。开题报告虽然内容各异&#xff0c;但写作的逻辑是相通的。今天就用书霸AI官网www.shubaai.com&#xff0c;给你一套“万能方法”&#xff0c;无论你卡…

作者头像 李华
网站建设 2026/9/2 16:09:09

传感器数据上云怎么做端到端加密:从设备身份到安全通道

传感器数据上云的安全问题&#xff0c;可以拆成两个独立又衔接的环节&#xff1a;先确认“谁在发数据”&#xff0c;再保护“数据怎么传”。前者是设备身份认证&#xff0c;后者是安全通道建立。第一步&#xff1a;设备身份是地基没有可靠身份认证的加密通道是危险的——通道可…

作者头像 李华
网站建设 2026/9/2 16:06:58

LeetCode hot100——K 个一组翻转链表

题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

作者头像 李华
网站建设 2026/9/2 16:06:37

RK3588 WebRTC 实时流卡顿优化:从视频桥接到 H.264 PTS 回退

总结&#xff1a;这次卡顿不是单纯的网络丢包或编码帧率不足&#xff0c;而是先由跨 pipeline 视频桥接和缩放增加了处理负担&#xff0c;后又暴露出 H.264 B 帧导致的非单调 PTS&#xff1b;最终通过 appsink/appsrc 直连、限制 videorate 补帧&#xff0c;并让不满足 PTS 条件…

作者头像 李华