多表分页查询

@Override
public IPage<DishDto> getByPage(Integer page, Integer pageSize, String name) {
    Page<Dish> p = new Page<>(page, pageSize);
    LambdaQueryWrapper<Dish> qw = new LambdaQueryWrapper<>();
    qw.like(StringUtils.isNotBlank(name),Dish::getName,name);
    qw.orderByAsc(Dish::getSort);
    page(p,qw);
    //======================================================================
    //构造一个新的分页对象
    Page<DishDto> dtoPage = new Page<>();
    //复制分页的属性,其他的数据啥的都不管先,复刻箱子模型,在原先的基础上增大一点容量
    BeanUtils.copyProperties(p,dtoPage,"records");
    //获取之前装苹果的箱子
    List<Dish> dishlist = p.getRecords();//表示之前的容器
    List<DishDto> dishDtoList = dishlist.stream().map(dish -> {
        //新买的大箱子
        DishDto dishDto = new DishDto();
        //将苹果搬到大箱子
        BeanUtils.copyProperties(dish,dishDto);
        //买柚子
        Category category = categoryService.getById(dish.getCategoryId());
        //将柚子放入大箱子里
        dishDto.setCategoryName(category.getName());
        return dishDto;
        //装车
    }).collect(Collectors.toList());
    dtoPage.setRecords(dishDtoList);
    return dtoPage;
}
<think>好的,我现在要帮用户介绍MyBatis-Plus的分页查询。首先,我需要回忆一下自己之前学过的MyBatis-Plus的知识,尤其是关于分页和查询的部分。 用户的问题是关于MyBatis-Plus分页查询的,所以需要涵盖基本概念、实现步骤以及可能的示例代码。不过,我得先确认MyBatis-Plus本身是否支持分页。记得MyBatis-Plus主要增强单操作,而查询可能需要手动编写SQL或者使用其他方法。 首先,应该解释MyBatis-Plus的分页机制。MyBatis-Plus提供了分页插件(PaginationInterceptor),可以方便地进行物理分页,而不是内存分页。用户只需要配置这个插件,然后在Service层使用Page对象和对应的查询方法即可。 但是查询的时候,比如联查询,MyBatis-Plus的Wrapper可能不够用,因为Wrapper主要是针对单的条件构造。这时候可能需要自己写SQL,或者使用其他的方式,比如在XML文件中写联查询的语句,然后结合分页参数。 接下来,步骤应该是: 1. 配置分页插件。这是基础,确保分页功能开启。 2. 编写Mapper接口和对应的XML文件,定义查询的SQL语句。这里可能需要使用JOIN等关键字。 3. 在Service层调用这个自定义的查询方法,并传入Page参数,这样分页信息会被自动添加到SQL中。 4. 处理返回的结果,Page对象会包含分页的数据和分页信息,比如总记录数、当前页码等。 需要注意的是,在自定义SQL中,分页插件是通过拦截器在SQL执行前进行分页处理,所以需要保证SQL语句能被正确改写。例如,在MySQL中,分页插件会自动加上LIMIT语句,而在Oracle中可能会使用ROWNUM。 另外,查询时,如果涉及到关联查询的结果映射,可能需要使用resultMap来处理复杂的字段映射,尤其是当查询结果包含的字段时。这时候,MyBatis的resultMap就派上用场了,可以手动配置字段和属性的对应关系。 可能的示例部分,应该给出一个简单的例子,比如查询用户和订单信息,进行分页。例如,User和Order关联查询,然后在XML中写一个select语句,使用LEFT JOIN,然后在Mapper接口中定义这个方法,参数包括Page对象,返回类型是Page<UserOrderVO>,其中UserOrderVO是一个包含用户和订单信息的VO类。 另外,可能需要提到的是,如果使用MyBatis-Plus的3.x版本,可能有一些新的特性或者不同的配置方式,比如分页插件的配置类可能有所变化,需要根据版本来调整配置代码。 还有,是否需要提到使用QueryWrapper进行子查询或者复杂条件拼接?比如在查询中,有时候可能需要在WHERE子句中使用子查询,这时候Wrapper可能可以辅助生成部分条件,但主查询还是需要自己写SQL。 最后,可能需要注意的地方包括分页的正确性,特别是在关联时,要确保分页的总数是正确的,避免因为关联导致的重复数据影响分页结果。这时候可能需要使用DISTINCT或者调整查询方式,确保COUNT语句的正确性。 总结下来,回答的结构应该是: 1. 介绍MyBatis-Plus分页的基本使用,配置分页插件。 2. 查询的实现方式,需要自定义SQL。 3. 示例步骤,包括Mapper接口、XML文件、Service层的调用。 4. 注意事项,如结果映射、分页正确性等。 5. 可能的扩展,比如使用VO类来接收结果,或者提到其他方法如使用注解方式写SQL。 现在需要将这些内容组织成一个连贯的回答,用中文简洁明了地解释清楚,同时给出代码示例帮助理解。</think>MyBatis-Plus 的分页查询需要结合其分页插件和自定义 SQL 实现,以下是关键步骤和示例: --- ### **1. 配置分页插件** 在 Spring Boot 的配置类中添加分页插件(以 3.x 版本为例): ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` --- ### **2. 编写查询 SQL** 在 XML 映射文件中编写联查询语句(如 `UserMapper.xml`): ```xml <select id="selectUserOrderPage" resultType="com.example.vo.UserOrderVO"> SELECT u.id, u.name, o.order_no, o.amount FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.status = 1 </select> ``` --- ### **3. 定义 Mapper 接口** 在 Mapper 接口中声明分页查询方法,使用 `Page` 对象作为参数: ```java public interface UserMapper extends BaseMapper<User> { Page<UserOrderVO> selectUserOrderPage(Page<UserOrderVO> page, @Param("status") Integer status); } ``` --- ### **4. Service 层调用** 在 Service 中调用分页方法,自动处理分页逻辑: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public Page<UserOrderVO> getUserOrderPage(int pageNum, int pageSize) { Page<UserOrderVO> page = new Page<>(pageNum, pageSize); return userMapper.selectUserOrderPage(page, 1); } } ``` --- ### **5. 结果映射** 创建 VO(View Object)类接收字段: ```java @Data public class UserOrderVO { private Long userId; private String userName; private String orderNo; private BigDecimal amount; } ``` --- ### **注意事项** - **SQL 优化**:确保联查询性能,避免全扫描。 - **分页准确性**:当关联查询可能重复时,使用 `COUNT(DISTINCT u.id)` 确保总数正确。 - **XML 与注解**:除 XML 外,也可用 `@Select` 注解直接编写 SQL(适合简单语句)。 --- ### **扩展场景** 若需动态条件,可结合 `QueryWrapper` 拼接 WHERE 子句: ```java // 在 Mapper 方法中添加 @Param("ew") QueryWrapper Page<UserOrderVO> selectUserOrderPage(Page<UserOrderVO> page, @Param("ew") QueryWrapper wrapper); // 调用时构建条件 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("u.name", "John"); userMapper.selectUserOrderPage(page, wrapper); ``` --- 通过以上步骤,即可在 MyBatis-Plus 中实现高效的分页查询,兼顾灵活性与性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值