一个通用分页类

Posted xxbbtt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个通用分页类相关的知识,希望对你有一定的参考价值。

1、功能

  这个通用分页类实现的功能是输入页数(第几页)和每页的数目,就能获得相应的数据。

2、实现原理

  分页的实现通常分为两种,一种是先把数据全查询出来再分页,一种是需要多少查询多少,这里使用第二种,所以就需要先实现在dao层能够查询一定范围内的数据,这里就实现通过id作为键值,查询一定范围内的数据的功能

  dao层需要实现一个返回id在一个范围内的数据,那就在dao层的接口中添加一个这个方法:

    List<User> selectByRange(@Param("low") Integer low, @Param("high") Integer high);

  在mapper.xml中,添加相应的sql语句:

  <select id="selectByRange" resultMap="BaseResultMap">

    SELECT <include refid="Base_Column_List"/>
    FROM t_user
    WHERE id
    BETWEEN #{low,jdbcType=INTEGER}
    AND #{high,jdbcType=INTEGER}

  </select>

  然后在Service层的接口和类添加这样一个方法,这里实现了输入上下标返回一个User的List:

  public List<User> findByRange(int low, int high) {
    return userDao.selectByRange(Integer.valueOf(low), Integer.valueOf(high));
  }

  再然后是通用的分页类,这里的low和high,将在pagenumber当前页数或limit被修改时同时被修改:

public class pageEntity<T> {

    private List<T> list;           //对象记录结果集
    private int total;      // 总条数数
    private int limit;     // 每页显示条数
    private int pages;      // 总页数
    private int pageNumber; // 当前页
    private int low;        //需要获取数据的第一个id
    private int high;       //需要获取数据的最后一个id


    public int getLow() {
        return low;
    }

    public void setLow(int low) {
        this.low = low;
    }

    public int getHigh() {
        return high;
    }

    public void setHigh(int high) {
        this.high = high;
    }

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

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

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
        this.low = (this.pageNumber - 1) * this.limit;
        this.high = low + this.limit - 1;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public int getPageNumber() {
        return pageNumber;

    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
        this.low = (this.pageNumber - 1) * this.limit;
        this.high = low + this.limit - 1;
    }


}

  然后是测试类,其实这个测试类我是准备命名为manager类的,这样dao层实现基本的数据库操作,service层实现针对实体类的基本操作,然后manager类中实现前端的需求,然后api类,也就是jersey中就只需要调用manager中的方法即可,不过我还得在想想这样是否合理。。。

  总之先这样写着吧,test中将添加这样的方法及实现:

    public pageEntity<User> Paging(pageEntity<User> pageEntity) {
        pageEntity.setList(userService.findByRange(pageEntity.getLow(),pageEntity.getHigh()));
        return pageEntity;
    }

  然后就是api类中调用了:

@Path("hello")
public class JerseyTest {

    @GET
    @Produces("text/plain")
    @Path("page")
    public String getString(@QueryParam("page") int page, @QueryParam("limit") int limit) {
        ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
        TestAPI test = (TestAPI) context.getBean("test");

        pageEntity<User> pageEntity = new pageEntity<User>();
        pageEntity.setLimit(limit);
        pageEntity.setPageNumber(page);
        pageEntity = test.Paging(pageEntity);
        StringBuilder stringBuilder = new StringBuilder();
        for (User user : pageEntity.getList()) {
            stringBuilder.append(" ");
            stringBuilder.append(user.getUsername());
        }
        return stringBuilder.toString();
    }
}

 

3、实现效果:

  先看看数据库的数据吧:

  

  然后是浏览器中使用时的状态:

  

  

  

4、总结

  这里我实现了一个pageEntity类,这个类使用了泛型所以也支持其他类,目前实现的功能能够传入当前页和每页的数目,得到相应的数据,前端应该还需要我们返回,总的数据量,总共有多少页等等的数据,不过这都是额外的操作了,实现也挺简单的。通过在dao层添加方法,用sql语句计算出来,再给赋值就好了。

 

5、源代码

  源代码可以从这里获取:https://github.com/xbtshady/spring_mybatis

 

以上是关于一个通用分页类的主要内容,如果未能解决你的问题,请参考以下文章

常用的分页类

Django 自定义分页类

分页原理+分页代码+分页类制作

php之分页类代码

转载:分页原理+分页代码+分页类制作

php 分页原理+分页代码+分页类制作