java自定义分页工具(自定义分页工具类)

  1. 分页的工具类一直都不会写,没有理解里面几个属性的意思,趁这个时间看了一下别人写的分页工具类,然后自己也模仿写了一个分页的工具类,虽然有很多已经封装好了的分页工具,pagehelp什么的,但是如果不能用那个呢,还是要自己动手写一个分页工具类的。
    这里是原博主的链接
  2. 虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果手动实现分页效果又如何呢?
  3. (1)分页的思路
    首先我们得知道写分页代码时的思路,保持思路清晰,有步骤的进行,才能行云如水。先来看看分页的效果在这里插入图片描述
    这就是一个分页导航,其中能得到的数据有

totalRecord:总共员工数,数据库中总的记录数,这里有55条

totalPage:总页数,11页

pageSize:每页显示的记录数,这里可以看到每页显示5条

pageNum:当前页为第几页,比如图中就为第9页,因为9是没有超链接的,

start:总共能显示5页,让用户进行点击,7为起始页

end:11为能显示的尾页,也就是,如果用户点击第8页,那么start就为6,end就为10,每次都只有5页共点击查询。

每次能够得到对应页数所需要的5条数据,等等这些数据都要在jsp中显示出来,也就是说,每次都要从后台拿那么多数据过来进行显示,所以我们就想办法把这些数据封装在一个javabean当中,每次后台都将查询到的数据放入javabean对象中,我们只需要将该对象存入request作用域,然后在jsp页面中从域中获取需要的数据即可。
(2)创建PageBean存放数据
总共需要8个属性pageNum、pageSize、totalRecord、totalPage、startIndex、list、start、end,

pageNum、pageSize、totalRecord:通过构造方法就能得到。pageNum请求页面提交过来的参数,pageSize是自己设置的,totalRecord是查询数据库得到的
totalPage、startIndex、start、end是通过内部算法得出,
list需要通过查询数据库在通过set方式得到。

注意:该类使用泛型是为了不仅仅在这个项目中使用,在别的项目中也同样可以使用
PageBean.java 分页工具类

package com.onlinesearch.utils;
import java.util.List;

/**
 * 尝试写公共的分页工具
 * @author Mr.zhou
 */
public class PageBean<T> {

    // 已知数据
    private int pageNum; // 当前页的数据
    private int pageSize; // 每页显示的数据
    private int totalRecord; // 总的记录条数,通过查询数据得到

    // 需要计算的数据
    private int totalPage; // 总页数,通过pageSzie/totalRecord得到

    // 开始索引,也就是我们在数据库中要从第几行数据开始拿,有了startIndex和pageSize
    // 就知道了limit语句的两个数据,就能拿到每页能显示的数据了
    private int startIndex;

    // 将每页需要显示的数据放在list集合中
    private List<T> list;

    //分页显示的页数,比如页面显示的是1,2,3,4,5页,start就为1,end就为5,这个也是需要算过来的
    private int start;
    private int end;

    // 通过pageNum,pageSize,totalRecord可以获取totalRecord和startIndex
    // 通过构造方法初始化这些属性
    public PageBean(int pageNum, int pageSize, int totalRecord) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.totalRecord = totalRecord;

        // 计算totalPage总页数
        if (totalRecord/pageSize == 0) {
            // 如果整除了,正好每页显示pageSize条数据,
            this.totalPage = totalRecord/pageSize;
        }else {
            // 如果不整除,需要另外添加一页来显示多余的数据
            this.totalPage = totalRecord/pageSize + 1;
        }

        //计算开始索引 公式就是(第几页-1)* 每页需要显示的数据
        this.startIndex = (pageNum-1)*pageSize;

        this.start = 1;
        this.end = 5;

        // 显示页数的算法
        // 显示5页
        // 如果总页数小于5条
        if (totalPage <= 5) {
            // 那么end就是总页数的值了
            this.end = this.totalPage;
        }else {
            // 如果总页数大于5条,那么就要根据当前页来判断start和end为多少了
            this.start = pageNum -2;
            this.end = pageNum + 2;
            if (start < 0) {
                // 如果当前页是第一页,或者第二页,就不按照这个规则了
                this.start = 1;
                this.end = 5;
            }
            if (end > this.totalPage) {
                // 如果当前页是倒数第二页或者倒数第一页,同样页不按照这个规则了
                this.end = totalPage;
                this.start = end - 5;
            }
        }
    }

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

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

    public int getTotalRecord() {
        return totalRecord;
    }

    public void setTotalRecord(int totalRecord) {
        this.totalRecord = totalRecord;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

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

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

    public int getStart() {
        return start;
    }

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

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }
}

User.java 实体类

package com.onlinesearch.pojo;

import lombok.Data;

/**
 * @author Mr.zhou
 */
@Data
public class User {
    private String id;
    private String name;
    private String age;
    private String sex;
    private String idCard;
}

先写一个mapper接口
UserMapper.java

package com.onlinesearch.mapper;

import com.onlinesearch.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserMapper {

    /**
     * 获取全部用户
     * @return
     */
    List<User> findAllUser();

    /**
     * 分页获取用户数据
     * @param startIndex
     * @param pageSize
     * @return
     */
    List<User> findAll(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
}

UserMapper.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.onlinesearch.mapper.UserMapper">

        <resultMap id="UserResultEntity" type="com.onlinesearch.pojo.User">
            <result column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="age" property="age"/>
            <result column="sex" property="sex"/>
            <result column="idcard" property="idCard"/>
        </resultMap>

    <select id="findAll"  resultMap="UserResultEntity">
        select id,name,age,sex,idcard from tb_user limit #{startIndex},#{pageSize}
    </select>

    <select id="findAllUser" resultType="com.onlinesearch.pojo.User">
        select id,name,age,sex,idcard from tb_user
    </select>
</mapper>

UserService.java 接口

package com.onlinesearch.service;


import com.onlinesearch.utils.PageBean;
import com.onlinesearch.pojo.User;


/**
 * @author Mr.zhou
 */
public interface UserService {

    /**
     * 获取每页的用户数据
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageBean<User> findAllUserWithPage(int pageNum, int pageSize);
}

UserServiceImpl.java 实现类

package com.onlinesearch.service.impl;

import com.onlinesearch.utils.PageBean;
import com.onlinesearch.service.UserService;
import com.onlinesearch.pojo.User;
import com.onlinesearch.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * @author Mr.zhou
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired(required = false)
    private UserMapper userMapper;

    @Override
    public PageBean<User> findAllUserWithPage(int pageNum,int pageSize) {
        // 在这里就要将PageBean里面的数据创建好(初始化好)然后将对象返回回去
        // 先从数据库中获取所有用户的全部数量,获得totalRecord
        List<User> allUser = userMapper.findAllUser();
        int totalRecord = allUser.size();
        // 有了三个初始工具,就能够创建PageBean对象了
        PageBean<User> pageBean = new PageBean<>(pageNum,pageSize,totalRecord);
        // 获取PageBean对象中的startIndex (从数据库中的第几行开始拿)
        int startIndex = pageBean.getStartIndex();
        // 有了startIndex和pageSize,就可以拿到每页的数据了
        pageBean.setList(userMapper.findAll(startIndex,pageSize));
        return pageBean;
    }
}

UserController.java 控制层

package com.onlinesearch.controller;

import com.onlinesearch.utils.PageBean;
import com.onlinesearch.service.UserService;
import com.onlinesearch.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("test")
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/test")
    public PageBean<User> test() {
        // 第一个参数是前端传过来的,表示第几页,第二个参数表示每页显示几条数据也可以从前端传过来
        // 只需要三个参数就可以实现分页了,总数(后端获得),第几页(前端传过来),每页的数量(前端传过来,也可以写死)
        PageBean<User> allUserWithPage = userService.findAllUserWithPage(2,5);
        // 可以返回json,也可以返回视图,将数据放到request中都行
        return allUserWithPage;
    }
}

最后结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_46855885

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值