通用分页(一)

通用分页核心思路:
将上一次查询请求再发一次,只是当前页变了而已。


首页 1 2 3 4 … 100 末页 跳转

MySQL分页:select * from 表 limit 3,3

 

每页显示记录数      自己设置
当前页          来自前端
总页数          总记录数%每页显示记录数==0?总记录数/每页显示记录数:总记录数/每页显示记录数+1
总记录数         数据库统计count()
每页起始记录数      =(当前页-1)*每页显示记录数+1

总共101条记录,每页显示10条
第一页: 1-10
第二页: 11-20
第三页: 21-30

每页结尾记录数      =当前页*每页显示记录数

1、通用的查询方法代码实现

导入jar包

连接数据库之前查看自己的用户名、密码、数据库名是否正确

isOracle:false
isSQLServer:false
isMysql:true
数据库连接(关闭)成功
#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_book?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=root

BookDao.java


package com.huangyucan.dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


import com.huangyucan.entity.Book;
import com.huangyucan.util.BaseDao;
import com.huangyucan.util.DBAccess;
import com.huangyucan.util.PageBean;
import com.huangyucan.util.StringUtils;


public class BookDao extends BaseDao<Book>{
/**
*
* @param book 封装jsp传递过来的查询参数
* @param pagebean 决定dao层的list调用时是否分页
* @return
* @throws SQLException
* @throws IllegalAccessException
* @throws InstantiationException
*/




public List<Book> list(Book book,PageBean pageBean) throws SQLException, InstantiationException, IllegalAccessException{
String sql="select *from t_mvc_book where true";
String bname=book.getBname();
if(StringUtils.isNotBlank(bname)) {
sql+="and bname like '%"+bname+"%'";
}
return super.executeQuery(sql, Book.class, pageBean);
}


public static void main(String[] args) {
BookDao bookDao=new BookDao();
Book book=new Book();
book.setBname("圣");
PageBean pageBean=new PageBean();
// pageBean.setPage(2);
// pageBean.setPagination(false);
try {
List<Book> list = bookDao.list(book, pageBean);
for (Book b : list) {
System.out.println(b);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

 

BaseDao.java


package com.huangyucan.util;


import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


import com.huangyucan.entity.Book;


public class BaseDao<T> {
/**
* 借鉴ajax的回调函数现象
* 在调用方去处理返回的结果集
* @author Administrator
*/

public List<T> executeQuery(String sql, Class clz,PageBean pageBean) throws SQLException, InstantiationException, IllegalAccessException{
Connection con = DBAccess.getConnection();
PreparedStatement pst = null;
ResultSet rs =null;

if(pageBean!=null&&pageBean.isPagination()) {
//需要分页
//算符合条件的总记录数
String countSql=getCountSql(sql);
pst=con.prepareStatement(countSql);
rs=pst.executeQuery();
if(rs.next()) {
pageBean.setTotal(rs.getLong(1)+"");
}

//算出符合条件的结果集
String pageSql=getPageSql(sql, pageBean);
pst=con.prepareStatement(pageSql);
rs=pst.executeQuery();


}
else {
pst=con.prepareStatement(sql);
rs=pst.executeQuery();
}
List<T> list=new ArrayList<>();
T t;
while(rs.next()) {
/**
* 1、实例化一个book对象(该对象为空)
* 2、取book的所有属性,然后给其赋值
* 2.1获取所有属性对象
* 2.2给属性对象赋值
* 3、赋完值的book对象装进list容器中
*/
t=(T) clz.newInstance();
Field[] fields=clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
field.set(t, rs.getObject(field.getName()));
}
list.add(t);
}
DBAccess.close(con, pst, rs);
return list;
}

/**
* 利用原生sql拼接出符合条件的结果集的查询sql
* @param sql
* @param pageBean
* @return
*/
private String getPageSql(String sql,PageBean pageBean) {
return sql + " limit "+ pageBean.getStartIndex() +"," + pageBean.getRows();
}

/**
* 获取符合条件的总记录数的sql语句
* @param sql
* @return
*/
private String getCountSql(String sql) {
return "select count(*) from ("+ sql +") t";
}
}

 

分页工具类

PageBase.java

package com.huangyucan.util;

/**
 * 分页工具类
 *
 */
public class PageBean {

    private int page = 1;// 页码

    private int rows = 10;// 页大小

    private int total = 0;// 总记录数

    private boolean pagination = true;// 是否分页

    public PageBean() {
        super();
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getTotal() {
        return total;
    }

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

    public void setTotal(String total) {
        this.total = Integer.parseInt(total);
    }

    public boolean isPagination() {
        return pagination;
    }

    public void setPagination(boolean pagination) {
        this.pagination = pagination;
    }

    /**
     * 获得起始记录的下标
     * 
     * @return
     */
    public int getStartIndex() {
        return (this.page - 1) * this.rows;
    }

    @Override
    public String toString() {
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    }

}
原文地址:https://www.cnblogs.com/bf6rc9qu/p/11057860.html