详解Java web中MySQL分页显示原理
一、MySQL分页语句
select * from 表名 limit 参数1 , 参数2
其中:
参数1是从哪一个开始查
参数2就是要查几条数据
如:select * from news limit 0,10
就是查询news表的全部数据中从0开始查10条数据为一页显示
当然依旧可以使用group关键词、where语句等等。
如:select * from 表名 ORDER BY 列名 DESC limit 0,10
二、Dao层实现分页查询
接口实现类:
```java
public List<question> selectAllPQ(int Page) throws Exception {
String sql = "select * from question ORDER BY qid DESC limit ?,10";
// c.发送sql,执行(增删改、查)
Object[] params = {Page};
List<question> allPE=new ArrayList<question>();
rs=executeQuery(sql, params);
// d.处理结果
while(rs.next()) {
question PE=new question();
PE.setQid(rs.getInt(1));
PE.setQtitle(rs.getString(2));
PE.setQtime(rs.getString(3));
PE.setQpeople(rs.getString(4));
allPE.add(PE);
}
closeResource();
return allPE;
}
在该方法(selectAllPQ(int Page))的传入参数Page需要制定从第几条开始查,如果乘以每页的数量就是可以直接传入页数。
例如,传入0,则从第0条开始查10条数据(mysql分页是从0开始,相当于数组),传入10就是从10 开始查询下10条数据放在第二页
如果将SQL语句改成
select * from question ORDER BY qid DESC limit ?*10,10
则传入“0”,则显示第一页的10条内容,传入1则显示第二页的10条内容
当然也可以将输入参数直接乘以页数,例如
public static void main(String[] args) {
newsLook nl=new newsLook();
int page=0;
System.out.println(nl.selectNewsByPage(page*5));//指定页数
}
三、UI层分页显示与按钮的使用
UI层进行分页显示主要思路为
Dao层将表中总条数和第一页的数据查询并返回给UI层
总条数作用:
根据约定好的每页多少条,进而确定页数,迭代出选择页数的按钮
UI层点击页数按钮选择显示哪一页
每个页数按钮上设置一个JavaScript的点击事件
<%
if(pageCount>0)
for(int i=1;i<=pageCount;i++){
%>
<button onclick="select(<%=i%>)"><%=i %></button>
<% } %>
js的select(page)函数
function select(page){
var page=page;
//confirm(page);
location.href="/newsManager/lookAll?selectPage="+page;
}
上一页和下一页按钮
使用上一页和下一页按钮时,最关键的是需要让程序知道现在处于第几页,这就要用到服务端要向前端返回一个当前在第几页的参数
request.setAttribute(“selePage”,selePage);
可以返回当前的页数并传给前端
前端接收的全部参数
<%
List<myNew> myNews=(List<myNew>)request.getAttribute("mynews");
int pageCount =(int)request.getAttribute("pageCount");
int selePage=(int)request.getAttribute("selePage")+1;//知道自己在第几页了
%>
按钮设计js事件
<button onclick="upPage()">上一页</button>
<button onclick="downPage()">下一页</button>
js函数
function downPage(){
//总页数
var pageCount="<%=pageCount%>";
//当前页数
var nowPage="<%=selePage%>";
if(pageCount==nowPage){
confirm("翻到底了!");
}else{
location.href="/newsManager/lookAll?selectPage=<%=selePage+1%>";
}
}
function upPage(){
//总页数
var pageCount="<%=pageCount%>";
//当前页数
var nowPage="<%=selePage%>";
if(nowPage=="1"){
confirm("翻到顶了!");
}else{
location.href="/newsManager/lookAll?selectPage=<%=selePage-1%>";
}
}
请求的Servlet
newsLook nlAll=new newsLook();
List<myNew> mynews=nlAll.seletAll();
int pageCount=mynews.size()/5+1;//总页数
//接受页数
String selectPage=request.getParameter("selectPage");
int selePage=0; //定义从第一页开始
if(selectPage!=null && selectPage!="") {
selePage=Integer.parseInt(selectPage)-1;
}
System.out.print("选择了第"+selectPage+"页");
List<myNew> newsPage=nlAll.selectNewsByPage(selePage);//0是第一页,,传1 第二页
if(!(mynews==null)) {
request.setAttribute("selePage",selePage);
request.setAttribute("mynews",newsPage);//一页里的所有数据
request.setAttribute("pageCount",pageCount); //总页数
request.getRequestDispatcher("/takeNews/lookNews.jsp").forward(request,response) ;
}else {
request.getRequestDispatcher("/manager/false.jsp").forward(request,response) ;
}
这样就可以实现mysql的分页操作。
当然这可能只是众多方法中的一种,还有很多的分页方法可以实现。欢迎大家互相分享!