通用分页1

通用分页01

  • 通用分页
  • 总结

解析:通用分页就是就是把分页方法的共同代码封装起来,利用泛型去传递类对象,然后利用反射获取对象属性给对象属性赋值,这样在之后的项目中就可以直接用了,节省代码,更加方便。

通用分页

最后效果
通用分页1_第1张图片
1、连接数据库,最基本的操作这里就不细讲了(调用分页我用的mysql的数据库)
导jar包
后面jsp界面会用到的标签jar包
连接mysql数据库的jar包
通用分页1_第2张图片
2、定义工具类pageBean,来控制是否分页,页数,每页数量
里面需要
属性
page 页码
rows 页大小
total 总记录数(这个是从数据库中统计)
方法
pageBean的初始化方法
上一页的方法
下一页的方法
get,set方法
获得起始记录的下标的方法
获取最大页数的方法

/**
 * 分页工具类
 */
public class PageBean {

	private int page = 1;// 页码
	private int rows = 10;// 页大小
	private int total = 0;// 总记录数,从数据库中统计的
	
	private boolean pagination = true;// 是否分页 默认分页

	private String url;
	private Map<String, String[]> ParameterMap = new HashMap<String, String[]>();
	 
	
	
	
	
	//专门写一个方法,做pageBean的初始化
    public void setRequest(HttpServletRequest request) {
    	System.out.println("pagebean初始化");
		String page= request.getParameter("page");
		String rows= request.getParameter("rows");
		String pagination = request.getParameter("pagination");
		
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		
		this.url=request.getContextPath()+request.getServletPath();
		 
		this.ParameterMap =request.getParameterMap();
		 
	 }
    
    //上一页
	public int getPreviousPage() {
		System.out.println("getPreviousPage");
		int previousPage=this.page-1;
		if(0==previousPage) {
			previousPage=1;
		}
		return previousPage;
	}
	
	//下一页
	public int getNextPage() {
		System.out.println("getNextPage");
		int nextPage=this.page+1;
		if(nextPage>getMaxPage()) {//大于最大页
			nextPage=getMaxPage();
		}
		return nextPage;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	public void setPage(String page) {
		if(null!=page &&!"".equals(page.trim())){
			this.page =Integer.parseInt(page);
		}
	}

	public Map<String, String[]> getParameterMap() {
		return ParameterMap;
	}

	public void setParameterMap(Map<String, String[]> parameterMap) {
		ParameterMap = parameterMap;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	public void setRows(String rows) {
		if(null!=rows &&!"".equals(rows.trim())){
			this.rows =Integer.parseInt(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;
	}
	public void setPagination(String pagination) {
		if("false".equals(pagination)) {
			this.pagination = Boolean.parseBoolean(pagination);
		}
	}
	
	
	public PageBean() {
		super();
	}
	
	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page-1)*this.rows;
		
	}
	
	/**
	 * 获取最大页数
	 * @return
	 */
	public int getMaxPage() {
		int maxPage=this.total/this.rows;
		if(0!=this.total%this.rows) {
			maxPage++;
		}
		return maxPage;
	}
	
	

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}

}

3、实体类(字段,封装,构造方法)

通用分页1_第3张图片
4、工具类
从上至下,依次为(连接数据库工具类、字符编码过滤工具类、分页工具类、连接各种数据库配置工具类)通用分页1_第4张图片
5、将一般增删改查重复的部分写一个泛型,专门写一个方法用来拼接查询语句的统计满足条件的总行数,专门写一个方法用来存储拼接分页的sql,再在里面写一个内部类将不同的遍历部分放进去,解决每个表字段不一样的问题。
内部接口
Callback:
定义一个遍历ResultSet 的方法
方法
getCountSql 得到数据库表的总条数
getPageSql 得到分页sql语句
executeQuery 具体分页方法

//SOLAR
public class BaseDao<k> {
	public interface Callback<k>{
		public List<k> foreach(ResultSet rs) throws SQLException;
	}
	public String getCountSql(String sql) {
		return "select count(*) from ("+sql+") t1";
	}
	public String getPageSql(String sql,PageBean pageBean) {
		return sql+"limit "+pageBean.getStartIndex()+","+pageBean.getRows()+"";
	}
	public List<k> executeQuery(String sql,PageBean pageBean,Callback<k> callback){
		
		Connection con=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		if(null!=pageBean&&pageBean.isPagination()) {
		//1、统计满足条件的总行数
		try {
			con=DBAccess.getConnection();
			String countSql=this.getCountSql(sql);
			ps=con.prepareStatement(countSql);
			rs=ps.executeQuery();
			if(rs.next()) {
				int total=rs.getInt(1);
				pageBean.setTotal(total);
			}
		} catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException(e);
		}finally {
			DBAccess.close(null, ps, rs);//不能把连接关闭
		}
		}
		//2、查询指定页码并满足条件的总记录数
		try {
			if(con==null) {
				con=DBAccess.getConnection();
			}
			String pageSql=sql;
			if(null!=pageBean&&pageBean.isPagination()) {
				
				pageSql=getPageSql(sql, pageBean);
			}
			ps=con.prepareStatement(pageSql);
			rs=ps.executeQuery();
			return callback.foreach(rs);
			} catch (Exception e) {
				// TODO: handle exception
				throw new RuntimeException(e);
			}finally {
				DBAccess.close(con, ps, rs);
			}
	}

}

5.在dao类里继承第4步里创建的BaseDao,重写executeQuery方法返回的foreach,遍历存储取出来的字段,返回结果集

public List<Job> find(PageBean pageBean){
		String sql="select * from t_solr_job where 1=1 ";
		return this.executeQuery(sql, pageBean, new Callback<Job>() {

			@Override
			public List<Job> foreach(ResultSet rs) throws SQLException {
				List<Job> jobList = new ArrayList<Job>();
				Job j = null;
				while(rs.next()) {
					j = new Job();
					j.setId(rs.getString("id"));
					j.setJob(rs.getString("job"));
					j.setCompany(rs.getString("company"));
					j.setAddress(rs.getString("address"));
					j.setSalary(rs.getString("salary"));
					j.setUrl(rs.getString("url"));
					j.setLimit(rs.getString("limit"));
					j.setTime(rs.getString("time"));
					j.setDesc(rs.getString("desc"));
					j.setJobHandle(rs.getString("jobHandle"));
					j.setAddressHandle(rs.getString("addressHandle"));
					jobList.add(j);				
				}							
				return jobList;
			}
		});
	
}

6、写servlet,继承HttpServlet,写两个方法(doget,dopost),实例化分页工具类,调用方法

public class JobServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	// TODO Auto-generated method stub
	doPost(req, resp);
}
@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//设置字符编码
			req.setCharacterEncoding("utf-8");
			resp.setContentType("text/html;charset=utf-8");
			//实例化dao方法
			JobDao  jd = new JobDao();
			//实例化分页工具类,调用方法
			PageBean pageBean = new PageBean();
			pageBean.setRequest(req);
			req.setAttribute("pageBean", pageBean);
			//调用分页方法
			List<Job> joblist= jd.find(pageBean);
			//存储
			req.setAttribute("joblist", joblist);
			//跳转界面
			req.getRequestDispatcher("index.jsp").forward(req, resp);
	}
}

总结

这里是调用分页的前半段,后半段JSP界面,以及自定义分页按钮,请看我后面发布的通用分页02.
这是一个通用分页02博客的传送门~(点击)

你可能感兴趣的:(笔记)