目录

  • 使用工具:
  • 使用Jar包:
  • 项目下载连接:
      • 数据库表
    • 实体类:
      • 用户实体类:
      • 分页实例化:
    • 在Dao接口中定义2个方法:
      • 接口:
    • 实现Dao接口方法解析:
    • service层:
      • 接口:
      • 接口实现:
    • 工具类:
    • Servlet:
    • web.xml:
    • c3p0-config.xml
    • 信息展示页面:
    • 效果展示:

使用工具:

JavaJDK1.8
Tomcat 8.5.33
IDEA
MySQL5.6

使用Jar包:

  • c3p0-0.9.1.2.jar
  • commons-dbutils-1.4.jar
  • javax.annotation.jar
  • javax.ejb.jar
  • javax.jms.jar
  • javax.persistence.jar
  • javax.resource.jar
  • javax.servlet.jar
  • javax.servlet.jsp.jar
  • javax.transaction.jar
  • jstl-1.2.jar
  • mysql-connector-java-8.0.13.jar
  • junit-4.12.jar + hamcrest-core-1.3.jar 这个两个缺一不可 (junit-4.8.jar以上可以代替这两个jar包)

项目下载连接:

微云链接:https://share.weiyun.com/WA6AmSix

数据库表
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;

实体类:

用户实体类:
public class User {private Integer id;private String name;private Integer age;public User() {}public User(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}
分页实例化:

定义5个属性:
Integer pageNum :用来记录当前页面的页码
Integer pageSize :可以自定义当前页面最大显示多少条数据
Long totalSize :记录数据库存储的数据总共多少条
Integer pageCount : 将数据库的 总数据量 除以 当前页面最大显示数据量 得到 数据可以分多少页
List<T> data:存放每一页要显示的数据

this.pageCount = (int)(this.totalSize%this.pageSize == 0 ?this.totalSize / this.pageSize:this.totalSize/this.pageSize + 1);

当总数据量 除以 当前页面显示的数据量 刚好等于 0时数据页面不再 + 1,
当总数据量 除以 当前页面显示的数据量 有余数时,数据页面 + 1(额外加一页显示剩余的数据)。

例如:有21条数据,每页显示10条数据,需要3页才能把全部的数据展示出来。
如果刚好20条数据,每页显示10条数据,2页刚好展示全部的数据。

import java.util.List;/*** @Author ꧁ʚVVcatɞ꧂* @Date 2020/6/15 12:20 星期一* @PackageName io.vvcat.domain* @ClassName PageBean* @Email: 206647497@qq.com* @CSDN: https://blog.csdn.net/qq_44989881* @Blog: vvcat.io**/public class PageBean<T> {private Integer pageNum;  // 第几页private Integer pageSize;  // 每页几条数据private Long totalSize;  // 总共多少条数据private Integer pageCount;   // 总共能分几页private List<T> data;   // 每页存储的数据public PageBean(Integer pageNum, Integer pageSize, Long totalSize, List<T> data){this.pageNum = pageNum;this.pageSize = pageSize;this.totalSize = totalSize;this.data = data;this.pageCount = (int)(this.totalSize%this.pageSize == 0 ?this.totalSize / this.pageSize:this.totalSize/this.pageSize + 1);}public Integer getPageNum() {return pageNum;}public void setPageNum(Integer pageNum) {this.pageNum = pageNum;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize = pageSize;}public Long getTotalSize() {return totalSize;}public void setTotalSize(Long totalSize) {this.totalSize = totalSize;}public Integer getPageCount() {return pageCount;}public void setPageCount(Integer pageCount) {this.pageCount = pageCount;}public List<T> getData() {return data;}public void setData(List<T> data) {this.data = data;}
}@Overridepublic String toString() {return "PageBean{" +"pageNum=" + pageNum +", pageSize=" + pageSize +", totalSize=" + totalSize +", pageCount=" + pageCount +", data=" + data +'}';}

在Dao接口中定义2个方法:

接口:

findByPage方法:当前页面的页码 和 页面能显示的最大数据量 作为参数返回通过mysql处理 显示当前页面对应的数据。
getCount方法:统计数据库数据的总量。

import domain.User;
import java.util.List;public interface UserDao {// 返回指定页面的数据List<User> findByPage(Integer pagNum, Integer pageSize);// 返回总的数据量long getCount();
}

实现Dao接口方法解析:

例如:
目前数据库数据:

调用findByPage方法

例如:
pageNum = 0; 从第几页开始显示
pageSize = 10; 显示10条数据

SELECT *
FROM USER
ORDER BY id  // 正序排列
LIMIT 0,10   // 数据库是从下标0 开始查找数据

参数:(pageNum-1) * pageSize
刚进入看到的页面为第一页,数据库LIMIT 是下标第0页开始查询,所以减去1。

getCount方法

统计数据库数据的总量。

例如:

import dao.UserDao;
import domain.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.DruidSourceUtils;import java.sql.SQLException;
import java.util.List;/*** @Author ꧁ʚVVcatɞ꧂* @Date 2020/6/17 12:20 星期五* @PackageName io.vvcat.dao.impl* @ClassName UserDaoImpl * @Email: 206647497@qq.com* @CSDN: https://blog.csdn.net/qq_44989881* @Blog: vvcat.io**/public class UserDaoImpl implements UserDao {@Overridepublic List<User> findByPage(Integer pageNum, Integer pageSize) {QueryRunner qr = new QueryRunner(DruidSourceUtils.getDataSource());try {return qr.query("select * from user order by id limit ?,?",new BeanListHandler<User>(User.class), (pageNum-1)*pageSize, pageSize);} catch (SQLException e) {e.printStackTrace();}return null;}@Overridepublic long getCount() {QueryRunner qr = new QueryRunner(DruidSourceUtils.getDataSource());try {return qr.query("select count(*) from user", new ScalarHandler<>());} catch (SQLException e) {e.printStackTrace();}return 0;}}

service层:

接口:

PageBean findByPage(Integer pageNum, Integer pageSize)方法:
将pageNum; pageSize; totalSize; pageCount; data; 这些参数通过 PageBean 返回给jsp页面。

public interface UserService {PageBean<User> findByPage(Integer pageNum, Integer pageSize);
}
接口实现:
public class UserServiceImpl implements UserService {@Overridepublic PageBean<User> findByPage(Integer pageNum, Integer pageSize) {UserDao studentDao = new UserDaoImpl();List<User> data = studentDao.findByPage(pageNum, pageSize);  // 根据条件获取数据库对应数据long totalSize = 0;totalSize = studentDao.getCount();  // 获取数据库可分多少页数据PageBean<User> pageBean = new PageBean<>(pageNum, pageSize, totalSize, data);  // 将以上2条方法封装在一起,返回给Servlet;if (pageNum > pageBean.getPageCount()){pageBean.setPageNum(pageBean.getPageCount());}return pageBean;}

工具类:


import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCUtil {static ComboPooledDataSource dataSource = null;static{dataSource = new ComboPooledDataSource();}public static DataSource getDataSouce() {return dataSource;}/*** 获取连接对象* @return* @throws SQLException*/public static Connection getConn() throws SQLException{return dataSource.getConnection();}/*** 释放资源* @param conn* @param st* @param rs*/public static void release(Connection conn , Statement st , ResultSet rs){closeRs(rs);closeSt(st);closeConn(conn);}public static void release(Connection conn , Statement st){closeSt(st);closeConn(conn);}private static void closeRs(ResultSet rs){try {if(rs != null){rs.close();}} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}private static void closeSt(Statement st){try {if(st != null){st.close();}} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}private static void closeConn(Connection conn){try {if(conn != null){conn.close();}} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}
}

Servlet:

import io.vvcat.been.PageBean;
import io.vvcat.been.User;
import io.vvcat.service.UserService;
import io.vvcat.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Author ꧁ʚVVcatɞ꧂* @Date 2020/6/19 18:02 星期五* @ProjectName PageSelect* @PackageName io.vvcat.Servlet* @ClassName ServletListUser* @Email: 206647497@qq.com* @Blog: vvcat.io* @CSDN: https://blog.csdn.net/qq_44989881* @Version 1.0**/
public class ServletListUser extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String pageNum = request.getParameter("pageNum");   // 获取前端页面传过来的页码String pageSize = request.getParameter("pageSize");   // 获取前端页面显示的数据int pageN = 0;int pageS = 0;if (pageNum==null||pageNum.trim().length()==0){   // 当第一次打开页面时是没有页码的,数据为null需要为页码赋值pageN = 1;}else {pageN=Integer.parseInt(pageNum);       if (pageN<1){      // 如果请求的页面小于 1 那么就将 pageN 赋值为 1 ,限制上一页请求传递过来的值是一个负数pageN=1;}}if (pageSize==null||pageSize.trim().length()==0){     // 为页面显示的数据进行初始化pageS=10;    // 如果此处修改为 8,那么每页最多只会显示 8 条数据,设置为 5 ,那么每页最多只会显示 5 条数据}else {pageS=Integer.parseInt(pageSize);   }UserService userService = new UserServiceImpl(); //  调用UserService  服务 PageBean<User> pageBean = userService.findByPage(pageN, pageS);  // 获取页面获取的值传递到数据库,获取对应的数据。request.setAttribute("pageBean", pageBean);request.getRequestDispatcher("/user.jsp").forward(request, response);  // 处理完成后返回user.jsp页面进行数据渲染。}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>user</display-name><welcome-file-list><welcome-file>index.html</welcome-file><!--<welcome-file>index.htm</welcome-file>--><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><!--<welcome-file>default.htm</welcome-file>--><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><description></description><display-name>ServletListUser</display-name><servlet-name>ServletListUser</servlet-name><servlet-class>io.vvcat.Servlet.ServletListUser</servlet-class></servlet><servlet-mapping><servlet-name>ServletListUser</servlet-name><url-pattern>/ServletListUser</url-pattern></servlet-mapping></web-app>

c3p0-config.xml

要对以下三条进行修改和确认

<property name="jdbcUrl">jdbc:mysql://localhost/studnets?serverTimezone=GMT%2B8</property>
<property name="user">root</property>
<property name="password">123456</property>
  • 设置 数据库连接地址 jdbcUrl
  • 设置 数据库的用户名 user
  • 设置 数据库密码 password

注: serverTimezone=GMT%2B8 防止在使用IDEA对高版本数据库连接时出现时区报错问题。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><!-- default-config 默认的配置,  --><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost/db?serverTimezone=GMT%2B8</property><property name="user">root</property><property name="password">123456</property><property name="initialPoolSize">10</property><property name="maxIdleTime">30</property><property name="maxPoolSize">100</property><property name="minPoolSize">10</property><property name="maxStatements">200</property></default-config><!-- This app is massive! --><named-config name="oracle"> <property name="acquireIncrement">50</property><property name="initialPoolSize">100</property><property name="minPoolSize">50</property><property name="maxPoolSize">1000</property><!-- intergalactoApp adopts a different approach to configuring statement caching --><property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property><!-- he's important, but there's only one of him --><user-overrides user="master-of-the-universe"> <property name="acquireIncrement">1</property><property name="initialPoolSize">1</property><property name="minPoolSize">1</property><property name="maxPoolSize">5</property><property name="maxStatementsPerConnection">50</property></user-overrides></named-config></c3p0-config>

信息展示页面:

首页:第一页对应页码设置为1,每次点击首页,将1传递到后台,进行查询数据。
上一页:点击上一页,会获取当前页码 - 1,传递到后台获取,上一页的数据。
下一页:点击下一页,会获取当前页码 + 1,传递到后台获取,下一页的数据。
尾页:将总共可分的页数(即最后一页),传递到后台,显示最后一页的数据。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><table border="1" cellspacing="0" cellpadding="10" width="500" height="250" align="center"><tr><td>学号</td><td>姓名</td><td>年龄</td></tr><c:forEach items="${pageBean.data}" var="user"><tr><td>${user.id}</td><td>${user.name}</td><td>${user.age}</td></tr></c:forEach></table><div align="center"><a href="${pageContext.request.contextPath}/ServletListUser?pageNum=1&pageSize=${pageBean.pageSize}">首页</a><a href="${pageContext.request.contextPath}/ServletListUser?pageNum=${pageBean.pageNum-1}&pageSize=${pageBean.pageSize}">上一页</a><a href="${pageContext.request.contextPath}/ServletListUser?pageNum=${pageBean.pageNum+1}&pageSize=${pageBean.pageSize}">下一页</a><a href="${pageContext.request.contextPath}/ServletListUser?pageNum=${pageBean.pageCount}&pageSize=${pageBean.pageSize}">尾页</a></div>
</body>
</html>
、

效果展示:



Java Web实现分页查询相关推荐

  1. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException...

    场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...

  2. 我爱Java系列---【分页查询】

    一.需求 查询每个分类下的商品详情 二.实现步骤 菜单页面拼接超链接,传递商品分类主键 分类商品页面接收分类主键数据,向服务器发送AJAX请求 Servlet接收客户端分类主键的数据 调用业务层方法组 ...

  3. Java Web的分页工具类

    最近写一个java web项目,以前分页的工具类,都是基础架构的人写好了的.也没有去细看,现在遇到这个状况. 就整理一下思路,自己写了一个分页的工具类.写的不好之处,还望斧正. 下面是我的代码: Pa ...

  4. java开发之分页查询

    工具类 package com.luer.comm.utils; import java.util.List; public class PageBean<T> { //已知数据 priv ...

  5. java的mysql分页查询语句怎么写_java的mysql连库 增删改查语句、分页查询语句大全...

    //代码复制出来,修改一下bean,加载一下jar包,能直接用的,不懂加我Q 983331283 package cn.tootoo.entity; public class Page { priva ...

  6. Java Mapper实现分页查询

    Mapper.java定义方法 List<Object> eventList_Done(@Param("pageNo") Integer pageNo,@Param(& ...

  7. Java Web -【分页功能】详解

    分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...

  8. java web oracle 分页_Oracle分页的两种方式

    第一种: select b.* from (select rownum as rid, a.* from om_cm_book_hotword a) b where b.rid <= 10 an ...

  9. Java web 数据库查询时候出现空指针异常

    Java web 数据库查询时候出现空指针异常 在做一个Java web项目时查询数据库总是报出空指针异常. 可能原因1: SQL语句中包含中文,MySQL服务器的字符编码格式不支持中文,导致无法识别 ...

最新文章

  1. 环球博览|中国六代机有望5年内问世
  2. Java核心技术点之多线程2
  3. 树莓派命令行配置无线网络和SSH远程登陆
  4. ITK:侵蚀二进制图像
  5. 深入互联网广告中的出价模式(上)— 基础出价模式
  6. 宝宝头三年至关重要,不看悔掉肠子
  7. 034 Android NavigationView和DrawerLayout实现抽屉式导航设计(侧边栏效果)
  8. 修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本
  9. repo + gerrit
  10. 关于Spring Cloud Eureka
  11. 场地预约小程序开发及前后端源码
  12. Android 选择国家对应区号 中英双版
  13. 华为的服务器固态硬盘LE系列和VE系列,02311TJY 800GB SSD FusionServer RH5885 V3华为服务器硬盘...
  14. 苹果官方付费升级内存_vivo用户必看!官方推出扩容服务,最高升级到128G!
  15. kafka安装和相关命令操作——修改中
  16. JavaScript之堆栈溢出
  17. 0CTF-2016-Web-piapiapia
  18. 如何实现excel服务器的用户管理和认证管理
  19. 智公网:公务员行测基础考点
  20. Revit建模快速剖面操作一键完成!

热门文章

  1. fir.im Weekly - 让 iOS 应用更加安全
  2. EMC与地之重新认识地
  3. DateTime格式大全
  4. [C/CPP系列知识] Type difference of character literals 和 bool in C and C++
  5. LVS DR模型配置示例
  6. jquery 选项卡插件
  7. HTML标签元素的分类
  8. HTML DOM Attribute 对象
  9. Android之自定义Adapter的ListView
  10. 软件架构最佳实践和案例分析