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的问题及解决办法
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Java编译命令在CentOS怎么用
在CentOS上使用Ja va编译命令 想在CentOS系统上编译Ja va程序?这事儿其实不难,但第一步得先把“家伙事儿”准备好——也就是Ja va开发工具包(JDK)。如果你的系统里还没装JDK,别急,跟着下面这几步走,几分钟就能搞定。 第一步:安装JDK 首先,打开你的终端。接下来,最常用的做
如何在CentOS上进行Java编译
在CentOS上编译Ja va程序:从环境搭建到“Hello, World!” 想在CentOS系统上玩转Ja va开发?这事儿其实没想象中那么复杂。核心就两步:先把Ja va开发环境搭起来,然后通过命令行让代码跑起来。下面这份手把手的指南,能帮你快速走通这个流程。 第一步:安装Ja va开发工具包
centos下如何交叉编译golang程序
在CentOS系统下交叉编译Go程序 你是否需要在CentOS服务器上开发Go应用,并希望将其部署到Windows、macOS或其它Linux发行版上运行?通过交叉编译技术,你可以轻松地在CentOS环境中生成适用于多种操作系统和CPU架构的可执行文件。实现这一目标的关键在于灵活运用Go语言内置的环
SpringBoot如何查看与SpringCloud的对应版本
1、访问Spring官方网站 要获取最权威的版本对应信息,最直接的办法就是访问Spring的官方项目网站。通常,你只需要在页面上找到并点击查看版本的链接即可。 2、解读返回的JSON元数据 访问后,网站会返回一份结构清晰的JSON数据,里面包含了构建信息、Git提交记录,以及我们最关心的——各个组件
Nacos配置中心与本地代码工程配置文件之间的优先级关系详解
一、核心原理:配置是如何加载的? 要深入理解Nacos配置中心与本地配置的优先级关系,必须首先掌握Spring Cloud应用启动时配置加载的完整流程。整个过程可以清晰地划分为两个关键的上下文阶段: 1 Bootstrap Context(引导上下文) 引导上下文会在主应用上下文之前完成初始化,是
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

