热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MyBatis学习——第五篇(手动分页和pagehelper分页实现)

1:项目场景介绍在项目中分页是十分常见的功能,一般使用插件实现分页功能,但是在使用插件之前我们首先手动写出分页代码,对比插
1:项目场景介绍

在项目中分页是十分常见的功能,一般使用插件实现分页功能,但是在使用插件之前我们首先手动写出分页代码,对比插件实现的分页,利于我们理解分页底层实现和更好的实现插件分页实用技术,本次使用的插件是PageHelper(采用都是物理分页)

在开始之前我们创建两个表,分别是t_user和person表,并且插入大量的数据。

t_user建表语句:

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

person建表语句:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `gender` varchar(255) DEFAULT NULL,
  `dept_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

 

2:手动分页查询针对user表数据

 项目首页:

<%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"utf-8"%>
<%
String path &#61; request.getContextPath();
String basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";
%>
">

index.jsp



首先开始我们的手动分页&#xff0c;核心是一个分页page类&#xff0c;里面有用于分页的各种属性

package com.thit.util;import java.util.List;/*** 抽象出来的分页类*/
public class PageUtil {private int currentPageNum; //当前要看哪一页&#xff0c;当前页private int pageSize&#61;10;//每页显示的条数&#xff0c;页面显示数据条数private int totalSize;//总记录条数&#xff0c;总行数private int startIndex;//查询开始记录的索引 limit ? ? 开始索引private int totalPageNum;//总页数private int prePageNum;//上一页private int nextPageNum;//下一页private List records;//当前页的记录集//用于显示页面上的导航的页号 用户可自定义//开始页码private int startPageNum;//结束页码private int endPageNum;private String url;//使用构造方法&#xff0c;传递必要的两个参数.第一个是页码&#xff0c;第二个总记录条数public PageUtil(int currentPageNum,int totalrecords){this.currentPageNum&#61;currentPageNum;this.totalSize&#61;totalrecords;//计算开始记录索引this.startIndex&#61;(currentPageNum-1)*pageSize;//计算总页数this.totalPageNum&#61;totalSize%pageSize&#61;&#61;0?totalSize/pageSize:totalSize/pageSize&#43;1;this.prePageNum&#61;getPrePageNum1();this.nextPageNum&#61;getNextPageNum1();//计算开始和结束页号 这个根据自身可设计if(totalPageNum>9){ //如果总页数大于9 开始页面startPageNum&#61;currentPageNum-4;//结束页面endPageNum&#61;currentPageNum&#43;4;if(startPageNum<1){startPageNum&#61;1;endPageNum&#61;startPageNum&#43;8;}if(endPageNum>totalPageNum){endPageNum&#61;totalPageNum;startPageNum&#61;endPageNum-8;}}else{startPageNum&#61;1;endPageNum&#61;totalPageNum;}}public int getStartPageNum() {return startPageNum;}public void setStartPageNum(int startPageNum) {this.startPageNum &#61; startPageNum;}public int getEndPageNum() {return endPageNum;}public void setEndPageNum(int endPageNum) {this.endPageNum &#61; endPageNum;}//得到上一页方法public int getPrePageNum1() {System.out.println("得到上一页方法");//上一页等于当前页减1prePageNum&#61;currentPageNum-1;//如过上一个小于0if(prePageNum<&#61;0){ //上一页等于1System.out.println("上一页小于0");prePageNum&#61;1;}return prePageNum;}//得到下一页方法public int getNextPageNum1() {//下一页等于当前页加1System.out.println("得到下一页的方法");nextPageNum&#61;currentPageNum&#43;1;//如果下一页大于总页数if(nextPageNum>totalPageNum){ //下一页等于总页数System.out.println("下一页大于总页数");nextPageNum&#61;totalPageNum;}return nextPageNum;}public int getPrePageNum() {return prePageNum;}public int getNextPageNum() {return nextPageNum;}public int getCurrentPageNum() {return currentPageNum;}public void setCurrentPageNum(int currentPageNum) {this.currentPageNum &#61; currentPageNum;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize &#61; pageSize;}public int getTotalSize() {return totalSize;}public void setTotalSize(int totalSize) {this.totalSize &#61; totalSize;}public int getStartIndex() {return startIndex;}public void setStartIndex(int startIndex) {this.startIndex &#61; startIndex;}public int getTotalPageNum() {return totalPageNum;}public void setTotalPageNum(int totalPageNum) {this.totalPageNum &#61; totalPageNum;}public List getRecords() {return records;}public void setRecords(List records) {this.records &#61; records;}public void setPrePageNum(int prePageNum) {this.prePageNum &#61; prePageNum;}public void setNextPageNum(int nextPageNum) {this.nextPageNum &#61; nextPageNum;}public String getUrl() {return url;}public void setUrl(String url) {this.url &#61; url;}&#64;Overridepublic String toString() {return "PageUtil [currentPageNum&#61;" &#43; currentPageNum &#43; ", pageSize&#61;" &#43; pageSize &#43; ", totalSize&#61;" &#43; totalSize&#43; ", startIndex&#61;" &#43; startIndex &#43; ", totalPageNum&#61;" &#43; totalPageNum &#43; ", 上一页&#61;" &#43; prePageNum&#43; ", 下一页&#61;" &#43; nextPageNum &#43; ", records&#61;" &#43; records &#43; ", startPageNum&#61;" &#43; startPageNum&#43; ", endPageNum&#61;" &#43; endPageNum &#43; ", url&#61;" &#43; url &#43; "]";}}

然后是Servlet:

package com.thit.web;
import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.thit.service.Userservice;
import com.thit.serviceimpl.UserserviceImpl;
import com.thit.util.PageUtil;&#64;WebServlet("/servlet/UserServlet")
public class UserServlet extends HttpServlet{Userservice userservice&#61;new UserserviceImpl();/*** */private static final long serialVersionUID &#61; 1L;&#64;Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("首先进入doget");String para&#61;req.getParameter("method");System.out.println("方法参数&#xff1a;"&#43;para);if(para.equals("all")) {//查询所有用户信息selectAllUsers(req,resp);}}private void selectAllUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubString num&#61;req.getParameter("num");//第一次传递 num为空System.out.println("num的值是&#xff1a;"&#43;num);if(null&#61;&#61;num) {num&#61;"1";}PageUtil page&#61;userservice.getAllusers(num);System.out.println(page.toString());req.setAttribute("page",page);//转发到新的页面req.getRequestDispatcher("/users.jsp").forward(req, resp);}&#64;Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("首先进入doPost");this.doGet(req, resp);}}

接着是service接口和实现类&#xff1a;

package com.thit.service;import java.util.List;import com.thit.entity.Person;
import com.thit.util.PageUtil;public interface Userservice {
//查询userpublic PageUtil getAllusers(String num);
//查询personpublic List getAllperson();
}-------------------实现类-----------------
package com.thit.serviceimpl;import java.util.List;import org.apache.commons.dbutils.DbUtils;import com.thit.dao.Userdao;
import com.thit.daoimpl.Userdaoimpl;
import com.thit.entity.Person;
import com.thit.entity.User;
import com.thit.service.Userservice;
import com.thit.util.PageUtil;public class UserserviceImpl implements Userservice {Userdao dao&#61;new Userdaoimpl();public PageUtil getAllusers(String num) {// TODO Auto-generated method stubint currentPageNum&#61;1;//如果当前页不为空&#xff0c;当前页等于numif(num!&#61;null&&!num.trim().equals("")) {currentPageNum&#61;Integer.parseInt(num);}//查询总行数方法int totalPageNum&#61;dao.getTotalSize();System.out.println("查询总行数&#xff1a;"&#43;totalPageNum);//当前页 和 总行数PageUtil pageUtil&#61;new PageUtil(currentPageNum, totalPageNum);//根据开始下标和行数查询出来每页的数据List list&#61;dao.getAllusers(pageUtil.getStartIndex(), pageUtil.getPageSize());for(User u:list) {System.out.println(u);}pageUtil.setRecords(list);return pageUtil;}public List getAllperson() {List lists&#61;dao.getAllperson();return lists;}}

dao层和实现类&#xff1a;

package com.thit.dao;import java.util.List;import com.thit.entity.Person;
import com.thit.entity.User;public interface Userdao {//手写分页查询user数据List getAllusers(int startIndex,int pagesize) ; //开始索引和页面条数//查询表数据条数int getTotalSize();//pagehelper查询所有person数据List getAllperson();
}-----------------------dao实现类------------------------
package com.thit.daoimpl;public class Userdaoimpl extends BaseDao implements Userdao {Dbtools dbtools&#61;new Dbtools();//手写查询分页public List getAllusers(int startIndex, int pagesize) {// TODO Auto-generated method stubString sql &#61; "select * from t_user limit ?,?";List lists &#61; new ArrayList();try {//通过工具类jdbc连接数据库Connection connection &#61; getConnection();PreparedStatement pStatement &#61; connection.prepareStatement(sql);pStatement.setInt(1, startIndex);pStatement.setInt(2, pagesize);ResultSet re &#61; pStatement.executeQuery();while (re.next()) {int id &#61; re.getInt("id");String username &#61; re.getString("username");String password &#61; re.getString("password");String address &#61; re.getString("address");User user &#61; new User(id, username, address);lists.add(user);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return lists;}// 查询总记录数public int getTotalSize() {// TODO Auto-generated method stubint count&#61;0;try {String sql &#61; "select count(*) as num from t_user";Connection connection &#61; getConnection();PreparedStatement pStatement &#61; connection.prepareStatement(sql);ResultSet re &#61; pStatement.executeQuery();while (re.next()) {count&#61; re.getInt("num");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return count;}//pagehelper分页public List getAllperson() {// mybatis查询SqlSession sqlsession &#61; dbtools.getSession();PersonMapper personMapper&#61;sqlsession.getMapper(PersonMapper.class);List lists&#61;personMapper.getAllPersons();return lists;}}

最后的页面展示代码jsp如下&#xff1a;

<%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"utf-8"%>
<%&#64; taglib uri&#61;"http://java.sun.com/jsp/jstl/core" prefix&#61;"c"%>
<%String path &#61; request.getContextPath();String basePath &#61; request.getScheme() &#43; "://" &#43; request.getServerName() &#43; ":" &#43; request.getServerPort()&#43; path &#43; "/";System.out.println("path:"&#43;path);System.out.println("basePath:"&#43;basePath);%>


">




分页展示数据


idusernameaddress
${user.id}${user.username}${user.address}
<%-- <%&#61;request.getAttribute(“userlist”) %> 等价于$ { requestScope.userlist } --%>用户表共${requestScope.page.totalSize}条数据
用户表共${requestScope.page.totalPageNum}页
servlet/UserServlet?method&#61;all&num&#61;2">第二页
首页上一页${num}下一页末页跳转到
${num}



手动分页结果显示如下&#xff1a;

 3&#xff1a;pegeHelper插件分页针对user表数据

pegeHelper插件分页只是几个部分

第一&#xff1a;需要的mybatis的配置文件中配置插件

第二&#xff1a;在servlect中使用PageHelper的startPage方法

第三&#xff1a;PageHelper拦截器会拦截查询方法&#xff0c;并且在查询的sql中根据不同的数据库拼接分页语句实现分页

第四&#xff1a;将PageInfo这个类存放分页的各种属性信息&#xff0c;核心代码就这三行&#xff0c;num的值由页面传递过来

         Page page&#61;PageHelper.startPage(Integer.valueOf(num), 10)&#xff1b;
         List persons&#61;userservice.getAllperson();
         PageInfo pageHepler&#61;page.toPageInfo();

需要添加mybatis配置文件和mapper


PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

---------------------下边的为PersonMapper配置文件-----------------


然后servlet如下&#xff1a;

package com.thit.web;import java.io.IOException;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.thit.entity.Person;
import com.thit.service.Userservice;
import com.thit.serviceimpl.UserserviceImpl;
import com.thit.util.PageUtil;&#64;WebServlet("/servlet/UserServlet2")
public class UserServlet2 extends HttpServlet{Userservice userservice&#61;new UserserviceImpl();/*** */private static final long serialVersionUID &#61; 1L;&#64;Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("首先进入doget");String para&#61;req.getParameter("method");System.out.println("方法参数&#xff1a;"&#43;para);if(para.equals("all")) {//查询所有用户信息selectAllUsers(req,resp);}}private void selectAllUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubString num&#61;req.getParameter("num");//第一次传递num为页数 num为空System.out.println("num的值是&#xff1a;"&#43;num);if(null&#61;&#61;num) {num&#61;"1";}//第二种&#xff0c;Mapper接口方式的调用&#xff0c;页数和页面显示条数Page page&#61;PageHelper.startPage(Integer.valueOf(num), 10);List persons&#61;userservice.getAllperson();PageInfo pageHepler&#61;page.toPageInfo();req.setAttribute("persons", persons);req.setAttribute("pagehelper", pageHepler);//转发到新的页面req.getRequestDispatcher("/persons.jsp").forward(req, resp);}&#64;Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("首先进入doPost");this.doGet(req, resp);}}

service和dao层在上边的代码中已经贴出来了。

页面展示代码如下&#xff1a;

<%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"utf-8"%>
<%&#64; taglib uri&#61;"http://java.sun.com/jsp/jstl/core" prefix&#61;"c"%>
<%
String path &#61; request.getContextPath();
String basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";
%>
">


idusernameaddress
${person.id} ${person.username}${person.email}
共${requestScope.pagehelper.total}条/共${requestScope.pagehelper.pages}页FirstPage首页上一页${num}下一页末页跳转到


最后的展示效果如下&#xff1a;


推荐阅读
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 1.创建目录mkdir-phomerocketmqnamesvr1data&&mkdir-phomerocketmqnamesvr1log&&mkdir-phomerocketm ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在JUnit测试框架中,确保@Test注解的方法按特定顺序执行是常见的需求。本文总结了三种实现这一目标的策略。首先,介绍了通过方法名称排序来控制执行顺序的基本方法。其次,推荐了一种利用依赖管理插件的方式,这种方法更为灵活且易于维护。最后,探讨了使用第三方库如TestNG或Jupiter扩展来实现更复杂的顺序控制。每种方法都有其适用场景和优缺点,开发者可以根据具体需求选择最合适的方案。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
author-avatar
婷婷Yo-jiang_373
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有