J2EE (五) SQL+PageClass实现真分页
分页的应用几乎无处不在,只要有数据的地方就会用到分页的技术,关于分页已经有成熟的框架以及类库并不需要我们亲自些在自己的分页类,通常用别人的已经开发好的东西,拿来开发效率会高一些,虽然如此,我们还需要掌握并了解分页实现的原理和机制,下面给大家介绍一下,真分页的实现。
谈到分页在.NET里面已经接触过,学过一边感觉再一次接触会容易理解和运用,它们的实现思路和思想是一样的,突然,对编程思想有了些认识,学习编程重要的并不是掌握多少语言,会多少语言,而是理解了编程的思想,如果你拥有了思想,编程是很轻松的事情。
静下心来写一段代码的时间远比思考的过程要长,前几天看翟鸿燊的视频记得有一句话“思考力是在执行力前面的,只有思考没有出现错误时,执行力才有价值”,在写代码的过程中同样不可缺少思考力。
真分页即页面上一次显示多少条数据就从数据库中查询多少条数据,比如显示80-90,数据库里面需要查询的也是80到90条。
我们如何从上万条数据中查询出某一连续几条记录呢?
这里涉及到两个变量:每页显示条数和当前页数。
分页SQL语句如下:user表
<-选择多少条以上的数据-> select rn, user_id,user_name,password,contact_Tel,email,create_date from ( <-选择多少条以内的数据-> select rownum rn, user_id,user_name,password,contact_Tel,email,create_date from T_USER where rownum <=? order by user_id ) where rn>?
查询数据库方法
/** * 查询分页数据 * @param pageNo 当前页数 * @param pageSize 每页大小 * @return */ public PageModel<User> findUserList(int pageNo,int pageSize) { //分页用的SQL语句 StringBuffer sbsql=new StringBuffer(); sbsql.append("select rn,user_id,user_name,password,contact_Tel,email,create_date "); sbsql.append("from"); sbsql.append("("); sbsql.append("select rownum rn, user_id,user_name,password,contact_Tel,email,create_date "); sbsql.append("from"); sbsql.append("( select user_id,user_name,password,contact_Tel,email,create_date from T_USER where user_Id <> 'root' order by user_id )"); sbsql.append("where rownum <=?"); sbsql.append(")"); sbsql.append("where rn>=?"); //连接变量 Connection conn=null; //执行对象 PreparedStatement pstmt=null; //结果集 ResultSet rs=null; PageModel<User> pageModel=null; try{ //获得连接 conn=DbUtil.getConnection(); pstmt=conn.prepareStatement(sbsql.toString()); //设置查询参数值 pstmt.setInt(1, pageNo * pageSize); pstmt.setInt(2, (pageNo-1) * pageSize); //执行查询 rs=pstmt.executeQuery(); List<User> userlist = new ArrayList<User>(); while(rs.next()) { //实例用户实体,并赋值 User user=new User(); user.setUserId(rs.getString("user_id")); user.setUserName(rs.getString("user_name")); user.setPassword(rs.getString("password")); user.setContactTel(rs.getString("contact_tel")); user.setEmail(rs.getString("email")); user.setCreateDate(rs.getTimestamp("create_date")); userlist.add(user); } //将结果分页 pageModel=new PageModel<User>(); pageModel.setList(userlist); //设置中记录数 pageModel.setTotalRecords(getTotalRecords(conn)); //设置页的大小 pageModel.setPageSize(pageSize); pageModel.setPageNo(pageNo); }catch(SQLException e) { e.printStackTrace(); }finally { //释放资源 DbUtil.close(rs); DbUtil.close(pstmt); DbUtil.close(conn); } return pageModel; }
分页类封装
/** * 封装分页类 * @author LLS * */ public class PageModel<E> { //结果集 private List<E> list; //查询记录数 private int totalRecords; //每页多少条数据 private int pageSize; //第几页 private int pageNo; /** * 取得首页 * @return */ public int getTopPage() { return 1; } /** * 取得尾页 * @return */ public int getBottomPageNo() { return getTotalPages(); } /** * 取得上一页 * @return */ public int getPreviousPageNo() { if(pageNo<=1) { return 1; }else { return pageNo-1; } } /** * 取得下一页 * @return */ public int getNextPageNo() { if(pageNo>=getBottomPageNo()) { return getBottomPageNo(); }else { return pageNo+1; } } /** * 得到总的页数 * @return */ public int getTotalPages() { return (totalRecords+pageSize-1)/2; } public List<E> getList() { return list; } public void setList(List<E> list) { this.list = list; } public int getTotalRecords() { return totalRecords; } public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; } }
该分页封装返回的是实体集列表,也可以返回一些表对象,把数据导入到表中。
到这里分页的逻辑结构基本完成了,剩下的是一些前台的调用,只需要调用PageClass即可。