我用的是JDBC然后自己手动编写SQL语句的方式实现分页查询,数据库用的是MS SQL。为了使用的方便,将分页查询的内容也放进去了,按理说是数据持久层的东西不应该放进来,所以更加合理的架构方式是把计算总页数的方法和分页查询的方法放到DAO层,在这里把这些方法删除就好了。删除完,无论什么数据库,用什么方式实现的分页查询,都能用这个工具类。
//分页查询工具类
public class PageQueryUtil<T>{
//要返回的某一页记录
private List<T> list;
//总记录数
private int allRow;
//总页数
private int totalPage;
//当前页
private int currentPage=1;
//每页大小
private int pageSize;
//是否是第一页
private boolean isFirstPage;
//是否是最后一页
private boolean isLastPage;
//是否有上一页
private boolean hasPreviousPage;
//是否有下一页
private boolean hasNextPage;
//初始化分页信息
public void init(){
//数据修正
if(currentPage<1)
{
this.currentPage = 1;
}
else if(currentPage>totalPage){
this.currentPage = totalPage;
}
else{
this.currentPage = currentPage;
}
this.isFirstPage = isFirstPage;
this.isLastPage = isLastPage;
this.hasPreviousPage = hasPreviousPage;
this.hasNextPage = hasNextPage;
//边界判定
judgePageBorder();
}
//计算总页数
public static int countTotalPage(final int pageSize,final int allRow)
{
retrun allRow%pageSize==0?allRow/pageSize:allRow/pageSize+1;
}
//计算当前页开始的记录位置
public static int countOffset(final int pageSize,final int currentPage)
{
final int offset = pageSize*(currentPage-1);
return offset;
}
//边界判定
public void judgePageBorder()
{
this.isFirstPage = (currentPage==1)?true:false;
this.isLastPage = (currentPage==totalPage)?true:false;
this.hasPreviousPage = (currentPage!=1)?true:false;
this.hasNextPage = (currentPage!=totalPage)?true:false;
}
//计算当前页
public static int countCurrentPage(int page)
{
final int curpage = (page == 0?1:page);
return curpage;
}
//传入SQL语句的方式获取总记录数
public static int getAllRowCount(String sql)
{
//获取数据库连接对象
Connection conn = JDBCConfig.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
int num = 0;
try
{
ps = conn.prepareStatement(sql);
ps.execute();
rs = ps.getResultSet();
rs.next();
num = rs.getInt(1);
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
JDBCConfig.release(rs.ps.conn);
}
return num;
}
//传入表名的方式获取总记录数
public static int getAllRowCountByTableName(String tableName)
{
//获取数据库连接对象
Connection conn = JDBCConfig.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT COUNT(1) FROM"+tableName;
int num = 0;
try
{
ps = conn.prepareStatement(sql);
ps.execute();
rs = ps.getResultSet();
rs.next();
num = rs.getInt(1);
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
JDBCConfig.release(rs.ps.conn);
}
return num;
}
//自动拼接SQL的方式进行分页查询
// t 查询结果对应的实体类类型对象
//pageIndex 查询的页数
//pageSize 每页的记录数
// queryScope 查询的范围,如果范围是一个表,直接填表名,如果范围是SQL语句,需要使用括号,并添加别名,
///别名不能是A,B 如(SELECT * FROM TABLE_TEST WHERE ID < 90000)C
public List<T> queryForPage(T t,int pageIndex,int pageSize,String queryScope)
{
//获取数据库连接对象
Connection conn = JDBCConfig.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT * "+
" FROM ("+
"SELECT ROW_NUMBER()OVER(ORDER BY TEMPCOLUMN)rownumber,*"+
" FROM (SELECT TOP ("+pageIndex*pageSize+") TEMPCOLUMN=0,* FROM "+queryScope+" ORDER BY ID)A)B"
" WHERE ROWNUMBER>"+(pageIndex-1)*pageSize;;
List<T> list = new Vector<>();
try
{
ps = conn.prepareStatement(sql);
ps.execute();
rs = ps.getResultSet();
//创建出一个对应的空泛型集合
//反射出类类型
Class c = t.getClass();
//获取该类所有字段,不问访问权限
Field[] fs = c.getDeclareFields();
//对结果集进行处理
while(rs.next()){
try{
//创建实例
t = (T)c.newInstance();
//赋值
//fs[i].getName()获得字段名
//f 获得字段信息
for(int i = 0;i<fs.length;i++){
Field f = t.getClass().getDeclareField(fs[i].getName());
//参数true,可以跨越访问权限进行操作
f.setAccessible(true);
//判断字段类型,进行赋值操作
//f.getType().getName():获得字段类型的名字
if(f.getType().getName().equals(long.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(int.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(String.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(BigDecimal.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(Timestamp.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
}
}catch(Exception e){
e.printStackTrace();
}
list.add(t);
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
JDBCConfig.release(rs.ps.conn);
return list;
}
}
//以直接下号的分页查询语句进行分页查询
//t 分页查询结果对应实体类对象
//sql 分页查询的SQL语句
public List<T> queryForPage(T t,String sql){
//获取数据库连接对象
Connection conn = JDBCConfig.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT COUNT(1) FROM"+tableName;
List<T> list = new Vector<>();
try
{
ps = conn.prepareStatement(sql);
ps.execute();
rs = ps.getResultSet();
//创建出一个对应的空泛型集合
//反射出类类型
Class c = t.getClass();
//获取该类所有字段,不问访问权限
Field[] fs = c.getDeclareFields();
//对结果集进行处理
while(rs.next()){
try{
//创建实例
t = (T)c.newInstance();
//赋值
//fs[i].getName()获得字段名
//f 获得字段信息
for(int i = 0;i<fs.length;i++){
Field f = t.getClass().getDeclareField(fs[i].getName());
//参数true,可以跨越访问权限进行操作
f.setAccessible(true);
//判断字段类型,进行赋值操作
//f.getType().getName():获得字段类型的名字
if(f.getType().getName().equals(long.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(int.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(String.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(BigDecimal.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
if(f.getType().getName().equals(Timestamp.class.getName())){
f.set(t,rs.getLong(fs[i].getName()));
}
}
}catch(Exception e){
e.printStackTrace();
}
list.add(t);
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
JDBCConfig.release(rs.ps.conn);
return list;
}
}
//还有一些getter setter toString 方法
}