分页查询的原理
假设这是一个数据表格,每一行都代表着一条数据,使用命令:
select * from table limit (起始条数,数据条数)
即可快速查找数据。
但是,对于前端来说,一般告诉你的都是页号,而不是数据的条数。
所以我们可以整理出一个思路:
将 页号,每一页的行数==起始位置,数据条数。
可以写出公式:起始位置=(页数-1)乘以页的大小
所有行数除以页的大小=共有几页 。
若得到页数乘以页的大小小于所有行数,则要再加1。
实现代码:
- 新建一个Pager辅助类,定义页号,每一页的条数大小,行数等等,以及编写其GET,SET方法,使其可读或可写。
package cn.edu.mju.project1.util;
import java.util.List;
public class Pager {
private int page = 1;//页号
private int pageSize = 10;//每一页记录的条数
private int rows;
private int pages;//不需要set方法(只读不写)
private boolean first;//不需要set方法
private boolean last;//不需要set方法
private int prev;//不需要set方法 代表上一页
private int next;//不需要set方法
private List<Object> data;
public Pager() {
}
public Pager(int page, int pageSize) {
setPage(page);
setPageSize(pageSize);
}
public int getPage() {
if(page>pages ){
page=pages;//不能超过总的页数
}
if(page < 1){
page = 1;//页数不能为0
}
return page;
}
public void setPage(int page) {
if(page <1){
page = 1;
}
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
if(pageSize < 1){
pageSize = 10;
}
this.pageSize = pageSize;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
if(rows >=0){
this.rows = rows;//行数大于等于0时方可赋值
}
}
public int getPages() {
pages = rows/pageSize;
if(pages * pageSize <rows){//所有行数除以页的大小=共有几页
pages = pages +1;//若得到页数*页的大小小于所有行数,则要再加1
}
if(pages < 1){
pages = 1;
}
return pages;
}
public boolean isFirst() {
if (page == 1) {
return true;
} else {
return false;
}
}
public boolean isLast() {
getPages();
if (page == pages) {
return true;
} else {
return false;
}
}
public int getPrev() {
prev = page - 1;
if(prev <1){
prev = 1;
}
return prev;
}
public int getNext() {
getPage();
next = page + 1;
if(next >pages){
next = pages;
}
return next;
}
public List<Object> getData() {
return data;
}
public void setData(List<Object> data) {
this.data = data;
}
}
2.新建TestPager测试类对其进行测试。
import cn.edu.mju.project1.util.Pager;
import org.junit.Test;
public class TestPager {
@Test
public void testPager(){
Pager pager =new Pager();
pager.setPage(10);
pager.setRows(11);
System.out.println("page="+pager.getPage());
System.out.println("pageSize="+pager.getPageSize());
System.out.println("pages="+pager.getPages());
System.out.println("prev="+pager.getPrev());
System.out.println("next="+pager.getNext());
System.out.println("first="+pager.isFirst());
System.out.println("last="+pager.isLast());
}
}
测试结果:
总的记录数为9条时,总页数为1页
总的记录数为11条时,总页数为2页
3.在BandDao中编写分页查询的代码
public Pager paginate(int page, int pageSize, Band band) {
Pager pager = new Pager(page,pageSize);
String sql = "SELECT COUNT(*) AS total FROM band";//查找总的记录数
StringBuilder where = new StringBuilder("WHERE 1=1");
List<Object> params = new ArrayList<>();
if(band != null){
if(band.getName()!=null&&!"".equals(band.getName())){
where.append("AND name LIKE ?");
params.add("%"+band.getName()+"%");
}
if(band.getRemark()!=null&&!"".equals(band.getRemark())){
where.append("AND remake LIKE ?");
params.add("%"+band.getRemark()+"%");
}
}
try{
Connection conn = MySqlDbUtil.getConnection();
PreparedStatement pst =conn.prepareStatement(sql+where.toString());
for(int i=0;i<params.size();i++){
pst.setObject(i+1,params.get(i));
}
ResultSet rs =pst.executeQuery();
if(rs.next()){
pager.setRows(rs.getInt("total"));
}
rs.close();
pst.close();
sql="SELECT * FROM band";
pst = conn.prepareStatement(sql+where.toString()+"LIMIT ?,?");
int index = 0;
for(int i=0;i<params.size();i++){
++ index ;
pst.setObject(i+1,params.get(i));
}
pst.setObject(++ index,(pager.getPage()-1)*pager.getPageSize());
pst.setInt(++index,pager.getPageSize());
rs =pst.executeQuery();
List<Object> data =new ArrayList<>();
while (rs.next()){
band = new Band();
band.setId(rs.getInt("id"));//取出ID的值将其放在Band对象中去
band.setName(rs.getString("name"));
band.setRemark(rs.getString("remark"));
data.add(band);//将对象放入列表对象中
}
pager.setData(data);
rs.close();
pst.close();
conn.close();//使用完,将其关闭,避免浪费资源
}catch (Exception e){
e.printStackTrace();
}
return pager;
}
}
最后再做个测试类对其进行测试即可。