zoukankan      html  css  js  c++  java
  • jdbc实现分页,需要前端传当前页码

    1.封装一个公共实体类用于返回:实体数据,当前页,总页数,总条数,每页多少条

    public class PageInfo<T> {
      
        //一页显示的记录数
        private int numPerPage=10; 
        //记录总数
        private int totalRows; 
        //总页数
        private int totalPages; 
        //当前页码
        private int currentPage; 
        
        private List<T> list;
        
        // 总数统计
        private T sumObj;
        
        
        
    	
    	public T getSumObj() {
    		return sumObj;
    	}
    	public void setSumObj(T sumObj) {
    		this.sumObj = sumObj;
    	}
    	public PageInfo() {     
            this.totalRows = 0;
            this.totalPages = 0;
            this.currentPage = 1;
        }
        public PageInfo(Integer currentPage, int totalRows) {
            if(currentPage==null)currentPage=1;
            setCurrentPage(currentPage);
            this.totalRows = totalRows;
        }
        public PageInfo(Integer currentPage){
            if(currentPage==null)currentPage=1;
            setCurrentPage(currentPage);
        }
        public int getCurrentPage() {
            return currentPage;
        } 
    
        public void setCurrentPage(int currentPage) {
            this.currentPage = currentPage <= 0 ? 1 : currentPage;
        }
    
        public int getNumPerPage() {
            return numPerPage;
        }
    
        public void setNumPerPage(int numPerPage) {
            this.numPerPage = numPerPage;
        }
    
        public int getTotalPages() {
            if (this.totalPages == 0) {
                this.totalPages = this.totalRows / this.numPerPage + (this.totalRows % this.numPerPage == 0 ? 0 : 1);
            }
            return this.totalPages;
        }
    
        public void setTotalPages(int totalPages) {
            this.totalPages = totalPages;
        }
        public int getTotalRows() {
            return totalRows;
        }
        public int getStartIndex() {
            return (currentPage - 1) * numPerPage;
        }
        
        public void setTotalRows(int totalRows) {
            this.totalRows = totalRows;
        }
    
       
        public void setList(List<T> list) {
            this.list = list;
        }
    
        public List<T> getList() {
            return list;
        }
        
       
    }
    

      2.思路:

    1)先计算总条数,每页条数可以固定,当前页数,总页数:

    select count(*)from (自己写的查询语句) a;//计算出总条数,然后通过总条数和每页条数计算出总页数,当前页是前端传递过来的。将计算出来的这些数据放入PageInfo<T>的页数相关字段中

    2)获取对应页数的T(实体类):

    通过mysql的limit字段:

    开始页数:

    public int getStartIndex() {
    return (currentPage - 1) * numPerPage;
    }

    条数:取每页条数。

    3)将T封装到PageInfo<T>的private List<T> list中;

    4)返回PageInfo<T>

    3.具体方法:

    public <T> PageInfo<T> getObjectsByPage(Class<T> cls,String sql,RowMapper<T> rowMapper,PageInfo<T> pageInfo,Object[] objects){
    if(null==pageInfo){
    pageInfo=new PageInfo<T>();
    }
    if(pageInfo.getTotalRows()<=0){
    //总条数
    Integer total= this.getCount(sql, objects);
    pageInfo.setSumObj(sumObj);
    //Integer total=getObjectCount(cls,sql, objects);
    pageInfo.setTotalRows(total);//总条数:sum子查询出来的
    //总页数
    Integer totalPages= (int) Math.ceil((double)total/(double)pageInfo.getNumPerPage());
    pageInfo.setTotalPages(totalPages);
    }
    List<T> list=getObjectList(cls,sql, objects, pageInfo, rowMapper);
    pageInfo.setList(list);
    return pageInfo; 
    }
    
    private Integer getCount(String sql,Object... objects){
    StringBuffer count=new StringBuffer("select ");
    String sqlStr=sql.toLowerCase();
    
    count.append(" count(*) id ");
    
    count.append(" from (");
    count.append(sqlStr);
    count.append(") temp_for_page_count");
    
    
    return getAccess(null).findInteger(count.toString(), objects);
    }
    
    private <T> List<T> getObjectList(Class<T> cls,String sql,Object[] objects,PageInfo<T> pageInfo,RowMapper<T> rowMapper){
    StringBuffer limit=new StringBuffer(sql);
    limit.append(" limit ").append(pageInfo.getStartIndex()).append(",").append(pageInfo.getNumPerPage());
    List<T> list=getAccess(cls).find(limit.toString(),rowMapper,objects);
    return list;
    
    }
    View Code

    jdbc查询语句:

     public <T> List<T> find(String sql, RowMapper<T> rowMapper, Object... params) {
            StopWatch watch = new StopWatch();
            try {
                return this.jdbcTemplate.query(sql, params, rowMapper);
            } finally {
                this.logger.debug(FIND_SQL_LOG, new Object[] { sql, params, Long.valueOf(watch.elapsedTime()) });
                if (watch.elapsedTime() > SLOW_SQL_TIME_LENGTH)
                    this.logger.warn(SLOW_SQL_LOG, new Object[] { sql, Long.valueOf(watch.elapsedTime()) });
            }
        }
    View Code
  • 相关阅读:
    Navicat Premium for Mac的破解教程
    master回滚关于protected报错
    一次fullgc问题分析总结
    redis实现分布式锁
    mysql中一次字符集和排序规则引起的sql查询报错
    springMvc框架实现
    swagger使用
    swagge源码分析
    for update在mysql中使用
    jq弹框确认
  • 原文地址:https://www.cnblogs.com/anlegou/p/9239927.html
Copyright © 2011-2022 走看看