mybatis-plus只查询部分字段的两种方法

本文介绍了Mybatis-Plus(MP)如何实现查询特定字段的需求,以提高效率。方法1是通过queryWrapper的select()方法指定查询字段,如username。方法2则展示了如何查询除特定字段(如id和email)之外的所有其他字段,同样使用select()方法。这两种方式能帮助开发者在不牺牲性能的前提下,灵活控制查询结果的字段范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis-plus(后面简称为mp)是mybatis的增强版,官方称之为 “ 只做增强,不做修改 ”。mp将一些简单的sql语句进行了封装和自动生成,提高了效率,但是降低了性能。

那么,用mybatis可以自己写sql,查询语句可以自由发挥,比如可以只查询表中的部分字段,对于mp也有两种针对此种需求的方法,下面就来介绍:
方法1:只需要查询出name和phone两个字段:使用queryWrapper的select()方法指定要查询的字段

@RequestMapping("/selectByWrapper1")
    public List<SysUser> selectByWrapper1(){
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("username");//指定查询某字段
        List<SysUser> sysUsers=sysUserService.list(queryWrapper);
        return sysUsers;
    }

方法2:查询出除age和address外其它所有字段的数据:同样使用queryWrapper的select()方法

@RequestMapping("/selectByWrapper2")
    public List<SysUser> selectByWrapper2(){
        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.select(SysUser.class, info ->!info.getColumn().equals("id") && !info.getColumn().equals("email"));//查询指定某字段以外的数据
        List<SysUser> sysUsers=sysUserService.list(queryWrapper);
        return sysUsers;
    }

### 如何在 MyBatis-Plus 中使用 Join 查询并指定字段MyBatis-Plus 的生态系统中,`mybatis-plus-join` 是一款非常强大的多表联查插件。它允许开发者轻松实现复杂的联表查询逻辑,并且可以灵活地指定需要的字段。 #### 插件简介 `mybatis-plus-join` 提供了一种无缝的方式来进行多表联查,完全遵循 MyBatis-Plus (MP) 的设计风格[^3]。这意味着如果你已经熟悉 MP 的基本用法,则无需学习新的语法即可快速上手 `mybatis-plus-join`。 --- #### 指定字段方法 当使用 `mybatis-plus-join` 进行联表查询时,可以通过以下几种方法来指定所需的字段: 1. **通过 Select 方法显式声明所需字段** 在构建查询条件时,可以直接调用 `select()` 方法来明确指出希望获取哪些字段。这不仅提高了性能,还减少了不必要的数据传输。 ```java List<UserVo> list = new MpJLambdaWrapper<>() .select(User::getUserId, User::getName) // 显式选择 userId 和 name 字段 .leftJoin(Department.class, d -> d.getDeptId().eq(User::getDeptId)) .list(new UserVo()); ``` 2. **利用自定义 VO 类映射特定字段** 如果仅需部分字段而不是整个实体对象,可以创建一个专门用于接收查询结果的数据传输对象 (DTO 或 VO),并通过构造器注入或手动赋值完成字段匹配。 ```java public class UserDepartmentVo { private Long userId; private String userName; private String departmentName; // Getters and Setters... } ``` 配合上述代码片段中的 `UserVo` 替换为目标类实例化即可。 3. **设置别名以区分同名列冲突** 当两个表存在相同名称列的情况下(如 id),可通过设定别名为每张表分配唯一标识符从而避免混淆问题发生。 ```java List<Map<String, Object>> resultMaps = new MpJWrapper() .selectAs(User::getId, "userId") // 将 user 表 ID 设置为 userId 别名 .selectAs(Department::getId, "deptId") // 将 department 表 ID 设为 deptId 别名 .innerJoin(Department.class, Department::getUserId.eq(User::getId)) .getResultMap(); ``` 4. **链式调用来简化复杂 SQL 构建过程** 借助 Lambda 表达式的强大功能以及流利接口模式的支持下,能够更加直观简洁地表达我们的意图而不需要编写冗长繁琐的传统字符串拼接形式SQL语句。 --- #### 示例代码展示 以下是基于官方文档的一个简单例子演示如何执行带字段筛选的 JOIN 操作: ```java // 导入必要的依赖包 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.ylchang.mpj.MpJLambdaWrapper; import java.util.List; public class ExampleService { public void queryWithFields() { // 创建 Wrapper 对象 MpJLambdaWrapper<OrderEntity> wrapper = new MpJLambdaWrapper<>(); // 添加联结条件 wrapper.innerJoin(ProductEntity.class, product -> product.getId().eq(OrderEntity::getProductId)); // 指定要查询字段 wrapper.select( OrderEntity::getOrderId, // 订单编号 ProductEntity::getProductName // 商品名称 ); // 执行分页查询 Page<OrderProductVO> pageResult = orderMapper.pageJoin( new Page<>(current, size), wrapper.allEq(map), OrderProductVO.class // 自定义的结果集模型 ); System.out.println(pageResult); } } ``` 此示例展示了如何在一个订单管理系统里关联产品信息的同时只提取必要属性组合成一个新的视图结构。 --- ### 总结 综上所述,在 MyBatis-Plus 中借助第三方库 `mybatis-plus-join` 能够方便快捷地达成跨多个关系型数据库表格之间相互参照的需求;与此同时还可以精确控制最终输出记录所含有的具体项数及其顺序安排等问题[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值