学习记录-mybatis+vue+elementUi实现分页查询(后端部分)

news2024/11/19 15:35:58

这一部分的实现确实让我学到不少东西。不管是后端还是前端部分的实现。

  1. 首先需要明确的是,实现分页查询,我们需要从前端获取到几个参数?第一个是当前在第几页,第二个是每一页有多少个值。分别叫做:currentPage和pageSize。

  2. 其次,明确我们从后端拿到哪些数据给前端输出?第一个是当前页的数据内容,这个结果是一个集合;第二个是所有数据的总数,这个结果就是一个数字。

  3. 最后,怎么把它们封装成一个东西传给后端呢?答案是用对象来,新增一个pageBean对象,这个对象里面就装两个属性,一个集合,一个数字。接下来是实现部分。

后端的实现我分为4步来实现

步骤一 ①准备好PageBean

以后这里面就用来存储返回给前端的内容。


import java.util.List;

//分页查询的JavaBean
public class PageBean<T> {

    //总记录数
    private  int totalCount;

    //当前页数据
    private List<T> rows;

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public List<T> getRows() {
        return rows;
    }

    public void setRows(List<T> rows) {
        this.rows = rows;
    }


}

但是这里也有小细节需要注意。


那就是集合的类型。
在这里插入图片描述

集合需要传递什么类型呢?brand表用brand对象,user表用user对象,为了代码的复用性,这里干脆不设置类型,直接设置一个泛型,以后什么表就用什么类型。那当然,这里使用了泛型,类名的地方就需要有。
在这里插入图片描述

步骤二 ②写SQL代码

SQL就需要查询两个内容,第一个是当前页的数据,另一个是总数。总数好查,直接就一个方法count(*)就🆗,这个根据页面来进行查询确实在学习MySQL时忘了,其实就是:查询索引从1开始的5条数据。这种题改造过来的。

代码:

 /**
     * 分页查询
     * @param begin
     * @param size
     * @return
     */
    @Select("select * from tb_brand limit #{begin}, #{size}")
    @ResultMap("brandResultMap")
    List<Brand> selectByPage(@Param("begin") int begin, @Param("size")int size);

    /**
     * 查询总记录数
     * @return
     */
    @Select("select count(*) from tb_brand")
    int selectTotalCount();

SQL语句中主要就是limit这个关键字,一般用的少,所以没有记住。传进来一个起始值,和一个大小,返回这个区间的一个结果集合。

步骤三 ③service层代码

  1. 老规矩,还是接口这部分的内容。

这里写的代码还确实跟以前不一样,让我不看代码来回忆回忆。首先看返回的类型–PageBean对象,其次确定泛型的值,是brand类型。最后是需要传入的值,分析好几遍了就不分析了。下面是代码:

/**
     * 分页查询
     * @param currentPage 当前页码
     * @param pageSize  每页展示条数
     * @return
     */
    PageBean<Brand> selectByPage(int currentPage, int pageSize);
  1. 实现部分代码:
    这里和之前也是有许多需要注意的点,能确定的是最后我们返回的是一个pagebean对象,那挨个分析。
    ① 第一个是根据当前页和大小来获取一个集合结果,当前页是currentPage,这里需要计算一下,开始的索引是多少,我们要将开始的索引传给SQL,这里是计算方法:int begin = (currentPage -1) * pageSize;,索引的大小等于现在我们处于多少页减去一,再乘以这个页面的大小。比如说我们每一页展示5个数据,现在我们正处于第一页,那索引就是0,将0和5这两个数据传给SQL去执行,返回的就是第一到第五条数据。同理,假如我们现在每一页还是展示5个数据,现在处于第二页,那索引就是2减一再乘以5,等于5,那么我们需要传给SQL的就是,1和5这两个值。
    ② 第二个是查询有多少条数据,这个不需要任何参数,只单纯是一个查询。
    最后将结果进行封装和返回就可以了。
    代码:
@Override
   public PageBean<Brand> selectByPage(int currentPage, int pageSize) {

       SqlSession sqlSession = sqlSessionFactory.openSession();
       BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

       //计算开始索引
       int begin = (currentPage -1) * pageSize;
       //查询的条目数(总数)
       int size = pageSize;

       //查询当前页数据
       List<Brand> rows = mapper.selectByPage(begin, size);

       //查询总记录数
       int totalCount = mapper.selectTotalCount();

       //封装成PageBean对象
       PageBean<Brand> PageBean = new PageBean<>();
       PageBean.setRows(rows);
       PageBean.setTotalCount(totalCount);

       //释放资源
       sqlSession.close();

       return PageBean;
   }

步骤四 ④ servlet代码

这部分代码也是跟以前不一样。

  1. 首先就是,前端怎么把值穿过来?之前只传对象和值,现在怎么传递这个变动的值?我想的是传递一个数组到servlet,这个数组就负责告诉servlet我现在的pagesize以及目前处于的索引。但是跟着老师学是使用在url中进行传值 url?currentPage=1&pageSize=5,最后通过request,来取值。也是开拓了一个思路。

  2. 之后需要将取到的值转换成int类型的。最后调用方法,转json,还是以前的套路。就是返回的是pagebean对象以及将pagebean对象转为json对象,一下子还没有适应过来。

/**
     * 分页查询
     * @param request
     * @param response
     * @throws IOException
     */
    public void selectByPage(HttpServletRequest request, HttpServletResponse response) throws IOException {
       //1.接收参数: 当前页码 和 每页分的条目数  url?currentPage=1&pageSize=5
        String _currentPage = request.getParameter("currentPage");
        String _pageSize = request.getParameter("pageSize");

        //转换成int类型的
        int currentPage = Integer.parseInt(_currentPage);
        int pageSize = Integer.parseInt(_pageSize);

        //调用service进行查询
        PageBean<Brand> pageBean = brandService.selectByPage(currentPage, pageSize);

        //2. 转为json
        String jsonString = JSON.toJSONString(pageBean);

        //3. 防止乱码以及写数据
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }

总结

总的来说,这里更多的是开拓思路,分页查询的SQL、存储pageBean、泛型的使用、索引的计算、从前端通过request取值的思想这一切都感觉很新奇,但是这一切其实让我们去做都应该是在能力之内的事。还是,多进行学习,开拓思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis集群之AKF架构原理

当我们搭建集群之前&#xff0c;先要想明白需要解决哪些问题&#xff0c;搞清楚这个之前先回想一下单节点、单实例、单机有哪些问题&#xff1f; 单点故障&#xff1a;只有一台Redis的话&#xff0c;如果出现故障&#xff0c;那么整个服务都不可用缓存容量&#xff1a;单台Red…

【Django项目开发】用户注册模型类、序列化器类、视图类设计(三)

文章目录一、模型类设计1、Django认证系统提供了用户模型类User&#xff0c;为什么还要定义User模型类?2、AbstractUser3、自定义用户模型类的字段有4、User模型类编写好了就可以了吗?二、序列化器类设计1、注意2、单字段进行校验3、用户认证的时候为什么不用create,而用crea…

C++构造函数和析构函数

&#xff08;一&#xff09;构造函数 要点 定义&#xff1a;构造函数 &#xff0c;是一种特殊的方法。主要用来在创建对象时初始化对象&#xff0c; 即为对象成员变量赋初始值&#xff0c;总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 &#xff0…

网络协议知识串讲-第38讲-用双十一的故事串起碎片的网络协议(中)

上一节我们讲到,手机App经过了一个复杂的过程,终于拿到了电商网站的SLB的IP地址,是不是该下单了? 别忙,俗话说的好,买东西要货比三家。大部分客户在购物之前要看很多商品图片,比来比去,最后好不容易才下决心,点了下单按钮。下单按钮一按,就要开始建立连接。建立连接…

Spring Cache(边路缓存)

一、Spring Cache介绍 Spring Cache 是Spring - context-xxx.jar中提供的功能&#xff0c;可以结合EHCache&#xff0c;Redis等缓存工具使用。给用户提供非常方便的缓存处理&#xff0c;缓存基本判断等操作,可以直接使用注解实现。 ​ 在包含了Spring - context-xxx.jar的Spri…

07---vue前端实现增删改查

前端VUE通过请求后端实现增删改查&#xff0c;文末会有前端完整代码 1、实现查询功能 一、实现三个条件一起查询 后台需要实现这三个条件的模糊查询 UserController.java //分页查询GetMapping("/page")public IPage<User> findPage(RequestParam Integer p…

【Jenkins】学习笔记

学习笔记一、Jenkins1.1、Jenkins的作用二、下载安装2.1、安装环境2.2、安装GitLab2.3、安装Jenkins三、Jenkins Git Maven 部署配置3.1、安装maven插件3.2、新建项目3.3、自动发布到测试服务器四、publish over ssh 配置4.1、超时机制4.2、shell的日志输出4.3、运行前清理五…

网络地址转换NAT

目录 IP 地址空间即将面临耗尽的危险 NAT 缓解 IP 地址空间耗尽的问题 NAT 的基本方法 VPN 的要点 IP 地址空间即将面临耗尽的危险 互联网采用了无分类编址方式、动态分配IP地址等措施来减缓IP地址空间耗尽的速度 但由于互联网用户数目的激增&#xff0c;特别是大量小型办公…

Linux搭建DHCP服务

DHCP(Dynamic Host Confifuration Protocol,动态主机配置协议)它可以为客户自动分配IP地址、以及缺省网关、DNS服务器的IP地址等TCP/IP参数。 简单说,就是在DHCP服务器上有一个存放着IP地址、网关、DNS等参数。当客户端请求使用时,服务器则负责将相应的参数分配给客户端,…

win10环境下基于face_recognition搭建自己的人脸识别软件

在win10环境下安装face_recognition&#xff0c;了解face_recognition中api的使用&#xff0c;如人脸截取、人脸矫正、人脸特征提取、人脸关键点提取、人脸mask获取、人脸特征比对等功能。最后构建自己的人脸数据库&#xff0c;使用knn实现人脸识别软件。 1、安装face_recogni…

【圣诞特辑】码一个漂漂亮亮的圣诞树(Single Dog版)

目录 前言 一、C语言版圣诞树 1.代码实现 2.效果图 二、python版圣诞树 1.代码实现 2.效果图​ 三、html5版圣诞树 1.代码实现 2.效果图 总结 前言 圣诞节即将来临&#xff0c;圣诞树也是必不可少的装饰之一。圣诞树是一棵绿叶繁茂的树&#xff0c;上面挂满了彩色的灯…

Nginx学习笔记2【尚硅谷】

host文件修改时&#xff0c;可以更改用户组权限或者复制到某个有权限的位置修改完再复制替换之前的文件。 在server{}中&#xff0c;listenserver_name两个加一起是唯一的。 代理服务器就是一个网关。 配置Nginx反向代理&#xff1a; 注意&#xff1a;在写proxy_pass时&#xf…

java+selenium环境搭建

目录 1.写在前面的话: 2.下载谷歌驱动 3.添加Selenium依赖(我这里添加的是4.0.0版本的) 4.在操作过程中可能出现的问题&解决办法 目录 1.写在前面的话: 2.下载谷歌驱动 3.添加Selenium依赖(我这里添加的是4.0.0版本的) 1.写在前面的话: (1)java版本最低要求为8,Chro…

SpringBoot整合Activemq

目录 一、Pom.xml 二、Spring配置文件 三、队列 四、主题 一、Pom.xml <dependencies><!-- activemq核心依赖包 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>…

终生学习——读书有什么坏处

一般爱读书者往往受到赞扬&#xff0c;但仍然需要谨记一些读书的原则 目录 一、读书的整体观点 二、为什么需要知道读书的坏处 三、何时会出现读书的坏处 四、读书有什么坏处 1、100%全部相信书中的观点&#xff0c;进而实践了错误观点 2、不实践 五、如何杜绝读书的害处…

程序员为了少加班想了这几招

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

一个简单的Linux内核字符驱动程序编写

一、背景 为了了解设备驱动程序的框架&#xff0c;在此编写一个简单的字符驱动程序&#xff0c;以此来对驱动程序的框架进行一个简单的了解。 二、设备驱动程序 所谓设备驱动程序&#xff0c;其实就是计算机硬件与外部设备进行通信的接口。由于硬件设备各式各样&#xff0c;…

【Ctfer训练计划】——(四)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

【kafka】学习笔记(三)

学习笔记七、Kafka-Eagle 监控7.1 环境准备7.2 Eagle 安装7.3、修改配置文件7.4、添加环境变量7.5、启动Eagle八、Kafka-Kraft 模式8.1、Kafka-Kraft 集群部署8.2、初始化集群数据目录8.3、启动 kafka 集群8.4、测试8.5、集群启动脚本九、SpringBoot集成Kafka七、Kafka-Eagle 监…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.3 Routing 路由模式

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.3 Routing 路由模式4.3.1 模式说明4.3.2 代码编写4.3.3 小结第一天 基础 4 RabbitMQ 的工作模式 4.3 Routing 路由模式 4.3.1 模式说明 …