通用分页(一)
通用分页核心思路:
将上一次查询请求再发一次,只是当前页变了而已。
首页 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 + "]"; } }