JAVA分页查询实现

1 通用分业数据存储类

实现两个通用的类,PageResult<T>用来封装查询结果,QueryObject用来为Mybatis(-plus)的SQL语句中LIMIT赋值,实现分页查询。

@Data
public class PageResult<T> {
    // 用户输入的两个参数
    private int currentPage; // 当前页码
    private int pageSize; // 每页显示的条数
    // 两条 SQL 语句执行的结果
    private int totalCount; // 总条数
    private List<T> data; // 当前页结果集数据
    // 三个程序计算的数据
    private int prevPage; // 上一页页码
    private int nextPage; // 下一页页码
    private int totalPage; // 总页数/末页页码
    // 分页数据通过下面构造器封装好
    public PageResult(int currentPage, int pageSize, int totalCount, List<T>
            data) {
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalCount = totalCount;
        this.data = data;
        // 计算三个数据的算法
        this.totalPage = totalCount % pageSize == 0 ? totalCount / pageSize :
                totalCount / pageSize + 1;
        this.prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
        this.nextPage = currentPage + 1 <= this.totalPage ? currentPage + 1 :
                this.totalPage;
    }
}

//当前的所有数据能按页面大小分几页,如果totalCount % pageSize能整除(如4 % 2)那就是分两页;不能整除那就加一再除,所以肯定有一种能整除

this.totalPage = totalCount % pageSize == 0 ? totalCount / pageSize :totalCount / pageSize + 1;

//前一页是否还存在
this.prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;

//后一页是否还存在
this.nextPage = currentPage + 1 <= this.totalPage ? currentPage + 1 :this.totalPage;

@Data
public class QueryObject {
    private int currentPage = 1; // 当前页码,要跳转到哪一页的页码
    private int pageSize = 3; // 每页显示条数
    private int start = 0; //SQL中LIMIT {start},{pageSize}

    public QueryObject(int currentPage,int pageSize){
       this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.start = (this.currentPage - 1) * pageSize;
    }

}

数据库中有四条测试数据:

 用LIMIT来模拟一下:

LIMIT 0,2 ==>从第一页开始【start = (currentPage - 1) * pageSize,start = 0,currentPage =1】,每业数据SIZE大小为2

 LIMIT 2,2 ==>跳转到第二页

 2 DAO 接口与Mapper文件实现

1)UserDao.java

跟分页查询相关的参数主要是这两个@Param("start") int start,@Param("pageSize") int pageSize,前面的其他参数是通用查询条件,可以不加。

@Mapper
public interface UserDao {

    ......

    /**
     * 分页查询
     * @return
     */
    List<SysUser> getUserListByPage(@Param("userName")String userName,@Param("phone")String phone,@Param("email")String email, @Param("start") int start,@Param("pageSize") int pageSize);
}

    ......
}

 2)UserMapper.xml

<where>就是其他参数的查询条件,LIMIT才是跟分页查询相关的,所以<where>部分跟DAO文件对应起来,可以一起加也可以一起不加。

<?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.lhc.lhcprojectdemo.dao.UserDao">

    ......

    <select id="getUserListByPage" resultType="com.lhc.lhcprojectdemo.util.entity.user.SysUser">
        SELECT user_name,nick_name,phone,email,status,create_time,update_time
        FROM sys_user
        <where>
            <if test="userName != null and userName != ''">
                user_name like concat('%', #{userName}, '%')
            </if>
            <if test="phone != null and phone != ''">
                AND
                phone like concat('%', #{phone}, '%')
            </if>
            <if test="email != null and email != ''">
                AND
                email like concat('%', #{email}, '%')
            </if>
        </where>
            LIMIT #{start}, #{pageSize}
    </select>

    ......
</mapper>

3 Service类

service类主要是接收control端传来的数据,调用model层去查询数据。

@Service
public class UserServiceImpl implements UserService {
        @Override
    public PageResult<SysUser> getUserListByPage(String userName,  String phone, String email,QueryObject qo){
        // 调用 DAO 查询数据数量
        int totalCount = userDao.getUserCount();
        // 为了性能加入判断,若查询的数据数量为 0,说明没有数据,返回返回空集合
        if(totalCount == 0){
            return new PageResult(qo.getCurrentPage(), qo.getPageSize(),
                    totalCount, Collections.emptyList());
        }
        // 执行到这里代表有数据,查询当前页的结果数据
        List<SysUser> users = userDao.getUserListByPage(userName,phone,email,qo.getStart(), qo.getPageSize());
        return new PageResult(qo.getCurrentPage(), qo.getPageSize(), totalCount, users);
    }
}

4 control层

control层简单实现一下,获取参数并处理。

@GetMapping("/list")
    @ResponseBody
    @PreAuthorize("hasAnyAuthority('user:list')")
    public String userList( @RequestParam(value = "query",required = false)String query, @RequestParam("pagenum") int pagenum,@RequestParam("pagesize") int pagesize){

        QueryObject qo = new QueryObject(pagenum,pagesize);

        //其他请求参数处理,偷个懒一个query解决
        String usernmae = "";
        String phone = "";
        String email = "";
        
        ......

        // 调用业务层方法来处理请求查询某一页数据
        PageResult<SysUser> pageResult = userService.getUserListByPage(usernmae,phone,email,qo);

        Map<String, Object> map = new HashMap<>(2);
        map.put("data",pageResult);
        map.put("meta", ResultUtil.ok().message("获取成功").status(200));
        return JSON.toJSONString(map);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值