mybatis-plus分页查询

内置的分页方法

内置方法
在Mybatis-Plus的BaseMapper中,已经内置了2个支持分页的方法:

/**
 * 根据 entity 条件,查询全部记录(并翻页)
 *
 * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
 * @param queryWrapper 实体对象封装操作类(可以为 null)
 */
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

/**
 * 根据 Wrapper 条件,查询全部记录(并翻页)
 *
 * @param page         分页查询条件
 * @param queryWrapper 实体对象封装操作类
 */
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

使用的话要配置,还没用到,用到了再说

package com.xxxx.mybatisplus.config;

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

@Configuration
//扫描接口所在的包
@MapperScan("com.xxxx.mybatisplus.mapper")//可以将主类的注解移动到此处
public class MyBatisPlusConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
    
}

    @Test
    public void testPageCondition(){

        //查询用户名包含a,年龄在20-30之间,邮箱信息不为null的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        //字段名,
        queryWrapper.between("age",20,30)
                    .isNotNull("email");

        //设置分页参数
        Page<User> page = new Page<>(3,5);
        userMapper.selectPage(page,queryWrapper);
        //获取分页数据
        List<User> list = page.getRecords();
        list.forEach(System.out::println);
        System.out.println("当前页:"+page.getCurrent());
        System.out.println("每页显示的条数:"+page.getSize());
        System.out.println("总记录数:"+page.getTotal());
        System.out.println("总页数:"+page.getPages());
        System.out.println("是否有上一页:"+page.hasPrevious());
        System.out.println("是否有下一页:"+page.hasNext());
    }

分页原理

mybatis-plus分页查询的实现原理:
1、由分页拦截器PaginationInnerInterceptor拦截所有查询请求,在执行查询前判断参数中是否包含IPage类型的参数。
2、如果包含IPage类型的参数,则根据分页信息,重新组装成分页查询的SQL。

自定义分页

搞清楚mybatis-plus中分页查询的原理,我们来自定义分页查询方法。

我使用的是mybatis-plus 3.5.2的版本。

  <dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-boot-starter</artifactId>
       <version>3.5.2</version>
   </dependency>

Page对象即作为参数,也作为查询结果接收体

ActivityMeetingPageQueryDTO extends Query

@Data
@ApiModel(value = "ActivityMeetingPageQueryDTO对象", description = "分页查询入参")
public class ActivityMeetingPageQueryDTO extends Query implements Serializable {
    private static final long serialVersionUID = 1L;
	......
}

controller

    @ApiOperation(value = "分页查询谈心谈话")
    @PostMapping("/pageQuery")
    public R pageQuery(@RequestBody ActivityMeetingPageQueryDTO meetingPageQueryDTO) {
        Page<ActivityTalkVO> page = new Page<>(meetingPageQueryDTO.getCurrent(), meetingPageQueryDTO.getSize());
        List<ActivityTalkVO> resultList = activityTalkService.select(page,meetingPageQueryDTO);
        page.setRecords(resultList);
        return R.data(page);
    }

service

    List<ActivityTalkVO> select(Page<ActivityTalkVO> page, ActivityMeetingPageQueryDTO meetingPageQueryDTO);

serviceImpl

    @Override
    public List<ActivityTalkVO> select(Page<ActivityTalkVO> page, ActivityMeetingPageQueryDTO meetingPageQueryDTO) {
        meetingPageQueryDTO.setTenantId(AuthUtil.getTenantId());
        List<ActivityTalkVO> list =activityTalkMapper.select(page,meetingPageQueryDTO);
        list.forEach(item->{
            if(item.getTalkObject()!=null && !Objects.equals(item.getTalkObject(), ""))
                item.setTalkObject(DisplayNameUtils.toFormatDisplay(item.getTalkObject()));
        });
        return list;
    }

mapper

    List<ActivityTalkVO> select(Page<ActivityTalkVO> page, @Param("query") ActivityMeetingPageQueryDTO meetingPageQueryDTO);

Page作为参数,用新的IPage对象接收查询结果

controller

    @GetMapping("/list")
    @ApiOperation(value = "分页条件查询党组织信息列表", notes = "后台默认传递的是根党组织的ancestors和orgId, 列表显示根党组织下一级的全部组织, 要显示哪一个党组织则需要传递相应的ancestors和orgId; " +
            "orgName和orgType是查询条件")
    @TenantIgnore
    public R<IPage<OrgListVO>> lowOrgList(String ancestors, Long orgId,String orgName, String orgType, Query query) {
        IPage<OrgListVO> pages = partyOrgManageService.lowOrgList(Condition.getPage(query),ancestors,orgId,orgName,orgType);
        return R.data(pages);
    }

service

    //下级党组织列表
    IPage<OrgListVO> lowOrgList(IPage<Object> page,String ancestors, Long orgId, String orgName, String orgType);

serviceImpl

    @Override
    public IPage<OrgListVO> lowOrgList(IPage<Object> page,  String ancestors, Long orgId,String orgName, String orgType) {
        return partyOrgManageMapper.lowOrgList(page,ancestors,orgId,orgName,orgType);
    }

mapper

    IPage<OrgListVO> lowOrgList(IPage<Object> page, String ancestors, Long orgId, String orgName, String orgType);

分页插件PageHelper

很多人已经习惯了在mybatis框架下使用PageHelper进行分页查询,在mybatis-plus框架下依然也可以使用,和mybatis-plus框架自带的分页插件没有明显的高下之分。

个人认为mybatis-plus的分页实现可以从方法命名、方法传参方面更好的规整代码。而PageHelper的实现对代码的侵入性更强,不符合单一指责原则。

推荐在同一个项目中,只选用一种分页方式,统一代码风格。

PageHelper的使用:

1.引入maven依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

2.PageHelper分页查询
代码如下(示例):

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值