通用分页案例
实现效果
我只做了显示数据的通用分页效果:
需要的jar包、工具类
jar包需要c标签包,MySQL包(用的啥数据库导什么包):
工具类(util),按顺序(连接数据库类、字符编码过滤类、做通用分页的类、连接数据库的配置文件):
解析项目代码
我们以前做分页每做一个对象的分页就要在这个对象的dao包中写很多关于分页的代码,为了增加代码的重用性,我们可以将相同内容的代码写一个工具类,增加写代码的效率,我们分为两步,查询满足条件的SQL语句(需要做分页,默认为true),查询满足条件指定页码的SQL语句(拼接根据页码查询的SQL语句),如图:
package com.zengjing.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.zengjing.entity.Recruitment;
import com.zengjing.util.DBAccess;
import com.zengjing.util.PageBean;
/**
* 用来做通用分页、相同内容
* @author jiang
*
* date 下午3:25:39
*/
public class BaseDao<k> {
//匿名内部类
public interface CallBack<k>{
public List<k> foreach(ResultSet rs) throws SQLException;
}
public List<k> executeQuery(String sql,PageBean pageBean ,CallBack<k> callback){
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
if(pageBean!=null&&pageBean.isPagination()) {
//1、查询满足条件的总记录数
try {
con=DBAccess.getConnection();
String countSql=this.getCountSql(sql);
System.out.println(countSql);
ps=con.prepareStatement(countSql);
rs=ps.executeQuery();
if(rs.next()) {
int total=rs.getInt(1);//总记录数
pageBean.setTotal(total);//给pagebean的总记录数赋值
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
DBAccess.close(null, ps, rs);
}
}
//第二个条件 查询指定页码并满足条件的总记录数
try {
if(con==null) {
con=DBAccess.getConnection();
}
String pageSql=sql;
if(pageBean!=null&&pageBean.isPagination()) {
pageSql=this.getPageBean(sql, pageBean);
}
System.out.println(pageSql);
ps=con.prepareStatement(pageSql);
rs=ps.executeQuery();
return callback.foreach(rs);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
DBAccess.close(con, ps, rs);
}
}
/**
* 专门写一个方法用来拼接查询语句的统计满足条件的总行数
* @param sql
* @return
*/
public String getCountSql(String sql) {
return "select count(*) from ("+sql+") t1 ";
}
/**
* 专门写一个方法用来存储拼接分页的sql
* @param sql
* @param pageBnea
* @return
*/
public String getPageBean(String sql,PageBean pageBnea) {
System.out.println(pageBnea.getPage());
return sql+" limit "+pageBnea.getStartsIndex()+","+pageBnea.getRows()+"";
}
}
dao方法中查询请求直接返回调用通用分页类的方法,传递这个对象的baseDao和SQL语句,还有实现的匿名内部类:
package com.zengjing.dao;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;