热门标签 | 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;


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
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社区 版权所有