MYSQL分页总结
在软件开发的很多时候很多场合我们都需要用到分页技术,现在的分页技术很多,可是我知道的不多,像displaytag这样的分页插件我感受了一下的确很不错而且可以导出pdf,word,excel等格式的文件,但是我不怎么会用,所以避而远之,还是总结一下自己对mysql分页的总结吧。
分页是一个项目中的常用功能,在我的项目中,我在公告显示,会议显示,文件显示,员工显示模块均用到了分页功能。为了能够让代码复用,并且容易维护,总之在很多好处的诱惑下,我首先编写一个接口类,代码如下:
SplitPage.java
package dao;
import java.util.List;
/**
* @author lixiangyu
*
*/
public interface SplitPage {
//获取总记录数
int getTotalCount();
//获取总页数
int getTotalPage();
//按页获取记录
List queryPerPage(int page);
//设置每页显示的记录数
void setCountPerPage(int countPerPage);
}
从上面的接口中我们可以看到分页的一个基本思路,我们需要从四个方面进行考虑,分别为获取数据表里面的总记录数,设置每页显示的记录数,按页获取记录,以及获取总页数。获取总记录数和按页获取记录需要用SQL语句实现,但如何获取总页数?很简单,通过计算得出。
定义完接口类需要实现接口,但是在实现接口之前需要做一件事情,那就是连接数据库,在我的项目中我用的是MYSQL数据库,连接数据库代码如下所示:
DBUtil.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author lixiangyu
*
*/
public class DBUtil {
private static String DBDRIVER = "com.mysql.jdbc.Driver";
private static String DBURL = "jdbc:mysql://localhost:3306/oasys?user=root&password=123456&useUnicode=true&characterEncoding=utf8";
private static Connection conn = null;
public DBUtil(){}
public static Connection getConnection(){
try{
Class.forName(DBDRIVER);
conn = DriverManager.getConnection(DBURL);
// System.out.println("数据库连接");
}catch(SQLException e){
e.printStackTrace();
}catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
if(conn==null)
System.out.println("conn is not null");
return conn;
}
public static void closeConnection(ResultSet rs,PreparedStatement ps,Connection conn){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
对于数据库连接的代码就不做过多说明,很多人也肯定是将连接数据库的代码单独的存放为一个文件。
现在需要实现接口类,接口类代码如下所示:
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
//import java.util.Iterator;
import java.util.List;
import javabean.Userinfo;
public class SplitPageImp implements SplitPage {
private int countPerPage=10; //每页显示是个元素
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
@Override
//获取总记录数
public int getTotalCount() {
int totalCount = 0; //设置总记录数默认值为0
try{
conn = DBUtil.getConnection();
ps = conn.prepareStatement("select count(*) from userinfo");
rs = ps.executeQuery();
if(rs.next()){
totalCount = rs.getInt(1);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtil.closeConnection(rs, ps, conn);
}
return totalCount;
}
@Override
//获取总页数
public int getTotalPage() {
int totalCount = this.getTotalCount();
int totalPage = 0;
if(totalCount%countPerPage==0)
totalPage = totalCount/countPerPage;
else
totalPage = totalCount/countPerPage+1;
return totalPage;
}
@Override
//按页查询
public List<Userinfo> queryPerPage(int page) {
List<Userinfo> list = new ArrayList<Userinfo>(); //我是针对用户进行分页,Userinfo是我的javabean文件,里面只包含了元素的定义和set、get方法
int startRow = (page-1) * countPerPage; //定义开始页起始元素
try{
conn = DBUtil.getConnection();
ps = conn.prepareStatement("select * from userinfo limit ?,?"); //注意只有在mysql中是limit 第一个?表示开始的元素,第二个?表示结束的元素,在mysql中第一个元素的下标为0
ps.setInt(1, startRow);
ps.setInt(2, countPerPage);
rs = ps.executeQuery();
while(rs.next()){
//除了括号里面的1,2,3……也可以将数字换成定义的元素
Userinfo user = new Userinfo();
user.setUid(rs.getString(1));
user.setUname(rs.getString(2));
user.setUpassword(rs.getString(3));
user.setUsex(rs.getString(4));
user.setUphone(rs.getString(5));
user.setUemail(rs.getString(6));
user.setUposition(rs.getString(7));
user.setUinDate(rs.getString(8));
user.setUintro(rs.getString(9));
user.setFk_rid(rs.getString(10));
user.setFk_did(rs.getString(11));
user.setUstatus(rs.getString(12));
user.setLogin(rs.getString(13));
list.add(user);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtil.closeConnection(rs, ps, conn);
}
return list;
}
@Override
//设置每页显示记录数
public void setCountPerPage(int countPerPage) {
this.countPerPage = countPerPage;
}
}
UserDao.java
Public class UserDao{
public static SplitPage getUserIMP(){
return new SplitPageImp();
}
}
Bean文件就这样,很简单的写完了,然后开始写servlet,servlet里面如果是自己定义一个class然后将class写成servlet的话需要在web.xml里面进行配置servlet要不然是不能运行的,不信的话你可以试试,我是试过的,一个action始终是转不过去。Servlet代码如下所示:
package servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javabean.Userinfo;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.DepartmentDao;
import dao.RoleDao;
import dao.UserDao;
public class UserManager extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserManager() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response); //注意此处,如果没有这句则接收不到jsp传来的action
}
Protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
Userinfo user = new Userinfo();
String action = request.getParameter("action");
if(action.equals("showAllUser")){
int page = 1;
request.getParameter("page");
String p =request.getParameter("page");
if(p!=null){
page = Integer.parseInt(p);
}
int totalCount = UserDao.getUserIMP().getTotalCount();
int totalPage = UserDao.getUserIMP().getTotalPage();
List list = UserDao.getUserIMP().queryPerPage(page);
request.setAttribute("totalCount",new Integer(totalCount));
request.setAttribute("totalPage", new Integer(totalPage));
request.setAttribute("page", new Integer(page));
request.setAttribute("list", list);
this.forward(request, response, "/userinfo/userManager.jsp");
} //这句话除了这样写还可以这样写:request.getRequestDispatcher("/userinfo/userManager.jsp").forward(request, response);不同之处是要定义一个forward方法。
private void forward(HttpServletRequest request,HttpServletResponse response,String url)throws ServletException,IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
至此后台全部完成,我觉得后台代码还是很容易理解的。
前台jsp页面如下所示,注意参数的传递:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList,java.util.List,java.sql.*,javabean.Userinfo,dao.UserDao,javabean.Role,dao.RoleDao,dao.DepartmentDao,javabean.Department " %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.Iterator"%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户管理</title>
</head>
<body>
<%
int totalCount=(Integer)request.getAttribute("totalCount");
int totalPage=(Integer)request.getAttribute("totalPage");
int p=(Integer)request.getAttribute("page");
List list=(List)request.getAttribute("list");
Iterator it=list.iterator();
%>
<center>
员工总人数:<font color="red" ><%=totalCount %></font>
当前页:<font color="red" ><%=p %></font>/<font color="red" ><%=totalPage %></font>
<table border="1" width="100%" cellpadding="0" cellspacing="0" bordercolor="#6ba6e0" >
<tr>
<th background="image/tablebj.gif">姓名</th>
<th background="image/tablebj.gif">性别</th>
<th background="image/tablebj.gif">角色</th>
<th background="image/tablebj.gif">部门</th>
<th background="image/tablebj.gif">修改</th>
<th background="image/tablebj.gif">删除</th>
</tr>
<%
while(it.hasNext()){
Userinfo userinfo=(Userinfo)it.next();
Role role=RoleDao.getRoleByID(userinfo.getFk_rid());
Department depart=DepartmentDao.getDepartById(userinfo.getFk_did());
%>
<tr>
<td><a href="<%=request.getContextPath() %>/UserManager?action=showOneUser&userid=<%=userinfo.getUid() %>"><%=userinfo.getUname() %></a></td>
<td><%=userinfo.getUsex() %></td>
<td><%=role.getRname() %></td>
<td><%=depart.getDname() %></td>
<td><a href="<%=request.getContextPath() %>/UserManager?action=userUpdate&userid=<%=userinfo.getUid() %>">修改</a></td>
<td><a href="<%=request.getContextPath() %>/UserManager?action=userDel&userid=<%=userinfo.getUid() %>" onclick="return confirm('确定删除该员工 信息?')">删除</a></td>
</tr>
<%}%>
</table>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="130" align="right">
<form action="<%=request.getContextPath() %>/UserManager?action=showAllUser" method="post">
跳转到<input type="text" name="page" size="3">页
</form>
</td>
<td width="20"></td>
<td width="290" align="left">
<%if(p==1){ %>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=1"> 首页</a>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=<%=(p+1) %>"> 下一页</a>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=<%=totalPage %>">末页</a>
<%}if(p==totalPage){ %>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=<%=(p-1) %>">上一页</a>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=1"> 首页</a>
<%}if(p!=1&&p!=totalPage){ %>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=1"> 首页</a>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=<%=(p-1) %>">上一页</a>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=<%=(p+1) %>"> 下一页</a>
<a href="<%=request.getContextPath() %>/UserManager?action=showAllUser&page=<%=totalPage %>">末页</a>
<%}%>
</td>
</tr>
</table>
</center>
</body>
</html>
就这样很简单的就可以实现mysql的分页。
分享到:
相关推荐
自己根据所作的一个项目对mysql分页的总结,菜鸟还有理解不到位的地方还请老鸟指教,因为自己纯手工制作所以分值高点犒劳一下自己。网上也有很多类似的东西,我想应该和我的不同
通过JSP+servlet+javabean实现购物车,里面有mysql数据库以及javaee实现的代码,分页,购物车的实现
5.Servlet + JSP +JavaBean + JDBC(DBUtils)+ mysql 6.数据库 create database day19; use day19; create table t_customer( id varchar(40) primary key, username varchar(20), gender varchar(10), ...
这是我前段时间写的一个分页,是用Jsp+Javabean+Servlet对Oracle 和Mysql分页
jsp+javabean+servlet使用简单的MVC模式实现登录注册、留言板、分页的功能。model(javabean)层实现读写数据库,数据库名为webapp,没有密码;view(JSP)实现展示信息;controller(servlet)层联系model和view,...
完整的 JSP+SERVLET+MYSQL实现的增删改查javaweb小例子
本分页系统采用JSP+JavaBean+Servlet实现。环境:Mysql+Tomcat+MyEclipse
利用servlet+jsp+javabean进行分页查询,用到的数据库为mysql
实现一个简单的MVC例子,适合新手学习
员工模块使用分页技术实现展示员工信息,添加员工,删除员工,修改员工信息与查询员工等功能,部门管理使用分页技术实现显示部门信息,添加部门,删除部门,修改部门信息等功能,考勤模块使用分页技术显示员工考勤...
用jsp+javabean+servlet实现的分页 数据库用的mysql
文章整理: www.diybl.com 文章来源: 网络 去论坛 建我的blog 今天给同学用JSP+JavaBean+Servlet做了个分页。用的是MySQL+Tomcat+MyEclispe环境。
分页,google验证码组建使用,精美分页样式,次纯属个人准备作品时候的分层作品,使用google验证码组件,以及自己写的分页,感觉用着还可以,分享给大家使用。只有功能,没有美工设计噢~~
基于Jsp+JavaBean+Servlet实现MVC模式的分页模板 分页没有css,但分页功能齐全 对初学者应该有帮助 分三层编写dao层 service层 web层 数据库可以用ms server2005 或者 mysql5.0 脚本为ms2005.sql 、mysql.sql 切换...
前台页面有些粗糙,没有分页功能。主要体验mvc设计模式及流程。
使用JSP,servlet,mysql进行的真分页操作。包括jsp,servlet,javabean,dao以及mysql代码。
图书管理系统基于servlet+mysql+jdbc+html.pdf
本项目使用了原生的JavaBean+Servlet+JSP技术。旨在供新手上手学习使用。本案例目前只针对商品进行了增删改查操作。包含了基本的用户登录、商品的查询(支持模糊,支持分页、支持图片展示)、商品的添加(支持图片...
mvc版留言本,采用jsp+javabean+servlet编写,即model2版 eclipse项目,可以直接导入,数据库类型mysql,支持分页,ajax验证码.代码内有详细注解,一看就明白,本人一直坚持简单易懂原则,帮助更多的初学者更快的掌握j2ee技术...
本项目使用了原生的JavaBean+Servlet+JSP技术。旨在供新手上手学习使用。本案例目前只针对商品进行了增删改查操作。包含了基本的用户登录、商品的查询(支持模糊,支持分页、支持图片展示)、商品的添加(支持图片...