page 分页工具

package utils;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 类此够
 * @Description 分页工具类,贼好用的分页工具类
 */
public class PageUtils implements Serializable {
    public static void main(String[] args) {
//        PageUtils p = new PageUtils();
//        p.setPageIndex(1); // 当前页
//        // p.setStart(0); // 起始条数
//        p.setLimit(10); // 每页条数
//        p.setParam("name", "xiaohei");
//        /*
//         * 只需要根据param查询总条数设置一下, 其他字段:例如共多少页,是否有下一页,是否有上一页,当前页多少条,字段自动会根据totalCount算出;
//         */
//        p.setTotalCount(20);
//
//        p.clearParam();
//        System.out.println(JSON.toJSONString(p));
    }

    private static final long   serialVersionUID = 1L;

    private int                 pageIndex;                                       // 当前页
    private int                 start;                                           // 起始条数
    private int                 limit;                                           // 每页显示条数
    private int                 totalCount;                                      // 总条数

    // 以下参数只能算, 不能有setXX方法---start
    // 根据param参数查询出totalCount, 计算设置
    private int                 totalPage;                                       // 总页数
    private int                 totalCountPageIndex;                             // 当前页有多少条
    private boolean             hasNextPage;                                     // 是否有下一夜
    private boolean             hasLastPage;                                     // 是否有上一夜
    // 以下参数只能算, 不能有setXX方法---end

    private String              sortName;                                        // 排序字段
    private String              sortOrder;                                       // 排序方式:(ASC/DESC)
    private Map<String, Object> queryParam       = new HashMap<String, Object>();
    private List<?>             data;

    public Map<String, Object> getParam() {
        // 校验部分参数合理性
        if ((this.start < 0) || (this.pageIndex <= 0) || (this.limit <= 0)) {// 参数错误, (为最首页准备)
            throw new RuntimeException("请检查入参 start / pageIndex / limit !");
        }
        
        // 如果既有start且start>0, 又有pageIndex, 则优先取start, 且不再做分页处理(已传start, 则本意就是指定查多少条)
        if (this.start == 0) {
            this.start = (this.pageIndex - 1) * this.limit;
        } else {
            queryParam.put("pageIndex", "-999"); // 已传start>0
        }
        
        queryParam.put("start", this.start);
        queryParam.put("limit", this.limit);
        queryParam.put("sortName", this.sortName);
        queryParam.put("sortOrder", this.sortOrder);
        return queryParam;
    }

    public int getTotalCount() {
        return totalCount;
    }

    /**
     * @author 类此够
     * @param
     * @return 
     * @description 
     * 设置总条数, 同时计算是否有上下页
     */
    public void setTotalCount(int totalCount) {
        if (totalCount == 0) {
            return;
        }

        if ((totalCount > 0) && (this.start >= totalCount)) {
            System.out.println("start: " + start + ", pageIndex: " + pageIndex + ", limit: " + limit + ", totalCount: " + totalCount);
            throw new RuntimeException("请检查入参!");
        }
        this.totalCount = totalCount;
        // 参数 有start且start>0, 则优先取start, 且不再做分页处理
        if ("-999".equals(queryParam.get("pageIndex"))) {
            queryParam.remove("pageIndex");
            return;
        }
        if (totalCount <= this.limit) { // 首页即总页
            this.pageIndex = 1;
            this.totalCountPageIndex = totalCount;
            return;
        }
        // 总页数
        this.totalPage = (totalCount % this.limit == 0) ? (totalCount / this.limit) : (totalCount / this.limit + 1);
        /* 根据起始条数,算出当前页; */
        this.pageIndex = (this.start == 0) ? pageIndex : (start / limit + 1);

        if (pageIndex == 1) {// 首页
            this.totalCountPageIndex = limit;
            this.hasNextPage = true;
        } else if ((pageIndex > 1) && (pageIndex == totalPage)) { // 末页
            this.totalCountPageIndex = (totalCount - (pageIndex - 1) * limit);
            this.hasLastPage = true;
        } else {// 中间页
            this.totalCountPageIndex = limit;
            this.hasLastPage = true;
            this.hasNextPage = true;
        }
    }

    public void setParam(Map<String, Object> param) {
        queryParam.putAll(param);
    }

    public void setParam(String key, Object value) {
        queryParam.put(key, value);
    }

    public void setParam(String key, String value) {
        queryParam.put(key, value);
    }

    public void removeParam(String key) {
        queryParam.remove(key);
    }

    public void clearParam() {
        queryParam.clear();
        sortName = null;
        sortOrder = null;
    }

    public PageUtils() {
        // 不设置页数和条数的话;默认显示第一页,每页10条数据,
        this.start = 0;
        this.pageIndex = 1;
        this.limit = 10;
    }

    public PageUtils(int pageIndex, int limit) {
        this.pageIndex = pageIndex;
        this.limit = limit;
    }

    public String getSortName() {
        return sortName;
    }

    public void setSortName(String sortName) {
        this.sortName = sortName;
    }

    public String getSortOrder() {
        return sortOrder;
    }

    public void setSortOrderASC() {
        this.sortOrder = "ASC";
    }

    public void setSortOrderDESC() {
        this.sortOrder = "DESC";
    }

    public List<?> getData() {
        return data;
    }

    public void setData(List<?> data) {
        this.data = data;
    }

    public int getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public int getTotalCountPageIndex() {
        return totalCountPageIndex;
    }

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

    public boolean getHasNextPage() {
        return hasNextPage;
    }

    public boolean getHasLastPage() {
        return hasLastPage;
    }
}
  • dao层的Mapper文件方法:
  • <?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.stu.dao.StuMapper">
        <resultMap id="BaseResultMap" type="com.stu.model.StuVo">
            <result column="id" jdbcType="INTEGER" property="id" />
            <result column="stu_id" jdbcType="VARCHAR" property="stuId" />
            <result column="name" jdbcType="VARCHAR" property="name" />
            <result column="sex" jdbcType="INTEGER" property="sex" />
            <result column="creat_time" jdbcType="TIMESTAMP" property="creatTime" />
            <result column="update_Time" jdbcType="VARCHAR" property="updateTime" />
            <result column="score" jdbcType="DECIMAL" property="score" />
        </resultMap>
    
        <insert id="insert" parameterType="com.stu.dto.StuDto">
            INSERT INTO stu
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="id != null">id,</if>
                <if test="stuId != null">stu_id,</if>
                <if test="name != null">name,</if>
                <if test="sex != null">sex,</if>
                <if test="creatTime != null">creat_time,</if>
                <if test="updateTime != null">update_Time,</if>
                <if test="score != null">score,</if>
            </trim>
            VALUES
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="id != null">#{id},</if>
                <if test="stuId != null">#{stuId},</if>
                <if test="name != null">#{name},</if>
                <if test="sex != null">#{sex},</if>
                <if test="creatTime != null">#{creatTime},</if>
                <if test="updateTime != null">#{updateTime},</if>
                <if test="score != null">#{score},</if>
            </trim>
        </insert>
    
        <delete id="deleteById">
            DELETE FROM stu WHERE
            id = #{id}
        </delete>
    
        <update id="update" parameterType="com.stu.dto.StuDto">
            UPDATE stu SET
            <trim prefixOverrides=",">
                <if test="stuId != null">,stu_id=#{stuId}</if>
                <if test="name != null">,name=#{name}</if>
                <if test="sex != null">,sex=#{sex}</if>
                <if test="creatTime != null">,creat_time=#{creatTime}</if>
                <if test="updateTime != null">,update_Time=#{updateTime}</if>
                <if test="score != null">,score=#{score}</if>
            </trim>
            WHERE id = #{id}
        </update>
    
        <select id="queryById" resultMap="BaseResultMap">
            SELECT
            id, stu_id, name, sex, creat_time, update_Time, score
            FROM stu
            WHERE id = #{id}
        </select>
    
        <select id="queryListCount" parameterType="java.util.Map" resultType="Integer">
            SELECT COUNT(1) FROM stu
            <include refid="Base_Where_Clause" />
        </select>
    
        <select id="queryList" parameterType="java.util.Map" resultMap="BaseResultMap">
            SELECT
            id, stu_id, name, sex, creat_time, update_Time, score
            FROM stu
            <include refid="Base_Where_Clause" />
            <if test="sortName != null and sortName !=''">
                ORDER BY ${sortName}
                <if test="sortOrder != null and sortOrder !=''">
                    ${sortOrder}
                </if>
            </if>
            <if test="start != null and limit != null and limit !=0">
                LIMIT #{start}, #{limit}
            </if>
        </select>
    
        <sql id="Base_Where_Clause">
            <where>
                <trim prefixOverrides="and">
                    <if test="id != null and id != ''"> AND id = #{id}</if>
                    <if test="stuId != null and stuId != ''"> AND stu_id = #{stuId}</if>
                    <if test="name != null and name != ''"> AND name = #{name}</if>
                    <if test="sex != null and sex != ''"> AND sex = #{sex}</if>
                    <if test="creatTime != null and creatTime != ''"> AND creat_time = #{creatTime}</if>
                    <if test="updateTime != null and updateTime != ''"> AND update_Time = #{updateTime}</if>
                    <if test="score != null and score != ''"> AND score = #{score}</if>
                </trim>
            </where>
        </sql>
    </mapper>
    • Dao接口
      package com.stu.dao;
      
      import java.util.List;
      import java.util.Map;
      
      import org.apache.ibatis.annotations.Param;
      
      import com.stu.dto.StuDto;
      import com.stu.model.StuVo;
      
      public interface StuMapper {
          // 插入
          int insert(StuDto dto);
      
          // 删除
          int deleteById(@Param("id") String id);
      
          // 更新
          int update(StuDto dto);
      
          // 查询单条
          StuVo queryById(@Param("id") String id);
      
          // 查询条数
          int queryListCount(Map<String, Object> param);
      
          // 查询集合
          List<StuVo> queryList(Map<String, Object> param);
      }
      • 实体类(入参/反参)对象
      • package com.stu.model;
        
        import java.io.Serializable;
        import java.sql.Timestamp;
        
        public class StuVo implements Serializable {
            private static final long    serialVersionUID    = 1L;
        
            private String                id;                            // 
            private String                stuId;                        // 学生号
            private String                name;                        // 姓名
            private String                sex;                        // 性别(1男,2女)
            private Timestamp            creatTime;                    // 创建时间
            private String                updateTime;                    // 修改时间
            private Long                score;                        // 
        
            public void setId(String id) {
                this.id = id;
            }
        
            public String getId() {
                return id;
            }
        
            public void setStuId(String stuId) {
                this.stuId = stuId;
            }
        
            public String getStuId() {
                return stuId;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public String getName() {
                return name;
            }
        
            public void setSex(String sex) {
                this.sex = sex;
            }
        
            public String getSex() {
                return sex;
            }
        
            public void setCreatTime(Timestamp creatTime) {
                this.creatTime = creatTime;
            }
        
            public Timestamp getCreatTime() {
                return creatTime;
            }
        
            public void setUpdateTime(String updateTime) {
                this.updateTime = updateTime;
            }
        
            public String getUpdateTime() {
                return updateTime;
            }
        
            public void setScore(Long score) {
                this.score = score;
            }
        
            public Long getScore() {
                return score;
            }
        
        }
        package com.stu.dto;
        
        import java.io.Serializable;
        
        public class StuDto implements Serializable {
            private static final long    serialVersionUID    = 1L;
        
            private String                id;                            // 
            private String                stuId;                        // 学生号
            private String                name;                        // 姓名
            private String                sex;                        // 性别(1男,2女)
            private String                creatTime;                    // 创建时间
            private String                updateTime;                    // 修改时间
            private String                score;                        // 
        
            public void setId(String id) {
                this.id = id;
            }
        
            public String getId() {
                return id;
            }
        
            public void setStuId(String stuId) {
                this.stuId = stuId;
            }
        
            public String getStuId() {
                return stuId;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public String getName() {
                return name;
            }
        
            public void setSex(String sex) {
                this.sex = sex;
            }
        
            public String getSex() {
                return sex;
            }
        
            public void setCreatTime(String creatTime) {
                this.creatTime = creatTime;
            }
        
            public String getCreatTime() {
                return creatTime;
            }
        
            public void setUpdateTime(String updateTime) {
                this.updateTime = updateTime;
            }
        
            public String getUpdateTime() {
                return updateTime;
            }
        
            public void setScore(String score) {
                this.score = score;
            }
        
            public String getScore() {
                return score;
            }
        
        }
        package zweb.service;
        
        import java.util.List;
        import java.util.Map;
        
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;
        
        import com.stu.dao.StuMapper;
        import com.stu.model.StuVo;
        
        import utils.PageUtils;
        
        @Service
        public class StuService {
        
            @Autowired
            private StuMapper stuMapper;
        
            public PageUtils queryList(PageUtils p) {
                Map<String, Object> param = p.getParam();
                int total = stuMapper.queryListCount(param);
                if (total != 0) {
                    p.setTotalCount(total);
                    List<StuVo> dataList = stuMapper.queryList(param);
                    p.setData(dataList);
                }
                p.clearParam();
                return p;
            }
        }
            /**
             * @author 类此够
             * 获取列表
             */
            @ResponseBody
            @RequestMapping("/getStuList")
            public JSONObject getStuList(HttpServletRequest request, HttpServletResponse response) {
                JSONObject ret = new JSONObject();
                ret.put("success", true);
                ret.put("errorCode", 200);
                ret.put("errorMsg", "");
                PageUtils page = new PageUtils();
        
                try {
                    if (StringUtils.isNotEmpty(request.getParameter("pageIndex"))) {
                        page.setPageIndex(Integer.parseInt(request.getParameter("pageIndex")));
                    }
                    if (StringUtils.isNotEmpty(request.getParameter("limit"))) {
                        page.setLimit(Integer.parseInt(request.getParameter("limit")));
                    }
                    page = stuService.queryList(page);
                    ret.put("data", page);
                } catch (Exception e) {
                    ret.put("success", false);
                    ret.put("errorCode", 500);
                    ret.put("errorMsg", "服务器异常,请联系管理员!");
                    e.printStackTrace();
                } finally {
                    return ret;
                }
        
            }

        主要关注点:
        1。controller层的request入参
        2。service层调用dao时候先查条数,
        |----条数为0直接返回!!
        |----条数不为0,设置页数总条数(此时PageUtils会自动计算:是否有上/下一页、总页数、当前页条数等),并继续查询集合返回分页对象出去(注意清空查询参数)
        ————————————————
        版权声明:本文为CSDN博主「昵称同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        原文链接:https://blog.csdn.net/qq_37001743/article/details/122000333

posted @ 2023-05-25 08:49  chen1777  阅读(27)  评论(0)    收藏  举报