MySQL的limit子句。
格式:select .... limit [偏移量],<记录个数>
一、设计一个分页类Pager.java
package com.nba.player; public class Pager { private int pageSize=10;// 默认每页记录数 private int pageNosDisplay=10;// 默认每次显示的页码数 private int totalPages;// 总页数 private int pageNo = 1;// 当前页码数 public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPageNosDisplay() { return pageNosDisplay; } public void setPageNosDisplay(int pageNosDisplay) { this.pageNosDisplay = pageNosDisplay; } public int getTotalPages() { return totalPages; } //通过传入的表名得到总页数 public void setTotalPages(String tableName) {
int totalRecords=getTotalRecords(tableName); totalPages = totalRecords % pageSize == 0 ? totalRecords / pageSize : totalRecords / pageSize + 1; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; }
//获得某表的记录总数
private int getTotalRecords(String tableName) {
int totalRecords=0;
Connection connection=DB.getConnection();
ResultSet rs=null;
Statement st=null;
String sql="select count(*) from "+tableName;
try {
st=connection.createStatement();
rs=st.executeQuery(sql);
if(rs.next())
totalRecords=rs.getInt(1);
rs.close();
st.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
return totalRecords;
}
}
二、设计实体类Player.java
package com.nba.player; public class Player { private int id; private String headimgurl; private String chinesename; private String englishname; private String number; private String position; private double height; private double weight; private int age; private int playAge; private int teamid; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getHeadimgurl() { return headimgurl; } public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; } public String getChinesename() { return chinesename; } public void setChinesename(String chinesename) { this.chinesename = chinesename; } public String getEnglishname() { return englishname; } public void setEnglishname(String englishname) { this.englishname = englishname; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getPlayAge() { return playAge; } public void setPlayAge(int playAge) { this.playAge = playAge; } public int getTeamid() { return teamid; } public void setTeamid(int teamid) { this.teamid = teamid; } }
三、设计业务类PlayerService.java
package com.nba.player; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class PlayerService { //获得数据库连接 private static Connection getConnection() { Connection connection=null; try { Class.forName("com.mysql.jdbc.Driver"); connection=DriverManager.getConnection("jdbc:mysql://sh-cdb-qego3b2a.sql.tencentcdb.com:61551/study", "student", "student"); } catch (Exception e) { System.out.println("数据库连接出错!"); e.printStackTrace(); } return connection; } //获得记录总数 public static int getPlayersTotalRecords() { int totalRecords=0; Connection connection=getConnection(); ResultSet rs=null; Statement st=null; String sql="select count(*) from player"; try { st=connection.createStatement(); rs=st.executeQuery(sql); if(rs.next()) totalRecords=rs.getInt(1); rs.close(); st.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } return totalRecords; } //得到分页记录 public static List<Player> getPlayers(Pager pager) { List<Player> players=new ArrayList<Player>(); ResultSet rs=null; PreparedStatement ps=null; Connection connection=getConnection(); try { String sql="select headimgurl, number, englishname,chinesename,position,height from player limit ?,?"; ps=connection.prepareStatement(sql); ps.setInt(1, (pager.getPageNo()-1)*pager.getPageSize()); ps.setInt(2, pager.getPageSize()); rs=ps.executeQuery(); while (rs.next()) { String headImgUrl=rs.getString("headimgurl"); String number=rs.getString("number"); String englishName=rs.getString("englishname"); String chineseName=rs.getString("chinesename"); String position=rs.getString("position"); double height=rs.getDouble("height"); Player p=new Player(); p.setHeadimgurl(headImgUrl); p.setChinesename(chineseName); p.setEnglishname(englishName); p.setNumber(number); p.setPosition(position); p.setHeight(height); players.add(p); } } catch (Exception e) { e.printStackTrace(); }finally { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } return players; } }
四、设计控制器GetPlayersServlet.java
package com.nba.player; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class GetPlayersServlet */ @WebServlet("/GetPlayersServlet") public class GetPlayersServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public GetPlayersServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) { Pager pager=new Pager();//建立分页对象 //获得当前页 String strPageNo = request.getParameter("pageNo"); int pageNo=1; if (strPageNo != null && !strPageNo.equals("")) { try { pageNo = Integer.parseInt(strPageNo); } catch (NumberFormatException e) { pageNo = 1; } } if (pageNo <= 0) { pageNo = 1; } pager.setPageNo(pageNo); //获得总页数 pager.setTotalPages(player);//通过表名得到总页数 //获得某一页的球员列表 List<Player> players=PlayerService.getPlayers(pager); //将以下数据带入视图 request.setAttribute("players", players);//球员数据 request.setAttribute("pager", pager);//分页数据 request.setAttribute("servlet", request.getContextPath()+request.getServletPath());//处理请求的servlet //视图 RequestDispatcher rd=request.getRequestDispatcher("player/PlayerList.jsp"); try { rd.forward(request, response); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
五、分页控件前端展示文件Pager.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <ul class="pagination"> <!-- 上一页 (当页码小于等于1时)--> <c:if test="${pager.pageNo le 1}"> <li class="disabled"><a>«</a></li> </c:if> <!-- 上一页(当页码大于1时) --> <c:if test="${pager.pageNo gt 1}"> <li><a href="${servlet }?pageNo=${pager.pageNo-1}">«</a> </c:if> <!-- 计算要显示超始页码 (15-1)/10*10+1=11 --> <c:set var="num" value="${(pager.pageNo-1) / pager.pageNosDisplay}" /> <!-- 向下取整 --> <fmt:formatNumber var="n" value="${ num + (num % 1 == 0 ? 0 : -0.5)}" pattern="#"></fmt:formatNumber> <c:set var="start" value="${n * pager.pageNosDisplay+1 }" /> <c:set var="ii" /><!-- 记循环变量i的值 --> <!-- 是否加1... --> <c:if test="${start gt pager.pageNosDisplay }"> <li><a href="${servlet}?pageNo=1">1</a></li> <li> <a>...</a></li> </c:if> <!--要显示的页码段 << 1...11,12,13,14,15,16,17,18,19,20...44 >> (设共44页) --> <c:forEach var="i" begin="${start}" end="${start-1 + pager.pageNosDisplay }"> <c:if test="${i le pager.totalPages}"> <c:set var="ii" value="${i}" /> <c:if test="${i eq pager.pageNo }"> <li class="active"><a>${i}</a><!-- 当前页不作链接 --> </c:if> <c:if test="${i ne pager.pageNo }"> <li><a href="${servlet }?pageNo=${i}">${i}</a></li> </c:if> </c:if> </c:forEach> <!-- 是否加...[totalPages] --> <c:if test="${ii lt pager.totalPages}"> <c:set var="num1" value="${(pager.totalPages-1) / pager.pageNosDisplay}" /> <!-- 向下取整 --> <fmt:formatNumber var="n1" value="${ num1 + (num1 % 1 == 0 ? 0 : -0.5)}" pattern="#"></fmt:formatNumber> <c:if test="${n ne n1 }"><!-- << 1...41,42,43,44 >> --> <li><a>...</a></li> </c:if> <li><a href="${servlet }?pageNo=${pager.totalPages}">${pager.totalPages}</a></li> </c:if> <!-- 下一页(页码等于总页) --> <c:if test="${pager.pageNo eq pager.totalPages }"> <li class="disabled"><a>»</a></li> </c:if> <!-- 下一页(页码小于总页) --> <c:if test="${pager.pageNo lt pager.totalPages }"> <li><a href="${servlet }?pageNo=${pager.pageNo+1}">»</a></li> </c:if> </ul>
六、视图文件PlayerList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <title>球员列表</title> </head> <body> <table class="table table-hover table-striped"> <tr> <th>序号</th> <th>头像</th> <th>中文名</th> <th>英文名</th> <th>号码</th> <th>位置</th> <th>身高</th> </tr> <c:set var="i" value="1" /> <c:forEach items="${players}" var="player"> <tr> <td>${i}</td> <td><img src="${player.headimgurl}" width="58" height="46"></td> <td>${player.chinesename}</td> <td>${player.englishname}</td> <td>${player.number}</td> <td>${player.position}</td> <td>${player.height}</td> </tr> <c:set var="i" value="${i+1 }" /> </c:forEach> </table> <%@ include file="../Pager.jsp" %> </body> </html>
七、运行效果