JAVA常见的几种分页方式。


MyBatis的Mapper接口以及Example的实例函数及详解------条件查询参考博文
拦截器实现分页
Spring boot中利用PageHelper实现分页

1.参数和返回值

1.1参数:int page:当前页,int rows:每页的大小。
1.2响应:int total:总条数。List items:当前页的数据。

@Data
@ToString
public class QueryResult<T> {
    //数据列表
    private List<T> list;
    //数据总数
    private long total;
}

2.实现分页的方法

使用SQL语句。

1.起始条目索引从0开始

2.limit子句放在查询语句的最后

3.公式:select * from  表 limit (page-1*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page

2.1SpringBoot+Mybatis+PageHelper–数据库:Mysql

原理:在调用dao的service方法中设置分页参数:PageHelper.startPage(page, size),分页参数会设置在ThreadLocal中PageHelper在mybatis执行sql前进行拦截,从ThreadLocal取出分页参数,修改当前执行的sql语句,添加分页sql。

2.1.1添加依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper‐spring‐boot‐starter</artifactId>
<version>1.2.4</version>
</dependency>
2.1.2配置pageHelper

在application.yml中配置pageHelper操作的数据库类型:

pagehelper:
helper‐dialect: mysql
2.1.3PageHelper测试

(1)定义mapper 接口

@Mapper
public interface CourseMapper {
CourseBase findCourseBaseById(String id);
Page<CourseInfo> findCourseListPage(CourseListRequest courseListRequest);
}

(2)定义mapper.xml映射文件

<select id="findCourseListPage" resultType="com.xuecheng.framework.domain.course.ext.CourseInfo"
parameterType="com.xuecheng.framework.domain.course.request.CourseListRequest">
SELECT
course_base.*,
(SELECT pic FROM course_pic WHERE courseid = course_base.id) pic
FROM
course_base
</select>

(3)测试DAo

//测试分页
@Test
public void testPageHelper(){
PageHelper.startPage(1, 10);//查询第一页,每页显示10条记录
CourseListRequest courseListRequest = new CourseListRequest();
Page<CourseInfo> courseListPage = courseMapper.findCourseListPage(courseListRequest);
List<CourseInfo> result = courseListPage.getResult();
System.out.println(courseListPage);
}

测试前修改日志级别为debug,并跟踪运行日志,发现sql语句中已经包括分页语句.如下图;
在这里插入图片描述

2.2Spring Data Mongodb–数据库MongoDB

2.2.1创建Dao
public interface CmsPageRepository extends MongoRepository<CmsPage,String> {
}
2.2.2分页查询
//分页测试
@Test
public void testFindPage() {
int page = 0;//从0开始
int size = 10;//每页记录数
Pageable pageable = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(pageable);
System.out.println(all);
}

2.3:学成中多个查询条件的联合分页查询-MongoDb数据库

注意事项:在分页条件判断的时候,后面一定要加page =page-1 ;因为前端page的起始值为1,后端的默认起始值是0。所以这里需要进行一个转换
不然会出现下面的错误:
在这里插入图片描述
1.先建立条件值对象
2.确定条件匹配器
3.建立关联
4.进行查询

@Service
public class MediaFileService {
    @Autowired
    MediaFileRepository mediaFileRepository;

    //查询我的媒资列表
    public QueryResponseResult<MediaFile> findList(int page, int size, QueryMediaFileRequest queryMediaFileRequest) {
        if(queryMediaFileRequest==null){
            queryMediaFileRequest = new QueryMediaFileRequest();
        }
        //1.条件值对象
        MediaFile mediaFile = new MediaFile();

        if(StringUtils.isNotEmpty(queryMediaFileRequest.getTag())){
            mediaFile.setTag(queryMediaFileRequest.getTag());
        }
        if(StringUtils.isNotEmpty(queryMediaFileRequest.getFileOriginalName())){
            mediaFile.setFileOriginalName(queryMediaFileRequest.getFileOriginalName());
        }
        if(StringUtils.isNotEmpty(queryMediaFileRequest.getProcessStatus())){
            mediaFile.setProcessStatus(queryMediaFileRequest.getProcessStatus());
        }
        //2.条件匹配器
        ExampleMatcher exampleMatcher = ExampleMatcher.matching()
                .withMatcher("tag",ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("fileOriginalName",ExampleMatcher.GenericPropertyMatchers.contains());
                // .withMatcher("processStatus",ExampleMatcher.GenericPropertyMatchers.exact());//如果不设置匹配器默认精确匹配
        //3.定义example条件对象
        Example<MediaFile> example = Example.of(mediaFile, exampleMatcher);

        if(page<=0){
            page=1;
        }
         page = page-1;
        if(size<=0){
            size=10;
        }
        Pageable pageable = PageRequest.of(page,size);
        //4.分页查询
        Page<MediaFile> all = mediaFileRepository.findAll(example, pageable);
        //总记录数
        long total = all.getTotalElements();
        //数据列表
        List<MediaFile> content = all.getContent();
        //返回的数据集
        QueryResult<MediaFile> queryResult = new QueryResult<>();
        queryResult.setList(content);
        queryResult.setTotal(total);

        //返回结果
        QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
        return queryResponseResult;

    }

其中


@Data
public class QueryMediaFileRequest extends RequestData {

    private String fileOriginalName;
    private String processStatus;
    private String tag;
}

2.4 实习中的Springboot+ MyBatisPlus

参考文章,点击这里

配置

创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。

/**
 * @Auther: IT贱男
 * @Date: 2019/6/12 15:06
 * @Description: MybatisPlus配置类
 */
@Configuration
public class MyBatisPlusConfig {
 
    /**
     * 分页插件
     * @return
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

1.接口

Page<JmxCaseInfoEntity> getJmxCaseList(Integer pageNum, Integer pageSize, JmxCaseInfoEntity jmxCaseInfoEntity);

2.Service

 @Override
    public Page<JmxCaseInfoEntity> getJmxCaseList(Integer pageNum, Integer pageSize, JmxCaseInfoEntity jmxCaseInfoEntity) {
        Page<JmxCaseInfoEntity> page = new Page<>(pageNum, pageSize);
        List<JmxCaseInfoEntity> jmxInfoEntities = this.baseMapper.selectJmxCaseListPage(page, jmxCaseInfoEntity);
        return page.setRecords(jmxInfoEntities);
    }

3.Controller

public RestResult getJmxCaseList(Integer pageNum, Integer pageSize, JmxCaseInfoEntity jmxCaseInfoEntity) {
        return RestResult.fromData(jmxCaseService.getJmxCaseList(pageNum, pageSize, jmxCaseInfoEntity));
    }

4.对应的Mapper

@Mapper
public interface JmxCaseDao extends BaseMapper<JmxCaseInfoEntity> {
    /**
     * 分页查询jmx case 列表
     *
     * @param page
     * @param jmxCaseInfoEntity
     * @return
     */
    List<JmxCaseInfoEntity> selectJmxCaseListPage(@Param("page") Page<JmxCaseInfoEntity> page, @Param("jmxCaseInfoEntity") JmxCaseInfoEntity jmxCaseInfoEntity);
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值