MySQL分页实现

       其实在网上查了很多关于分页的技术,别人写的代码一大堆一大堆的,实在没耐心看下去,只好取其精华精神,转化为己有,自己试着写一个分页的实现,因为自己的代码符合自己的风格和想法,所以很有耐心看下去,哈哈...为了以后再次回顾这部分知识,把代码的关键部分放到这里以便以后查看,如果有高人指点那是将是我的荣幸!

 

Page:页码对象

/**
 * 分页对象,用于存储总页数,当前页数。
 * @author 波仔
 *
 */
public class Page implements Serializable{
	private int selected_page;//取值范围:1-n
	private int pages_total;//总页数
	private int last_page;//上一页
	private int next_page;//下一页
	private int last_hop;//上一个页码段:每一个页面最多显示10个页码,记为一个页码段。
	private int next_hop;//下一个页码段
	private List<Integer> current_pages;//当前页数。
	public int getPages_total() {
		return pages_total;
	}
	public void setPages_total(int pages_total) {
		this.pages_total = pages_total;
	}
        .......以下都是set/get方法
        .......
}

 

数据库获取Page对象代码部分:

/**
	 * 获取下一页的页码对象
	 * @param blog_id 用户请求的博文id
	 * @param start_page 用户请求的页码
	 * @return 返回一个分页对象
	 */
	public static Page getCurrentPageNum(int blog_id,int start_page){
		try{
			Page page = new Page();
			page.setSelected_page(start_page);
			String sql = "select count(*) from tbl_reviews where article_id=?";
			java.sql.PreparedStatement prestmt1 = MysqlConnector.getConnection().prepareStatement(sql);
			prestmt1.setInt(1,blog_id);
			java.sql.ResultSet rs1 = prestmt1.executeQuery();
			while(rs1.next()){
				page.setPages_total(rs1.getInt(1)/10);//设定总页数
			}
			prestmt1.close();
			//如何计算页码????
			if((start_page-1)>0){//存在上一页
				page.setLast_page(start_page-1);
			}else{
				page.setLast_page(-1);
			}
			if((page.getPages_total()-start_page)>0){//存在下一页
				page.setNext_page(start_page+1);
			}else{
				page.setNext_page(-1);
			}
			
			List<Integer> list = new ArrayList<Integer>();
			if(page.getPages_total()<=10){//如果当前页面能将页码完全显示。
				for(int i = 1;i<=page.getPages_total();i++){
					list.add(new Integer(i));
					page.setLast_hop(-1);//表示没有上一段页码
					page.setNext_hop(-1);//表示没有下一段页码
				}
			}else{//如果在当前页面不能显示全部页码。
				int lh = start_page-(start_page%10);
				int nh = start_page-(start_page%10)+11;
				
				if(lh>0&&(start_page%10!=0)){//有上一段页码
					page.setLast_hop(lh);
				}else if(lh>0&&(start_page%10==0)){
					page.setLast_hop(lh-10);
				}else{page.setLast_hop(-1);}
				
				if(nh<page.getPages_total()&&(start_page%10!=0)){//有下一段页码
					page.setNext_hop(nh);
				}else if(nh<page.getPages_total()&&(start_page%10==0)){
					page.setNext_hop(nh-10);
				}else if(nh>page.getPages_total()&&(start_page%10==0)){
					if(nh-10<page.getPages_total()){
						page.setNext_hop(nh-10);
					}else{
						page.setNext_hop(-1);
					}
				}
				else{page.setNext_hop(-1);}
				
				for(int j = start_page-(start_page%10)+1;
				j<start_page-(start_page%10)+10;j++){
					list.add(new Integer(j));
				}
			}
			return page;
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}

 由于本人对数据结构和算法不是很在行,上面的实现可能笨了点,但是没有功劳也有苦劳吧....

 

页面实现:

<tr>
   <td align="center" class="list">
      <c:if test="${cur_page.last_page>0}">
        <a href="viewblog.do?id=${article.id}&page=${cur_page.last_page }">上一页</a>
      </c:if>
      <c:if test="${cur_page.last_hop>0}">
         <a href="viewblog.do?id=${article.id}&page=${cur_page.last_hop }"><< </a>
      </c:if>
      <c:forEach var="p" items="${cur_page.current_pages}">
         <c:if test="${p==cur_page.selected_page}">
            <strong><a href="viewblog.do?id=${article.id}&page=${p}">${p }</a></strong>
         </c:if>
         <c:if test="${p!=cur_page.selected_page}">
              <a href="viewblog.do?id=${article.id}&page=${p}">${p }</a>
         </c:if>
      </c:forEach>
      <c:if test="${cur_page.next_hop>0}">
          <a href="viewblog.do?id=${article.id}&page=${cur_page.next_hop }">>> </a>
      </c:if>
      <c:if test="${cur_page.next_page>0}">
           <a href="viewblog.do?id=${article.id}&page=${cur_page.next_page }">下一页</a>
      </c:if>
   </td>
</tr>
 

分页效果如下:

情况1:    上一页  1 2 3 4 5 6 7 8 9 10  >> 下一页

情况2:    上一页  <<  11 12 13 14 15 16 17 18 19 20 >> 下一页

情况3:    上一页  <<  21 22 23 24    下一页

注意:粗体红色字表示当前页,'>>'表示下一个页码段,'<<'表示上一个页码段。例如:情况1中的‘>>’指向第11页,

         情况2中的'<<'指向第10页

 

 

联系我:hunnuxiaobo@gmail.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值