【Java】【33】分页处理

前言:

数据量太大时,前端就需要做翻页显示了,即点击第几页就拉取第几页的数据

正文:

1,在xml中写查询语句

Service层

注:用了rowBounds其实就是假分页了,会把数据查到内存里来,再去对应的数据集合给到前端。真分页的话,数据库查询XML里Oracle和MySQL写法不同,要注意

@Autowired TheDao theDao;

public PageModel<UserVo> getClerkListByBlur(QueryVo query) {
    RowBounds rowBounds = new RowBounds((query.getPage() - 1) * query.getRows(), query.getRows());
    int total = this.theDao.getCount(query);

    PageModel<UserVo> pageModel = new PageModel<UserVo>();
    pageModel.setPageNo(query.getPage());
    pageModel.setPageSize(query.getRows());
    pageModel.setTotalRecords(total);

    List<UserVo> list = this.theDao.getList(query, rowBounds); //rowBounds
    pageModel.setList(list);

    return pageModel;
}

Dao层

int getCount(QueryVo info);

List<UserVo> getList(QueryVo info, RowBounds rowBounds);

数据库查询XML

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bf.dnh.dao.ClerkDao" >
    <resultMap id="UserVoMap" type="com.bf.xx.params.base.UserVo" >
        <id column="Id" property="id" jdbcType="VARCHAR" />     
        <result column="Name" property="name" jdbcType="VARCHAR" />
        <result column="Province" property="province" jdbcType="VARCHAR" />
        <result column="City" property="city" jdbcType="VARCHAR" />
        <result column="Gender" property="gender" jdbcType="SMALLINT" />
        <result column="Create_Time" property="createTime" jdbcType="TIMESTAMP" />
    </resultMap>

    <select id="getCount" resultType="int">
        select count(1) from (
          <include refid="sql_getList" />
        ) T
    </select>

    <select id="getList" resultMap="UserVoMap">
        <include refid="sql_getList" />
        ORDER BY T.CREATE_TIME DESC
    </select>

    -- mysql 真分页写法
    <select id="getTestList" resultMap="UserVoMap">
        SELECT T.* 
        FROM USER T
        ORDER BY T.NAME DESC
        <if test="page != 0">
            LIMIT #{start}, #{rows}
        </if>
    </select>

    <sql id="sql_getList">
        SELECT T.*
          FROM USER T
         WHERE T.STATUS = 1
        <if test="keyword != null and keyword != ''">
           AND T.NAME LIKE '%${keyword}%'
        </if>
    </sql>

</mapper>

2,mybatis的映射查询

Service层

@Autowired TheMapper theMapper;

public PageModel<UserVo> getClerkListByBlur(QueryVo query) {
    Example example = new Example(QueryVo.class);
    example.createCriteria()
        .andEqualTo("status", 1)
        .andLike("name", query.getKeyword());

    PageModel<UserVo> pageModel = new PageModel<UserVo>();
    pageModel.setPageNo(query.getPage());
    pageModel.setPageSize(query.getRows());

    int total = this.theMapper.selectCountByExample(query);
    pageModel.setTotalRecords(total);

    RowBounds rowBounds = new RowBounds((query.getPage() - 1) * query.getRows(), query.getRows());
    List<UserVo> list = this.theMapper.selectByExampleAndRowBounds(example, rowBounds);
    pageModel.setList(list);

    return pageModel;
}

Dao层

import com.bf.base.entity.QueryVo;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

@Repository
public interface TheMapper extends Mapper<QueryVo> {
}

3,基础类

QueryVo类

public class QueryVo {
    private int page; //页数

    private int rows; //每页显示条数

    private String keyword;

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }
}

-- 真分页的话,需要增加一个参数start,开始条数

private int start; //由page*rows计算得来

public int getStart() {
    start = (page - 1) * rows;
    return start;
}

public void setStart(int start) {
    this.start = start;
}

PageModel类

package com.bf.base.params;

import java.util.List;

/**
 * 封装分页信息
 *
 */
public class PageModel<E> {

    //结果集
    private List<E> list;

    //查询记录数
    private int totalRecords;

    //每页多少条数据
    private int pageSize;

    //第几页
    private int pageNo;

    @Override
    public String toString() {
        return "PageModel [list=" + list + ", totalRecords=" + totalRecords + ", pageSize=" + pageSize + ", pageNo="
                + pageNo + "]";
    }

    /**
     * 总页数
     * @return
     */
    public int getTotalPages() {
        return (totalRecords + pageSize - 1) / pageSize;
    }

    /**
     * 取得首页
     * @return
     */
    public int getTopPageNo() {
        return 1;
    }

    /**
     * 上一页
     * @return
     */
    public int getPreviousPageNo() {
        if (pageNo <= 1) {
            return 1;
        }
        return pageNo - 1;
    }

    /**
     * 下一页
     * @return
     */
    public int getNextPageNo() {
        if (pageNo >= getBottomPageNo()) {
            return getBottomPageNo();
        }
        return pageNo + 1;
    }

    /**
     * 取得尾页
     * @return
     */
    public int getBottomPageNo() {
        return getTotalPages();
    }

    public List<E> getList() {
        return list;
    }

    public void setList(List<E> list) {
        this.list = list;
    }

    public int getTotalRecords() {
        return totalRecords;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }
}
原文地址:https://www.cnblogs.com/huashengweilong/p/11122753.html