MySql的数据库分页
在MySQL中,如果是用limit 分页的要从0开始
例如 limit 0,9
是调用的前10条记录
数据库后台分页工具类
接口
package com.foreknow.util;
import java.util.List;
import com.foreknow.mapping.EntityMapping;
/**
* 1.计算总记录数
* 2.计算总页数
* 3.查询某一个区间段的记录
* @author Administrator
*
*/
public interface Pagination {
//判断当前所分的页是否为第一页
public boolean isFirst();
//判断当前所分的页是否为最后一页
public boolean isLast();
//判断是否还有下一页
public boolean hasNext();
//判断是否还有上一页
public boolean hasPrevious();
//返回当前要分页的总记录数
public int getMaxElements();
//返回总页数
public int getMaxPages();
//获得下一页的页码
public int getNext();
//返回上一页的页码
public int getPrevious();
//返回分页的大小,每页有多少条记录
public int getPageSize();
//返回当前页的页码
public int getPageNumber();
//返回当前页所包含的记录
public List getList(EntityMapping mapping);
//设定分页大小
public void setPageSize(int pageSize);
//设定当前要显示页面的页码
public void setPageNumber(int pageNumber);
}
实现类
package com.foreknow.util;
import java.sql.Connection;
import java.util.List;
import java.util.regex.Pattern;
import com.foreknow.db.DBManager;
import com.foreknow.db.JdbcTemplate;
import com.foreknow.mapping.EntityMapping;
import com.foreknow.mapping.MappingFactory;
public class MysqlPagination implements Pagination {
// 分页大小
private int pageSize = 5;
// 当前要显示的页码
private int pageNumber = 1;
// 最大页码
private int maxPages;
// 最大记录数
private int maxElements;
//准备的sql语句
private String sql;
private DBManager db;
private JdbcTemplate jtm;
private Connection conn;
// private EntityMapping mapping;
//构造器 参数为sql语句
public MysqlPagination(String sql) {
this.sql = sql;
init();
}
//构造器 参数为sql语句,分页大小,当前要显示的页码
public MysqlPagination(String sql, int pageSize, int pageNumber) {
this.sql = sql;
this.pageSize = pageSize;
this.pageNumber = pageNumber;
init();
this.setPageNumber(pageNumber);
}
private void init() {
//获取数据库连接
db = DBManager.getInstance();
conn = db.getConnection();
//通过单例获得JdbcTemplate对象
jtm = JdbcTemplate.getInstance();
//设立连接
jtm.setConnection(conn);
// 获得最大的记录数的方法
setMaxElements();
setMaxPages();
}
// 获得最大的记录数
private void setMaxElements() {
// select * from xxx order by desc
// select count(1) from xxx order by desc
String regex = "select((.)+)from";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
String[] s = p.split(this.sql);
String newSql = "select count(1) as total from " + s[1];
this.maxElements = jtm.query(newSql);
}
// 总页数,不足2页也算2页
// 最大记录数/分页大小
private void setMaxPages() {
if (maxElements != 0 && (maxElements % pageSize == 0)) {
maxPages = maxElements / pageSize;
} else {
maxPages = maxElements / pageSize + 1;
}
}
/**
* 在原有的sql基础上利用rownum通过子查询返回一个区间内的结果集 source 原有的sql begin 结果集开始点 end 结果集结束点
select * from table limit (start-1)*limit,limit;
*/
private String sqlModify(String source, int begin, int end) {
StringBuffer target = new StringBuffer(200);
target.append("select t.* from (");
target.append(sql); //类的属性 sql
target.append(") t");
target.append(" limit ");
target.append(begin+",");
target.append(end);
return target.toString();
}
// ***********根据页码查找片断记录的起始索引***************start
private int getBeginElement() {
//limit 0,10 limit 10,10 limit 20,10
// 0~9 10~19 20~29 每页显示10条数据
return (pageNumber - 1) * pageSize;
}
private int getEndElement() {
int endElement = pageSize;
if (endElement >= maxElements) {
return maxElements;
} else {
return endElement;
}
}
// ***********根据页码查找片断记录的起始索引***************end
public List getList(EntityMapping mapping) {
// 计算list的起始索引
String newSql = this.sqlModify(this.sql, this.getBeginElement(), this
.getEndElement());
return (List) jtm.query(newSql, mapping);
}
// public List getList(EntityMapping mapping) {
// // mapping =
// MappingFactory.getInstance().getMapping(MappingFactory.ADMIN_MAPPING);
// // 计算list的起始索引
// String newSql = this.sqlModify(this.sql, this.getBeginElement(), this
// .getEndElement());
// return (List) jtm.query(newSql, mapping);
// }
public int getMaxElements() {
// TODO Auto-generated method stub
return maxElements;
}
public int getMaxPages() {
return maxPages;
}
// 返回下一页,如果当页就是最后一页,返回这页的数字
public int getNext() {
if (pageNumber + 1 >= this.getMaxPages()) {
return getMaxPages();
}
return pageNumber + 1;
}
public int getPageNumber() {
return pageNumber;
}
public int getPageSize() {
return pageSize;
}
//如果页码-1就小于等于1,证明这是第一页,以前不能再减到0页了。
public int getPrevious() {
if (pageNumber - 1 <= 1) {
return 1;
} else {
return pageNumber - 1;
}
}
//如果当前页数比最大页码小,则证明还有下一页。
public boolean hasNext() {
return pageNumber < this.getMaxPages();
}
//如果当前页数比最小页码大,则证明还有前一页。
public boolean hasPrevious() {
return pageNumber > 1;
}
//如果当前页码等于1,则证明这页是第一页。
public boolean isFirst() {
return pageNumber == 1;
}
//如果当前页码大于等于最大页码,则证明这页是最后一页。
public boolean isLast() {
return pageNumber >= this.getMaxPages();
}
//设置当前页,如果传入的页码大于最大页码,那么显示最大页码的那一页数据,
//如果传入的页码小于1,那么显示第一页的数据。如果不是二者,那么传入要求页码的数据。
public void setPageNumber(int pageNumber) {
if (pageNumber > maxPages) {
this.pageNumber = maxPages;
} else if (pageNumber < 1) {
this.pageNumber = 1;
} else {
this.pageNumber = pageNumber;
}
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public static void main(String[] args) {
Pagination pagination = new MysqlPagination("select * from guestbook", 5, 5);
System.out.println(pagination.getMaxElements());//计算总的记录数
System.out.println(pagination.getMaxPages());//计算总页数
MappingFactory mFactory = MappingFactory.getInstance();
EntityMapping mapping = mFactory.getMap(MappingFactory.GUESTBOOK_MAPPING);
List list = pagination.getList(mapping);//计算区间记录
System.out.println(list.size());
}
}