Mybatis-Plusselect不去查全部字段和去重问题
1、mybatis-plus select查询语句默认是查全部字段
很多刚接触MyBatis-Plus的朋友可能会发现,直接用selectList()方法,生成的SQL会把表里所有字段都查出来。这在大多数场景下没问题,但万一表字段很多,或者你只想取其中几个,查全部字段就显得有点“浪费”了。那么,怎么精准地指定查询字段呢?主要有两种方法。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

为了更直观地说明,我们先来看下示例表结构:
CREATE TABLE `user` ( `id` bigint(20) NOT NULL COMMENT '主键', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年龄', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `manager_id` bigint(20) DEFAULT NULL COMMENT '直属上级id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `manager_fk` (`manager_id`), CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第一种方法:明确指定字段名
假设我们只需要查询user表的name和age字段,可以利用QueryWrapper的select(String... columns)方法,直接把字段名传进去就行。
@Test
public void selectByWrapper10() {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.select("name", "age").like("name", "雨");
List users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
执行后,看看控制台输出的SQL日志,效果立竿见影:
DEBUG==> Preparing: SELECT name,age FROM user WHERE name LIKE ?
DEBUG==> Parameters: %雨%(String)
TRACE<== Columns: name, age
TRACE<== Row: 张雨琪, 31
TRACE<== Row: 刘红雨, 31
DEBUG<== Total: 2
看,SQL语句确实只查询了我们指定的两个字段。
第二种方法:动态排除特定字段
有时候情况反过来,我们想查询除了某几个字段外的所有字段。比如,不想查manager_id和create_time。这时候,select方法另一个重载形式就派上用场了,它允许我们通过Lambda表达式动态判断。
@Test
public void selectByWrapper11() {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.select(User.class, info -> !info.getColumn().equals("manager_id")
&& !info.getColumn().equals("create_time"));
List users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
再来看看生成的SQL:
DEBUG==> Preparing: SELECT id,name,age,email FROM user
DEBUG==> Parameters:
TRACE<== Columns: id, name, age, email
TRACE<== Row: 1087982257332887553, 大boss, 40, boss@baomidou.com
TRACE<== Row: 1088248166370832385, 王天风, 25, wtf@baomidou.com
TRACE<== Row: 1088250446457389058, 李艺伟, 28, lyw@baomidou.com
TRACE<== Row: 1094590409767661570, 张雨琪, 31, zjq@baomidou.com
TRACE<== Row: 1094592041087729666, 刘红雨, 31, lhm@baomidou.com
DEBUG<== Total: 5
可以看到,manager_id和create_time字段已经被成功排除在外了。这种方法在实体类字段较多时尤其好用。
2、Mybatis plus实现Distinct去重功能
说到去重,方法其实不少。你可以用分组查询,也可以在Ja va层用Set处理。但如果就想在SQL层面用DISTINCT关键字,MyBatis-Plus也完全支持,而且用法相当直接。
关键就在select方法里,把DISTINCT关键字和字段名一起作为字符串传进去即可:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.select("DISTINCT no,type").orderByAsc("oldlu");
return mapper.selectList(queryWrapper);
注意,这里查询出的结果类型,需要根据你的实体类来定。比如,如果你的实体类是User,那么写法应该是:
QueryWrapperqueryWrapper = new QueryWrapper<>(); queryWrapper.select("DISTINCT no,type").orderByAsc("oldlu"); return mapper.selectList(queryWrapper);
这样一来,生成的SQL就会包含DISTINCT关键字,实现对指定字段组合的去重查询。
3、Mybatis plus实现in操作
IN查询在业务中太常见了。如果参数本身就是一个List这样的集合,那直接传给in方法就行。但有时候,我们的参数是另一个查询的结果集,需要先取出来再塞进IN条件里。如果手动拼SQL或者写复杂接口,就显得有点麻烦。其实,用MyBatis-Plus可以很优雅地搞定。
我们来看一个典型的场景和步骤:
// 1. 先查询到一个实体对象列表 ListuserList = userService.selectById(id); // 2. 准备一个结果集,用来存放需要用于IN查询的字段值 List resultList = new ArrayList<>(); // 3. 遍历集合,提取出我们需要的ID值 userList .forEach(item->{ resultList.add(item.getYouNeedId()); }); // 4. 构造查询条件,使用in方法 QueryWrapper qw = new QueryWrapper<>(); qw.in("you_need_id", resultList); // 5. 执行查询(这里以分页查询为例,其他方法同理) IPage userIPage = userMapper.selectPage(page, qw); // 6. 返回结果 return contractRecordIPage.getRecords();
这套组合拳打下来,逻辑清晰,代码也简洁。本质上就是先把数据捞出来处理成集合,再交给QueryWrapper的in方法去构建SQL条件。
4、mybatis 转义对照表
在XML中写动态SQL时,经常会遇到小于号(<)、大于号(>)这些特殊字符。直接写的话,XML解析器会误认为它们是标签的一部分,从而导致解析错误。这个问题困扰过不少开发者。
解决办法其实不复杂,就是做一下转义替换。下面这个对照表,建议收藏备用:
| < | <= | > | >= | & | ’ | " |
|---|---|---|---|---|---|---|
| < | <= | > | >= | & | ' | " |
光说不练假把式,看个代码例子就明白了。比如下面这个分页查询的XML片段,在比较日期时就用到了转义符:
总结
以上就是关于MyBatis-Plus在日常开发中几个实用技巧的分享,涵盖了字段选择、去重查询、IN条件构建以及XML转义这些常见痛点。掌握这些,能让你的代码更高效、更清晰。希望这些经验能为大家提供一些参考和帮助。
您可能感兴趣的文章:
- mybatis-plus报错net.sf.jsqlparser.statement.select.SelectBody的问题解决
- mybatis-plus @select动态查询方式
- MyBatis-Plus动态表名使用selectPage方法不生效问题解析与解决方案
- 解决MyBatis-Plus使用动态表名selectPage不生效的问题
- Mybatis-plus的selectPage()分页查询不生效问题解决
- Mybatis-plus使用selectList查询数据为null的问题及解决办法
相关攻略
京东物流发布“独狼”第六代智能配送车Plus版,末端物流进入高效智能新阶段 在刚刚落幕的第十六届中国国际道路交通安全产品博览会上,京东物流带来了一款重磅新品——“独狼”第六代智能配送车Plus版。这款达到L4级别的自动驾驶无人配送车,不仅在“肚量”上做了大幅扩容,其智能化内核也迎来了全面革新。可以说
1、mybatis-plus select查询语句默认是查全部字段 很多刚接触MyBatis-Plus的朋友可能会发现,直接用selectList()方法,生成的SQL会把表里所有字段都查出来。这在大多数场景下没问题,但万一表字段很多,或者你只想取其中几个,查全部字段就显得有点“浪费”了。那么,怎么
北京车展比亚迪展台,人最多的区域除了腾势方程豹外,就是元Plus的展位 今天,第三代元Plus迎来首发亮相。作为一款全球销量已突破110万辆的传奇车型,它的换代自然吸引了无数目光。可以说,元PLUS不仅是比亚迪的销量支柱,更是其首款真正意义上的全球战略乘用车,这次换代的分量,不言而喻。 来到现场,最
SciPub+是什么 当你在为下一篇论文的开头发愁,或者在“方法”部分的重复描述中感到枯燥时,或许一款真正懂科研的写作工具能带来转机。SciPub+正是这样一款产品,它由一群至今仍活跃在一线的科研人员亲手打造,专为应对学术写作中的那些独特挑战而生。简单来说,它就像一个全天候在线的写作伙伴,目标很明确
Plus AI Market Research & Presentation Suite是什么 在演示文稿制作这个领域,效率和专业度常常难以兼得。而Plus AI公司的这款Market Research & Presentation Suite,恰恰瞄准了这个痛点。简单来说,它是一款嵌入在Power
热门专题
热门推荐
微软调整XGP战略:降价与《使命召唤》延期入库的背后 最近游戏圈有个大消息:微软宣布下调Xbox Game Pass Ultimate和PC Game Pass的月度订阅价格。具体来看,Ultimate档位从每月29 99美元降到了22 99美元,PC Game Pass则从16 49美元降至13
2026年,Xbox新掌门的第一把火:Game Pass要变“自助餐”了 2026年2月,阿莎·夏尔马接棒菲尔·斯宾塞,成为Xbox的新任CEO。这位新官上任,动作可谓雷厉风行。就在昨天,她点燃了第一把火:Xbox Game Pass Ultimate的月费,从29 99美元直接降到了22 99美元
当明星演员想开游戏工作室:资深同行为何直言“别这么做”? 最近,游戏圈里发生了一场有趣的隔空对话。为《最后生还者》《死亡搁浅》等大作献声的知名演员特洛伊·贝克,在采访中透露了一个雄心勃勃的计划:他想创立自己的游戏工作室,去讲述“自己的故事”。他甚至提到,自己的灵感来源之一,正是曾为《刺客信条:起源》
Steam新款手柄评测视频意外流出,定价信息同步曝光 游戏硬件圈最近有个不大不小的“意外”。根据海外多个科技消息源的报道,Valve即将推出的新款Steam Controller手柄,其评测视频竟然提前在网上泄露了。更关键的是,视频里还直接公布了这款产品的售价:99美元。 事情是这样的:一个名为“T
此前,外网消息源透露,目前PlayStation在PS4和PS5的数字版游戏中加入了DRM验证(正版在线验证)机制。 前情提要>> 简单来说,这个新机制的效果是这样的:从今往后,如果你通过数字商店购买新游戏,那么主机就必须定期连接到PSN网络进行正版验证。具体规则是,如果主机连续超过30天处于离线状





