Mybatis-Plusselect不去查全部字段和去重问题
1、mybatis-plus select查询语句默认是查全部字段 很多刚接触MyBatis-Plus的朋友可能会发现,直接用selectList()方法,生成的SQL会把表里所有字段都查出来。这在大多数场景下没问题,但万一表字段很多,或者你只想取其中几个,查全部字段就显得有点“浪费”了。那么,怎么
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。
同类文章
JDK1.8 64位使用体验:首页结构与内容风格解析
JDK1 864位版本作为Java开发的核心环境,其安装配置的便捷性、运行时的性能表现以及对现代开发工具链的兼容性是主要关注点。实际使用中,它在处理大型项目时内存管理效率较高,Lambda表达式等特性显著提升了代码简洁性。与32位版本相比,在大内存应用场景下优势明显,但需注意与特定遗留系统的兼容情况。
从Socketeq看当前开发者技术热点趋势
当前开发者通过技术社区讨论,反映出对异步编程、网络协议演进及跨平台开发工具的持续关注。高性能I O处理、现代协议支持以及提升开发效率的框架成为热点。这些趋势共同指向构建更响应、更可扩展且易于维护的应用程序需求。
JDK 1.8 64位常见问题与文档下载入口
获取与安装过程中的典型问题在获取JDK1 864位版本时,首要问题是找到可靠的下载源。Oracle官网提供了历史版本的下载通道,但可能需要注册账户。
TypeScript常见报错解决方案:类型不兼容与模块导入问题详解
TypeScript开发中常遇到类型不兼容、模块导入失败及any类型滥用等问题。类型不兼容多源于结构差异或字面量类型,可通过类型断言、收窄或重构接口解决。模块导入错误需检查路径、声明文件及模块解析策略。过度使用any会丧失类型安全,应逐步替换为具体类型或使用unknown。掌握这些解决方案能有效提升代码质量与开发效率。
JDK 1.8 64位版本核心功能与重要更新详解
JDK1 864位版本作为Java开发的核心环境,其值得关注的内容方向包括Lambda表达式与函数式编程带来的代码简化、StreamAPI对集合操作的革新、新的日期时间API解决旧版缺陷,以及Metaspace内存管理优化和CompletableFuture对异步编程的支持。这些特性深刻影响了Java的开发模式与性能表现。
- 热门数据榜
相关攻略
2026-07-16 06:30
2026-07-16 06:30
2026-07-16 06:29
2026-07-16 06:29
2026-07-16 06:29
2026-07-16 06:29
2026-07-16 06:29
2026-07-16 06:29
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

