MyBatis-Plus实现自定义SQL语句的分页查询

正常开发的时候,有时候要写一个多表查询,然后多表查询之后还需要分页,MyBatis-Plus的分页插件功能挺不错的,可以很简单实现自定义SQL的分页查询。

分页插件配置

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    /**
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

注解方式写自定义SQL

自定义SQL返回数据的DTO类

自定义SQL返回的数据跟模型类也有点出入,需要重新新建一个DTO类,用来存储数据。

import lombok.Data;

@Dat
<think>嗯,用户现在的问题是关于MyBatis-Plus如何实现多表联查的分页查询,需要示例。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的信息可以利用。 根据引用[2],提到MPJLambdaWrapper是mybatis-plus-join插件的一个条件构造器,支持多表联查,并且可以结合分页查询。引用[3]中提到了分页查询时可能需要将结果分组处理,但用户更关注的是如何直接通过MyBatis-Plus实现多表分页,而不是后续的数据处理。 用户之前的问题可能涉及到使用mp+stream进行多表联查,但现在他们希望更规范的做法,比如使用关联查询而不是多次查询数据库。所以需要比较两种方法的优缺点,并给出示例。 首先,我需要确认MyBatis-Plus原生是否支持多表联查的分页。原生的MyBatis-Plus主要针对单表操作,多表联查可能需要借助插件,比如mybatis-plus-join。引用[2]中的MPJLambdaWrapper应该就是这个插件的部分,所以可能需要引导用户使用该插件。 接下来,分页查询通常需要Page对象,结合查询条件。使用MPJLambdaWrapper的话,应该可以像普通的LambdaQueryWrapper一样,然后调用selectPage方法。但需要确认是否正确处理了多表关联的分页,比如是否会自动处理count查询,或者是否需要自定义分页查询。 另外,用户可能对性能有顾虑,多次查询与一次联查的优劣需要分析。比如,联查可能减少数据库连接次数,但可能增加单次查询的复杂度和数据量。而多次查询虽然增加了连接次数,但可能更灵活,尤其是当关联表的数据量较大时,分页在内存中处理可能效率低下。 所以,在回答中需要分步骤说明两种方法:使用插件进行联查分页,以及使用多次查询结合stream处理。然后比较优缺点,比如联查的SQL复杂度高,但减少连接次数;多次查询适合简单场景,但需要处理多次数据库访问。 示例部分,需要给出具体的代码,比如如何配置插件,如何编写MPJLambdaWrapper,以及Service层如何调用分页方法。同时,需要提到可能需要注意的地方,比如别名冲突、结果映射是否正确,以及分页参数是否正确传递。 最后,确保回答结构清晰,先介绍方法,再给出示例,然后分析优缺点和使用场景,帮助用户根据具体情况选择合适的方式。</think>### MyBatis-Plus多表联查分页查询实现方法 #### 一、实现思路与步骤 1. **使用mybatis-plus-join插件** 原生MyBatis-Plus不支持多表联查分页,需集成第三方插件如`mybatis-plus-join`[^2]。该插件提供`MPJLambdaWrapper`支持联表查询,结合`Page`对象实现分页。 2. **分页核心流程** - 创建`Page`对象定义分页参数 - 使用`MPJLambdaWrapper`构建联查条件 - 调用`selectJoinPage()`方法获取分页结果 #### 二、完整代码示例 ```java // 1. 添加插件依赖 <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join</artifactId> <version>1.2.4</version> </dependency> // 2. Service层实现 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Autowired private DepartmentMapper departmentMapper; public Page<UserDTO> selectUserWithDepartment(Page<User> page) { MPJLambdaWrapper<User> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(User.class) .select(Department::getDeptName) .leftJoin(Department.class, Department::getId, User::getDeptId) .like(User::getName, "张") .orderByDesc(User::getCreateTime); return departmentMapper.selectJoinPage(page, UserDTO.class, wrapper); } } // 3. 结果映射DTO @Data public class UserDTO extends User { private String deptName; // 关联字段 } ``` #### 三、两种实现方式对比 | 实现方式 | 优点 | 缺点 | 适用场景 | |-------------------|-----------------------------|-----------------------------|----------------------------| | 插件联查 | 单次查询效率高,SQL逻辑集中 | 复杂关联需手动映射结果 | 需要精确分页的复杂查询 | | MP+Stream多次查询 | 代码简单,各表独立查询 | 分页在内存处理,大数据量性能差 | 简单关联(2-3表),数据量小 | #### 四、注意事项 1. **分页准确性** 联表分页需注意`COUNT`语句的准确性,复杂查询建议手动编写`@Select`注解SQL[^3] 2. **结果映射** 使用`selectAs()`处理字段别名冲突,如:`wrapper.selectAs(Department::getDeptName, UserDTO::getDeptName)` 3. **索引优化** 联表查询时确保关联字段有索引,避免全表扫描
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值