web项目的分页

在web项目中,分页应用最普遍,简单记录一下我在实际项目中使用的分页思路;

1、RowBounds分页,这种分页不推荐使用,RowBounds在处理分页时,只是简单的把offset之前的数据都skip掉,超过limit之后的数据不取出,简单点说,就是先把数据全部查询到ResultSet,然后从ResultSet中取出offset和limit之间的数据,这 就实现了分页查询。Mysql中可以使用limit语句,但limit并不是标准SQL中的,如果是其它的数据库,则需要使用其它语句。

2、一般项目中使用mybatis逆向工程生成类和映射文件,所以可以使用Page工具类和自动生成 的..Example相结合,来完成页面的分页显示,多条件查询,多条件排序等。

3、还可以使用paperhelper分页插件进行分页查询,功能很强大。

4、排序在分页的中的应用。

//使用example.setOrderByClause("字段名1 ASC/DESC,字段名2 ASC/DESC,...");/**
     * 分页查询
     */
    @Override
    public PageInfo<Userinfo> findAllByPage(int currentPage, int pageSize) {

        UserinfoExample example = new UserinfoExample();
        String orderByClause = "uid asc,uname desc";
        example.setOrderByClause(orderByClause);
        PageHelper.startPage(currentPage, pageSize,orderByClause);
        List<Userinfo> list = userinfoMapper.selectByExample(example);
        PageInfo<Userinfo> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

//在paperhelper插件中可以使用PageHelper.startPage(currentPage, pageSize,orderByClause);
/**
     * 分页查询
     */
    @Override
    public PageInfo<Userinfo> findAllByPage(int currentPage, int pageSize) {

        String orderByClause = "uid asc,uname desc";
        PageHelper.startPage(currentPage, pageSize,orderByClause);
        List<Userinfo> list = userinfoMapper.selectByExample(null);
        PageInfo<Userinfo> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

5、使用Page工具类和逆向工程中的example实现分页。

  1)先创建Page类

public class Page {
    private int currentPageNo;  // 当前页码
    private int pageSize;        // 页面大小,即每页显示记录数
    private int count;          // 记录总数
    private int sumPage;         // 总页数
    List<Userinfo> userlist;    // 每页新闻集合    //计算总页数
    public int getSumPage() {
        return sumPage=count%pageSize==0?count/pageSize:count/pageSize+1;
    }

    //省去其他set/get方法
}

  2)给Example类添加参数,生成set/get方法

public class UserinfoExample {

    /**
     * 分页
     */
    private Integer currentPage;
    private Integer pageSize;
    public Integer getPageSize() {
        return pageSize;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
    public Integer getCurrentPage() {
        return currentPage;
    }
    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }
}

  3)修改mapper.xml中的selectByExample方法

//在if条件最后添加分页的判断
<if test="currentPage != null and pageSize !=null and pageSize !=0">
        limit #{currentPage},#{pageSize}
</if>

  4)service层的查询方法

/**
     * page 类  和example结合使用   * 传入当前页、页大小和对象,可以实现按条件查询   * 最后返回page对象到前台*/
    @Override
    public Page findAllByPageAndExample(int currentPage, int pageSize,Userinfo userinfo) {
        Page page = new Page();
        page.setCount(userinfoMapper.count());

        if(currentPage ==0 ) {
            currentPage = 1;
        }
        if(pageSize ==0) {
            pageSize = 10;
        }
        page.setCurrentPageNo(currentPage);
        page.setPageSize(pageSize);
        //处理当前页数大于总页数的问题
        if(currentPage > page.getSumPage()){
            currentPage = page.getSumPage();
            page.setCurrentPageNo(currentPage);
        }

        //处理当前页数小于第一页的问题
        if(currentPage < 0){
            currentPage = 1;
            page.setCurrentPageNo(currentPage);
        }

        //按条件查询
        UserinfoExample example = new UserinfoExample();
        Criteria ce = example.createCriteria();
        if(userinfo.getUname() != null && userinfo.getUname().trim().length()>0) {
            ce.andUnameLike("%"+userinfo.getUname()+"%");
        }

        example.setCurrentPage((page.getCurrentPageNo()-1)*pageSize);
        example.setPageSize(page.getPageSize());
        page.setUserlist(userinfoMapper.selectByExample(example));
        return page;
    }

  5)controller层的代码

/**
     * page 类  和example结合使用   * 我这里需要实现按条件查询和设置每页显示的页大小,所以页大小的值和按条件查询的对象信息都保存在session中   * 前台每次需要修改查询条件时,先异步请求到后台,将值set到session中,再发起请求获取数据。*/
    @RequestMapping("findAll")
    public String findAllByPageAndExample(Integer c,HttpServletRequest request,HttpSession session) {
        Userinfo userinfo = (Userinfo)session.getAttribute("userinfo");
        if(userinfo == null) {
            userinfo = new Userinfo();
        }
        int pageSize = (int) session.getAttribute("pageSize");
        Page page = userinfoServiceImpl.findAllByPageAndExample(c, pageSize,userinfo);
        request.setAttribute("page", page);
        request.setAttribute("userinfo", (Userinfo)session.getAttribute("userinfo"));
        return "index";
    }

6、paperhelper插件的使用(我创建的是maven项目)

  1)引入jar包 

<!-- 引入分页插件,paperhelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.6</version>
        </dependency>

  2)配置mybatis.xml文件(也可以选择在spring配置文件中配置,此处在mybatis.xml文件中配置)

<!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
            <property name="helperDialect" value="mysql"/>
            <!--  reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,
             pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 -->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>

  

  3)service层的描述

   同样可以传入对象,使用example实现按条件查询,paperhelper插件实现的很全,直接将PageInfo发给前台,PageInfo中就包含了分页查询的所有信息,在PageInfo中都可以拿到。

/**
     * 分页查询
     */
    @Override
    public PageInfo<Userinfo> findAllByPage(int currentPage, int pageSize) {

        UserinfoExample example = new UserinfoExample();
        String orderByClause = "uid asc,uname desc";
        example.setOrderByClause(orderByClause);
        PageHelper.startPage(currentPage, pageSize);
        List<Userinfo> list = userinfoMapper.selectByExample(example);
        PageInfo<Userinfo> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

  4)controller层

@RequestMapping("findAll")
    public String findAll(int currentPage,int pageSize ,HttpSession session,HttpServletRequest request) {

        PageInfo<Userinfo> pageInfo = userinfoServiceImpl.findAllByPage(currentPage, pageSize);
        request.setAttribute("pageInfo", pageInfo);
        return "index";
    }

7、PageInfo类的属性

public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
    //前一页
    private int prePage;
    //下一页
    private int nextPage;
    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;
    public PageInfo() {    }
    //省去其他方法
}

原文地址:https://www.cnblogs.com/newbest/p/9742492.html

时间: 2024-11-04 22:20:34

web项目的分页的相关文章

[多线程] Web 项目中,少有涉及到的一次多线程编程的经验

如今框架横行,Spring 已经是非常成熟的容器体系,我们在日常开发 JavaWeb 的工作中,大多已经不需要考虑多线程的问题,这些问题都已经在Spring容器中实现,框架的意义就是让程序员们可以专注于逻辑的实现.然而这种编程工作是非常无趣无味的,如果长期从事这个工作,技术不一定见长,业务知识一定很熟悉!= =但说实在的,我并不喜欢这类工作,因为这种工作大多情况下知识对代码的简单复制,或是简单的一些编写,并没有什么真正的创造性,不会给人成就感. 需求背景 我们的项目,是 Mysql+Elasti

一个简单的java web 项目

本文实现一个简单的 java web 项目,包括以下5个功能: 1. 登录 用户默认主页index.jsp , 可选择登录功能,输入用户名和密码,若登录成功,则进入产品管理总页面main.jsp.若不成功仍退回index.jsp 2. 注册 用户默认主页index.jsp ,  可选择注册功能 ,若注册,则进入 register.jsp 3. 管理产品(增加,删除,查看) 登录成功后,进入产品管理总页面main.jsp.第一次进入main.jsp,默认显示所有产品列表.在此页面上更实现 查询某个

搭建第一个web项目:实现用户的增删改查

好久没写这个web的代码了,再不写估计以前的也忘记的差不多了,赶紧复习下,顺便把自己的想法慢慢实现了. 最近在公司发现以前的项目有用easyUI搭建的.赶紧copy回来学习下. 感觉写日志真的很有必要,自己总结的肯定要比每次从网上查阅来的靠谱.每次搭建一个基本的web项目都都要查ssh的配置真的很忧伤啊,有木有!!! 把jar包的截图截了一下,要不总是记不清该用到的基本jar有啥. 其中Struts中用到的jar有:commons-fileupload.jar  commons-io.jar  

一个简单的网站web项目的详解

有不对的术语,或者不好理解的部分,欢迎大家批评指正,谢谢大家! 近期做的网站web项目,实现登录功能,查询功能.首先把这个项目分为几个模块来处理,当前用户模块,历史用户模块,历史记录模块,数据库模块,监听器模块.遵循了MVC设计模式. (1) 数据库模块:首先要做的是一个sql文件用来操纵mysql的数据库,一个init.jsp初始化的按钮并返回信息,一个类的方法执行init.sql的数据库操作,servlet用来处理jsp的请求,调用这个类的方法处理完成后返回jsp页面一个结果. 还要做一个数

Java web项目的解耦合

以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/oracle等等). 随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情,正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精. 大中型公司需要专业人才,小公司需要全才,但是对于个人职业发展来说,我建议是分开.你要是这辈子就吃java这碗饭,就不要去研究什么css,js等等. 把

ASP.NET MVC开发:Web项目开发必备知识点

最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行Asp.net MVC开发应该提前掌握多少程度的知识点才能畅通无阻进行开发? 下面是这次开发结束后做的一些知识点梳理总结,掌握如下知识点开发大型Asp.net MVC项目将不会有太大问题. 知识点总纲 代码规范 前段View 后端 1. 代码规范 好的规范可以让团队更加有效率! C#代码规范 使用St

java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl

在spring+hibernate的web项目中,处理数据层通常会使用Spring框架提供的HibernateTemplate类提供的方法.通常的用法是每一个实体类对应的去写DAO层的接口和实现类.每个实现类中都写hibernateTemp.save(entity).hibernateTemp.update(entity).hibernateTemp.get(id)...这样写固然没错,但存在着大量的重复代码.所以懒惰的程序员烦了,他们要写一个通用的实现类来解决这个问题,让DAO层解放出来.如果

IDEA下使用maven构建web项目(SpringMVC+Mybatis整合)

需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端UI应用或web应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始工程就存在冗余代码. 在本文中,我们将使用Java语言开发集成环境IntelliJ IDEA(其倡言是智能编码?),应用maven构建SpringMVC整合Mybatis+MySQL5.7(流行框架)的web项目:目的在于快速构建一个简洁纯净版的web应用工程,将其作为一个基础web-demo,以便

web项目总结——通过jsp+servlet实现对oracle的增删改查功能

1.DAO模式 分包:依次建立 entity:实体包,放的是跟oracle数据库中表结构相对应的对象的属性,也就是这个对象有什么 dao:增删改查接口,实现增删改查的具体方法 service:同dao,也是一个接口,一个接口的实现类,方法什么的都跟dao差不多 servlet:新建servlet类,继承HttpServlet类,一个方法建立一个servlet类,根据不同的方法选择使用doGet().doPost()方法 .services()既包含doGet 又包含doPost 新建jsp页面