最近写的一个项目需要分页查询功能,虽然在spring+springmvc+mybatis中利用pagehelper可以轻松解决,但是在我们这个框架中,比较古老,所以只能手写。下面我将代码以及实现思路给大家写一下。如有不足,请批评指正。
首先图片展示。是
/**
* 公司要闻
* @return
* @throws Exception
*/
@RequestMapping(value = "/getmediafocus")
public ModelAndView getmediafocus(@RequestParam(value="pageNum") int pageNum,@RequestParam(value="THEMATIC_CLASS_NUMBER") String THEMATIC_CLASS_NUMBER,@RequestParam(value="THEMATIC_CLASS_NAME") String THEMATIC_CLASS_NAME) throws Exception {
//传入的参数中,使用@RequestParam注解,获取到url中对应参数的值。
ModelAndView mv = this.getModelAndView();
Page page = new Page();
PageData pd2 = new PageData();
pd2.put("pageNum", pageNum);//将传递的页码放入容器
pd2.put("THEMATIC_CLASS_NUMBER", THEMATIC_CLASS_NUMBER);//将传递的类别放入容器
Page page2=new Page();
page2.setPd(pd2);
PageData pd= new PageData();
pd.put("THEMATIC_CLASS_NUMBER",THEMATIC_CLASS_NUMBER);
List<PageData> varList = MediafocusManager.listAll(pd);//listAll是查询表中所有的数据,并不分页。
List<PageData> prList=MediafocusManager.findBylistPage(page2);//findBylistPage则是进行分页的sql查询
int totalPage=varList.size();//获取到集合的长度,便是表中的总记录数
int pageList=(int) Math.ceil((double)totalPage / 15);//以总记录数/每页的条数,就是总页码。
int endPage=pageList;//总页码的值就是,最后一页。
int begin=0; //前台循环页码开始的值。pageList是前台循环结束的值。
if(pageList<5){ //如果总页码小与五页。那么pageList就是总页码。
pageList=pageList;
}else{
begin=pageNum-2; //如果大于五,则对开始和结束的只进行运算,-2,+2 是显示5个页码,-4,+5是显示10个页码,其他自己推算。
pageList=pageNum+2;
}
if(begin<1 && pageList>5){ //这里的判断,则是为了去除上begin有负数,pageList大于5的结果。如果每页要显示10个页码,那么pageList>10, pageList赋值为10;
begin=1;
pageList=5;
}
if(begin<1 && pageList<5){ //此处也是对begin为负数,pageList小于5时进行赋值。若想显示10条页码看上逻辑即可。
begin=1;
pageList=pageList;
}
if(pageNum==endPage && endPage>=5){ //此处则是判断传入的页码是否等于最后一页。对begin和pageList赋值。若想显示10条页码看上逻辑即可。
pageList=pageNum;
begin=pageList-4;
}
if(pageNum<=3 && endPage>=5){ //此处判断传入页码为3或小于3是对begin和pageList赋值。
begin=1;
pageList=5;
}
//将页码计算的结果以及查询的列表传入前台。
mv.addObject("endPage",endPage);
mv.addObject("totalPage",totalPage);
mv.addObject("begin",begin);
mv.addObject("pageNum",pageNum);
mv.addObject("pageList",pageList);
mv.addObject("THEMATIC_CLASS_NAME",THEMATIC_CLASS_NAME);
mv.addObject("THEMATIC_CLASS_NUMBER",THEMATIC_CLASS_NUMBER);
mv.addObject("varList",prList);
mv.setViewName("menhu/mediafocus");
return mv;
}
上面是后台代码的逻辑编写。
下面请看mapper文件中,sql语句的编写。
这就是sqlserver的分页语句查询。
注意的是,想要实现排序功能的话,需要写到子查询中。当时困扰我很久的时间倒叙。ORDER BY一直写不对位置。
传递的页码,以及参数请看位置。
SELECT TOP 15 MEDIAFOCUS_TITLE,MEDIAFOCUS_ID,MEDIAFOCUS_CREATTIME
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY MEDIAFOCUS_CREATTIME DESC ) AS RowNumber,* FROM OA_MEDIAFOCUS
where MEDIAFOCUS_STATUS = #{pd.THEMATIC_CLASS_NUMBER}
)
A
WHERE RowNumber > 15*(${pd.pageNum} - 1)
上面是mapper文件sql的编写,下面请看前台页码的循环遍历结果。
a标签带的样式和图片,请大家注意href写法,以及<c:forEach >中的代码。
其次就是前后翻页的问题。
<a href="fuwu/getmediafocus.do?pageNum=1&THEMATIC_CLASS_NUMBER=${THEMATIC_CLASS_NUMBER }&THEMATIC_CLASS_NAME=${THEMATIC_CLASS_NAME}" style="color:#0081cc;" rel="external"></a>//第一页
<a style="text-decoration:none;" id="bid" href="">//上一页
<c:forEach begin="${begin }" end="${pageList}" varStatus="index">
<a href="fuwu/getmediafocus.do?pageNum=${index.index}&THEMATIC_CLASS_NUMBER=${THEMATIC_CLASS_NUMBER }&THEMATIC_CLASS_NAME=${THEMATIC_CLASS_NAME}" style="color:#0081cc;" rel="external"><b ><span id="currentPage" value="${pageNum}" <c:if test="${pageNum == index.index }">style="color:red"</c:if>>${index.index}</span></b></a>
</c:forEach>
<a style="text-decoration:none;" id="aid" href=""></a>//下一页
<a href="fuwu/getmediafocus.do?pageNum=${endPage}&THEMATIC_CLASS_NUMBER=${THEMATIC_CLASS_NUMBER }&THEMATIC_CLASS_NAME=${THEMATIC_CLASS_NAME}" style="color:#0081cc;" rel="external"></a>//最后一页
为 前后翻页的标签 写上id 前翻页是id=“bid”,后翻页是"aid"
在script中给a标签href属性赋值。
<script>
var page=$("#currentPage").attr("value");//当前页有一个id,获取到当前页的值。
if(Number(page)==${pageList}){ //Numer()是对字符串转为数字使用。逻辑判断我就不说了。
document.getElementById("aid").href = "javascript:void(0);";
}else{
document.getElementById("aid").href = "fuwu/getmediafocus.do?THEMATIC_CLASS_NUMBER=${THEMATIC_CLASS_NUMBER }&THEMATIC_CLASS_NAME=${THEMATIC_CLASS_NAME}&pageNum="+(Number(page)+1);
}
if(Number(page)>1){
document.getElementById("bid").href = "fuwu/getmediafocus.do?THEMATIC_CLASS_NUMBER=${THEMATIC_CLASS_NUMBER }&THEMATIC_CLASS_NAME=${THEMATIC_CLASS_NAME}&pageNum="+(Number(page)-1);
}else{
document.getElementById("bid").href = "javascript:void(0);";
}
</script>
以上就是sqlserver中手写分页的一点心得。
如果有大佬看过后任务代码还有优化,还请指教。
一起学习,共同进步呀。