学习记录-mybatis+vue+elementUi实现分页条件查询

news2024/11/19 19:24:45

因为前端并不难,这里前后端就一起实现。一共分为四个步骤

步骤一 ① SQL部分

分页条件查询其实就是在分页的基础上增加条件,这里有两个主要的函数需要去实现,一个是根据分页以及条件去查询数据,另一个是根据条件去统计数据。
明显第二个更为简单,先从第二个开始分析。

  1. 根据条件统计满足条件的数量。
    原本统计的SQL只需要一句:select count(*) form 表名。完事儿了,这就可以统计所有的条目数。现在的需求是什么,假设用户添加了条件:我想看品牌名称是华为的。那么只需要在SQL后面添加条件就可以了。因此这个的SQL还是很好实现的。只消注意的是,这里需要使用动态SQL,因为用户非常大的可能不会一次全部都输入。
    在这里插入图片描述
    实现该统计的SQL如下:
    mapper部分
/**
     * 根据条件查询总记录数
     * @return
     */

    int selectTotalCountByCondition(Brand brand);

xml中实现部分

<select id="selectTotalCountByCondition" resultType="java.lang.Integer">
        select count(*) from tb_brand
        <where>
            <if test=" brandName != null and  brandName != '' ">
                and brand_name like #{ brandName}
            </if>
            <if test=" companyName != null and  companyName != '' ">
                and company_name like #{ companyName}
            </if>
            <if test=" status != null">
                and status like #{ status}
            </if>

        </where>
    </select>
  1. 根据条件以及分页来查询数据。这里要的是什么数据,打个比方说:用户想要品牌名称为华为的所有结果,而且,我还要进行分页展示。那分页我们之前写了吧,只需要传入当前页以及页面大小就可以了,那只需要添加条件就可以了。这里的代码比较复杂,没有使用注解开发。

mapper部分

/**
     * 分页条件查询
     * @param begin
     * @param size
     * @return
     */

    List<Brand> selectByPageAndCondition(@Param("begin") int begin, @Param("size")int size, @Param("brand")Brand brand);

这里我就要讲两句了,看下图,可以对照前面查询总记录数传入的参数来看,人家怎么没写注解呢?因为人家只有一个参数,不需要注解。但是咱们这里有三个参数,不仅是需要注解,还需要使用注解里面的值。

在这里插入图片描述
xml实现部分

<select id="selectByPageAndCondition" resultMap="brandResultMap">
        select * from  tb_brand
        <where>
            <if test="brand.brandName != null and brand.brandName != '' ">
                and brand_name like #{brand.brandName}
            </if>
            <if test="brand.companyName != null and brand.companyName != '' ">
                and company_name like #{brand.companyName}
            </if>
            <if test="brand.status != null">
                and status like #{brand.status}
            </if>

        </where>
        limit #{begin}, #{size}

    </select>

因此呢这里可以小结一下


如果我们只有一个参数,比如只需要传入brand对象,那里面可以直接使用它里面的属性, <if test=" brandName != null and brandName != '' ">,像这一条,brandName是它里面的属性吧,没事直接用。


但是如果有多个参数需要传递就必须要使用注解了,一旦要使用注解,那对象里面的属性就不能直接使用了,比如说你要这么用:brand.brandName != null

步骤二 ② service层部分

  1. 老规矩,接口这一块。

接口这里和之前写的分页查询查不到哪里去,唯二的区别就是方法名改变了、传入的参数多了一个brand对象。下面是代码:

 /**
     * 分页条件查询
     * @param currentPage 当前页码
     * @param pageSize  每页展示条数
     * @return
     */
    PageBean<Brand> selectByPageAndCondition(int currentPage, int pageSize, Brand brand);
  1. serviceImpl这一块

这一块的话总体其实也有什么变化的,主要就是需要换一下方法名,还有比较重要的工作就是,处理brand的查询条件,这里搞成模糊查询,其实就是把比如说的华为,从对象里拿出来,左右两边拼接一下百分号,再存到对象里面。主要进行模糊查询代码:

//处理brand条件 模糊表达式
        String brandName = brand.getBrandName();
        if(brandName != null && brandName.length() > 0){
            brand.setBrandName("%" +brandName +  "%");
        }

        String CompanyName = brand.getCompanyName();
        if(CompanyName != null && CompanyName.length() > 0){
            brand.setCompanyName("%" +CompanyName +  "%");
        }

总体的代码:

@Override
    public PageBean<Brand> selectByPageAndCondition(int currentPage, int pageSize, Brand brand) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

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

        //处理brand条件 模糊表达式
        String brandName = brand.getBrandName();
        if(brandName != null && brandName.length() > 0){
            brand.setBrandName("%" +brandName +  "%");
        }

        String CompanyName = brand.getCompanyName();
        if(CompanyName != null && CompanyName.length() > 0){
            brand.setCompanyName("%" +CompanyName +  "%");
        }

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

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

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

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

        return PageBean;
    }

步骤三 ③servlet这一块

这里比之前分页查询就多加了一步。想一想多加了什么。条件嘛。什么条件?其实就是一个brand对象,我们要从前端把这个brand对象接收过来,至于当前页和页面大小之前不是写过嘛,直接使用就可以了。那这里的工作主要就是:复制、粘贴、改一下函数名、接收一下传过来json版本的brand对象,转成我们能用的Java对象。下面是总体的代码:


/**
     * 分页条件查询
     * @param request
     * @param response
     * @throws IOException
     */
    public void selectByPageAndCondition(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);

        //获取查询条件对象
        BufferedReader br = request.getReader();
        String params = br.readLine();//这个就是接收到的参数字符串
        //转为brand类型
        Brand brand = JSON.parseObject(params, Brand.class);

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

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

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

步骤四④前端这一块

前端需要传值嘛。传什么值?之前element已经给我们定义好了,输入条件之后自然会给我们封装好一个brand对象,只要把这个brand对象传过去就可以了。那就设置一下,点击下面的查询按钮,我们重新进行查询,刷新一下界面呗。就一句代码,调用查询的方法就可以。
在这里插入图片描述
在这里插入图片描述
那查询这个方法怎么把数据传到后台去呢?这里将之前的get方法改成了post方法,我们再传个参数–brand对象。下面是实现部分代码:

var that  = this;
                axios({
                    method:"post",
                    url:"http://localhost:8080/brand/selectByPageAndCondition?currentPage="+that.currentPage +"&pageSize=" + that.pageSize,
                    data:that.brand
                }).then(function (resp){
                    //设置表格数据
                    that.tableData =  resp.data.rows;
                    //设置总记录数
                    that.totalCount = resp.data.totalCount;
                })

也就是说,这里级使用了在url中发送数据的方式,又使用了post传送brand对象的方式。


多学一个 resp=>的使用:
可以看到,在axios里面的then中,不能直接使用this,必须先用一个that或者其他来代替。那将function直接替换成resp=>{}。上面的代码可以写成这样:

                axios({
                    method:"post",
                    url:"http://localhost:8080/brand/selectByPageAndCondition?currentPage="+this.currentPage +"&pageSize=" + this.pageSize,
                    data:this.brand
                }).then(resp=>{
                    //设置表格数据
                    this.tableData =  resp.data.rows;
                    //设置总记录数
                    this.totalCount = resp.data.totalCount;
                })

这样就不需要给this换成其他的值了。
可以看到,效果还是一样的。
在这里插入图片描述

总结一下。

和分页查询相比,其实就是多了一个条件,我们需要做的其实就是将对象传回去。那改动比较大的就是SQL部分,因为这一部分添加了动态SQL,但是大部分也可以根据之前的内容进行粘贴复制。其次就是service层的改动,这里需要我们做一个小处理:模糊查询。后面的servlet和前端部分只需要传值和接收,改动不大。

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

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

相关文章

结构体嵌套函数指针

这次来记录一下结构体嵌套函数指针 这个知识点想了2天终于搞懂了。 先看代码&#xff0c;试着理解一下&#xff0c;不理解再看我后面的解释。 解释&#xff1a; 首先&#xff0c;和平常创建一个结构体一样&#xff0c;唯独不同的就是里面的变量是一个函数指针&#xff0c;关…

Spring Bean作用域

目录 什么是作用域呢 ? 那什么又是Spring Bean的作用域呢 ? Spring框架默认Bean作用域是什么呢 ? Spring Bean的作用域都有哪些呢 ? 如何设置Bean作用域 什么是作用域呢 ? 在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围…

fpga实操训练(signal tap调试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 编写软件的同学都知道&#xff0c;如果需要调试软件的话&#xff0c;除了要学会打印信息日志之外&#xff0c;另外一个很重要的方面&#xff0c;就…

http 库的服务端实现

前言 net/http 库的客户端实现(上) net/http 库的客户端实现(下) net/http 库的服务端实现 上两篇文章介绍了 http 客户端的实现&#xff0c;这篇文章看一下服务端的实现 服务端 使用 net/http 库可以快速搭建HTTP服务&#xff0c;HTTP服务端主要包含两部分&#xff1a; …

5G无线技术基础自学系列 | 5G网络切换问题分析

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 无线通信的最大特点在于其具有移动性&a…

提高搜狗PR最好的方法与搜狗PR权重在线查询

搜狗PR是什么? 搜狗PR值全称为搜狗PageRank(网页级别)&#xff0c;是搜狗用于用来标识网页的等级、重要性的一种方法&#xff0c;是搜狗用来衡量一个网站的好坏的重要标准之一。 搜狗在揉合了诸如Title标识和Keywords标识等所有其它因素之后&#xff0c;通过PageRank来…

react学习

1. React概述 1.1 什么是react&#xff1f; React 是一个用于构建用户界面的 JavaScript 库 用户界面:HTML页面(前端) React 主要用来写HTML页面&#xff0c;或构建Web应用如果从 MVC 的角度来看&#xff0c;React 仅仅是视图层(V)&#xff0c;也就是只负责视图的染&#xff0…

Day44——Dp专题

文章目录子序列问题27.最长递增子序列28、最长连续递增序列29、最长重复子数组30、最长公共子序列31、不相交的线32、最大子序和33、判断子序列34、不同的子序列35、两个字符串的删除操作36、编辑距离37、回文子串38、最长回文子序列动态规划总结篇背包问题系列股票系列子序列系…

java论坛贴子网站ssm论坛项目发帖子网站论坛系统论坛源码

ssm开发的论坛系统&#xff0c;用户注册后可以发布帖子&#xff0c;其他人可以评论回复点赞评论和点赞回复&#xff0c;用户可以在个人中心管理自己的帖子&#xff0c;以及查看自己对他人的回复&#xff0c;和他人对自己的回复。 演示视频&#xff1a; https://www.bilibili.c…

图(Graph)的定义

图(Graph)的定义 文章目录图(Graph)的定义●图的形式化定义:G (V,E)●无向图和有向图的表示形式:● 有向图和无向图的定义●抽象数据类型定义ADT●图形结构属于复杂的非线性结构● 图由顶点的集合和边的集合构成 ●图的形式化定义:G (V,E) • 集合V(vertex):顶点的有限集合,…

多线程基础入门

文章目录前言一、认识线程&#xff08;一&#xff09;概念1.线程是什么2.为啥要有线程&#xff08;轻量级进程&#xff09;为什么线程比进程更轻量经典面试题&#xff1a;谈谈进程和线程的区别和联系3.线程的结构&#xff08;二&#xff09;第一个多线程程序&#xff08;三&…

Java中的自旋锁,手动实现一个自旋锁

自旋锁 CAS是实现自旋锁的基础&#xff0c;CAS利用CPU指令保证了操作的原子性&#xff0c;已达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞&#xff0c;而是采用循环的方式去尝试获取锁&#xff0c; 当线程发现锁被占用时&#xff0c;会不断循环判断锁的状态&#xff0…

计算机网络最新复习【太原理工大学】

课后题 Word 版&#xff0c;提取码&#xff1a;5201https://pan.baidu.com/s/13xzx8qr8Mnh4TWTS_dEYxA 目录 一、题型 二、考点 一、题型 1. 选择题 40 个&#xff0c;每个 1 分&#xff0c;共 40 分。&#xff08;大部分可一眼看出答案&#xff09; 2. 填空题 15 个&…

最长上升子序列优化(贪心+二分)(超级详细的讲解)

最长上升子序列优化&#xff08;贪心二分一、回顾1、问题描述2、动规代码弊端二、优化1、算法优化2、代码实现一、回顾 1、问题描述 2、动规代码弊端 我们之前的动规代码的时间复杂度是O(n2)O(n^2)O(n2)。如果大家还不知道动态规划的逻辑的话&#xff0c;建议大家先去看一下动…

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析&#xff0c;实现用电监控、推行阶梯定价、负荷管理、线损分析&#xff0c;最终达到自动抄表、错峰用电、用电检查&#xff08;防窃电&#xff09;、负荷预测和节约用电成本等目的。建立全面的用户用电…

VuePress初学之利用模板theme创建一个个人博客网站

目录前言官方文档创建项目创建目录安装VuePress初始化项目创建文档修改package.json运行项目修改README.md的编码显示官方默认主题创建.vuepress文件创建config.js修改README.md补充logo资源运行效果更多默认主题配置开源主题vuepress-theme-reco安装脚手架初始化项目安装npm运…

为什么说L2毫秒接口的应用比较广泛?

和其它的数据接口一样&#xff0c;这L2毫秒接口也起到了一个媒介的作用&#xff0c;将所有的股票信息都传递到了另外一个软件上。因为市场上的股票种类很多&#xff0c;所以每一种股票都具有其特有的信息&#xff0c;是进行股票买卖的基础。 为什么说L2毫秒接口的应用比较广泛…

MCU-51:矩阵键盘

题目一、矩阵键盘介绍1.1 矩阵键盘1.2 扫描的概念二、编程2.1 LCD屏显示“HelloWord”2.2 矩阵键盘程序三、矩阵键盘应用一、矩阵键盘介绍 1.1 矩阵键盘 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式 采用逐行或逐列的“扫描…

Flowable学习笔记(一):SpringBoot项目整合Flowable

1.基于k8s部署Mysql 参考&#xff1a;k8s部署mysql 我安装是去掉了卷挂载。安装过程可能出现磁盘容量不够&#xff0c;可以通过df -h查看。 镜像下载得比较慢&#xff0c;可以先用docker拉取镜像。 2.搭建SpringBoot项目 (1)搭建maven项目&#xff0c;pom.xml依赖如下&am…

一文带你深入理解【Java基础】· 网络编程(下)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…