Mybatis-Plus——分页+模糊查询

news2025/1/16 5:43:22

建表: 

create table pms_brand
(
   brand_id             bigint not null auto_increment comment '品牌id',
   name                 char(50) comment '品牌名',
   logo                 varchar(2000) comment '品牌logo地址',
   descript             longtext comment '介绍',
   show_status          tinyint comment '显示状态[0-不显示;1-显示]',
   first_letter         char(1) comment '检索首字母',
   sort                 int comment '排序',
   primary key (brand_id)
);

alter table pms_brand comment '品牌';

查看问题:

SELECT * from pms_brand where name like '%孔%' LIMIT 0,3;

 explain语句可以看到当前语句走了全表扫描,从中选取3条作为结果:

我们要查找的满足name='孔'的结果在第三行(按主键brand_id排序),假如我们只取两条结果,则在当前页面拿取不到我们要的结果;

现在我们希望不论如何情况都能在第一页取得最精确的结果,即'孔'出现在第一行。

方案1

把分页查询接口的数据,拆分成两部分:

  1. 精确查询

  2. 模糊查询

在代码中做处理的时候,先根据关键字精确查询,即sql中使用name='孔',这种方式查询一次数据。

如果没查出数据,则再直接用like '%孔'进行模糊查询。

如果查出了一条数据,则把它放在返回结果集合中的第一位置。接下来,使用like '%孔'进行模糊查询的时候,再加上条件 name!='孔'。将查出的结果,从第二个位置往后放。

这样可以拼接出你想要的集合。

但有个缺点,就是代码耦合性太大了。

方案2

假如,我们有这样一种排序:

  1. 全匹配显示在最前面,比如:孔。

  2. 数据左半部分匹配,右边按字母排序,比如:孔1、孔2、孔技术。

  3. 从中间开始匹配,比如:1孔、2孔。

  4. 第2步和第3步,还要根据字符长度排序,字符短的排在前面,比如:孔1、2孔、1孔技术1

说起来容易,做起来难。

难道要先全匹配:name='孔',再有匹配:name like '孔%',再左匹配:name like '%孔',把查询三次的结果组装起来?

不行,查询次数太多,臃肿。

其实,我们可以换一种思路,根据字符的长度排序

mysql给我们提供了很多非常有用的函数,比如:char_length

通过该函数就能获取字符长度。

sql调整如下:

select * from pms_brand where name like '%孔%' 
ORDER BY CHAR_LENGTH(name) asc LIMIT 0,3;

name字段使用关键字模糊查询之后,再使用char_length函数,获取name字段的字符长度,然后按长度升序

搞定需求了:

 

我们所期待的:苏三,终于排在第一个了。同时由于该sql做了分页的,即使name字段在查询时丢失了索引,执行效率也不会太低。

业务上的需求搞定了。

但追求完美的我们,好奇,想看看第二页是什么情况:

select * from pms_brand where name like '%孔%' 
ORDER BY CHAR_LENGTH(name) asc LIMIT 3,3;

执行结果:

 

并没有按照我们设想的剧本进行下去,我们之前假设的3条排序中,第2条和第3条都没有满足。

这时该怎么办?

答:可以使用mysql中的locate函数,通过它可以匹配的关键字,在字符串中的位置。

LOCATE(substr,str), LOCATE(substr,str,pos)

第一个语法返回substr在字符串str 的第一个出现的位置。第二个语法返回子符串 substr 在字符串str,从pos处开始的第一次出现的位置。如果substr 不在str 中,则返回值为0 。 

使用locate函数改造之后sql如下:

select * from pms_brand where name like '%孔%' 
ORDER BY CHAR_LENGTH(name) asc,
LOCATE('孔',name) asc LIMIT 0,5;

执行结果:

除此之外,还可以使用:instrposition函数,它们的功能跟locate函数类似

mybatis中的xml

<select id="queryLikeByName" resultType="com.hcx.product.entity.Brand">
        select brand_id, name, logo, descript, show_status, first_letter, sort
        from pms_brand
        where name like concat('%',#{name},'%')
        order by char_length(name) ,
        locate(#{name},name)
        limit #{current},#{size};
 </select>

mapper接口

@Mapper
public interface BrandMapper extends BaseMapper<Brand> {

    /**
     * 分页+模糊查询
     * @param name
     * @param current
     * @param size
     * @return
     */
    List<Brand> queryLikeByName(String name, long current, long size);
}

Service层 

@Service
public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements BrandService {
    @Autowired
    private BrandMapper brandMapper;

    /**
     * 分页+模糊查询
     *
     * @param params
     * @return
     */
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        QueryWrapper<Brand> queryWrapper = new QueryWrapper<>();
        //1、获取key
        String key = (String) params.get("key");
        IPage<Brand> page = new Page<>();
        //如果传过来的数据不是空的,就进行name模糊查询
        if (!StringUtils.isEmpty(key)) {
            long pageSize = Long.parseLong((String) params.get(Constant.LIMIT));
            long pageNumber = Long.parseLong((String) params.get(Constant.PAGE));

            List<Brand> brands = brandMapper.queryLikeByName(key,
                    (pageNumber - 1) * pageSize, pageSize);

            page.setRecords(brands);
            page.setSize(pageSize);
            page.setCurrent(pageNumber);

        } else {
            page = this.page(new Query<Brand>().getPage(params));
        }

        return new PageUtils(page);
    }

}

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

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

相关文章

使用ReentrantLock中的条件变量让多个线程顺序执行

一. 前言 近日壹哥的一个学生在参加某公司校招面试时&#xff0c;遇到一个多个线程顺序执行的面试题&#xff0c;特意记录下来和大家分享一下&#xff0c;这个题目的具体要求是这样的&#xff1a; 假设有3个线程 a,b,c&#xff0c;要求三个线程一起进入到就绪态&#xff0c;执…

【LeetCode】775. 全局倒置与局部倒置

题目描述 给你一个长度为 n 的整数数组 nums &#xff0c;表示由范围 [0, n - 1] 内所有整数组成的一个排列。 全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目&#xff1a; 0 < i < j < n nums[i] > nums[j] 局部倒置 的数目等于满足下述条件的下标 i 的…

01-Linux

1 初识Linux 在前面的课程中&#xff0c;我们无论是开发、测试。部署、存储都在Windwos操作系统的环境中&#xff0c;从今天开始我们一起学习下Linux,Linux系统和Windows系统最大的区别就是图形化界面操作和用途上有所差异&#xff0c;除了这两点&#xff0c;两者有异曲同工之…

跑通官方的yolov7-tiny实验记录(yolov7-tiny可作为yolov5s的对比实验网络)

目录1. 一些可用的参考链接2. 开始训练yolov72.1 --weights2.2 --cfg2.3 --data2.4 --hyp2.5 --epochs2.6 --batch-size2.7 --workers2.8 --name1. 一些可用的参考链接 官方YOLOv7 项目地址&#xff1a;https://github.com/WongKinYiu/yolov7如果想设置早停机制&#xff0c;可…

2022年TI杯模拟电⼦系统设计专题邀请赛——李萨如图形演示装置

任务 设计并实现李萨如&#xff08;Lissajous&#xff09;图形演示装置&#xff0c;如图 1 所示。输入正弦信号作为 x 轴信号&#xff0c;其峰峰值 2V&#xff0c;频率 1.5kHz~2kHz&#xff1b;对输入的正弦信号进行幅度和频率变换后产生 y 轴信号&#xff1b;装置显示器上显示…

CentOS7 离线安装 Python

目录1.前言2.下载Python及依赖环境&#xff08;1&#xff09;下载Python源码&#xff08;2&#xff09;下载Python依赖文件&#xff08;3&#xff09;下载gcc环境文件&#xff08;备用&#xff09;3.上传至离线服务器&#xff08;1&#xff09;核对已下载离线文件&#xff08;2…

基于PSO粒子群优化的汽车刹车稳定性数据matlab仿真与分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 刹车类别A 温度1 测试1 测试2 ....... 测试n 温度3 测试1 测试2 ....... 测试n ....... ....... 温度N 测试1 …

Java语言的过滤数据流

过滤数据流 为了解决不同数据流之间速度、数据格式差异的问题&#xff0c;以便提高输入/输出操作的效率&#xff08;特别是当需要大量的输入、输出操作的程序时&#xff09;&#xff0c;因此&#xff0c;Java贴心的提供了过滤流。 在已存在的数据流的基础上&#xff0c;过滤数…

IntelliJ IDEA

特色功能 IDEA所提倡的是智能编码&#xff0c;是减少程序员的工作&#xff0c;IDEA的特色功能有以下22点[1] &#xff1a; ● 智能的选取 在很多时候我们要选取某个方法&#xff0c;或某个循环或想一步一步从一个变量到整个类慢慢扩充着选取&#xff0c;IDEA就提供这种基于…

数据治理:数据标准的6大建设步骤及实施分享

“车同轨、书同文”&#xff0c;数字化时代&#xff0c;数据标准化是企业进行数字化转型的根基。数据标准与企业数据管理的每个域都相关&#xff0c;是数据治理工作的最基础内容。 元数据管理中&#xff0c;需要从业务属性、技术属性、管理属性三个方面定义数据标准&#xff1b…

第54篇-某网易易盾滑块请求data参数分析【2022-11-16】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、流程分析三、data参数1.d值2.p值3.ext值一、前言 在很久以前我们使用selenium+OpenCV模拟过一次易盾盾滑块…

学习大数据之后可以做什么?未来发展怎么样?

当下&#xff0c;有很多小伙伴看中了大数据开发的前景&#xff0c;从而选择了学习大数据的行列当中来&#xff0c;只能说&#xff0c;坚持你的选择没有错~ 当下来看&#xff0c;可以说大数据是一种宝贵的战略资源&#xff0c;其潜在价值和增长速度正在改变着人类的工作、生活和…

人人开源搭建后台管理系统 逆向工程生成CRUD代码

一、什么是人人开源 也就是说和若依类似&#xff0c;都是快速帮我们开发一些简单的逻辑代码的&#xff0c;可以帮我们自动生成代码。 二、具体操作 我们现在就以renren-fast作为后台管理系统框架&#xff0c;用renren-fast-vue作为前端系统框架进行开发项目 具体操作如下所示&a…

做好一个BI项目的关键是什么

做好一个BI项目的关键是什么&#xff1f;有人会说&#xff0c;那肯定是报表&#xff0c;报表是数据分析最直接的成果展示&#xff0c;好的报表能够帮助企业从各种纷杂的信息中及时地发现关键有效的信息&#xff0c;从而为决策提供支持。诚然&#xff0c;报表很重要&#xff0c;…

SPI通信协议

目录一、什么是SPI协议二、SPI物理层三、SPI协议层一、什么是SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是 Motorola 公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&a…

【PTA-训练day7】L2-019 悄悄关注 + L1-027 出租

L2-019 悄悄关注 - 哈希表 PTA | 程序设计类实验辅助教学平台 1、java - 喜闻乐见超时 import java.util.*;public class Main {public static void main(String[] args){Scanner scnew Scanner(System.in);int nsc.nextInt();String[] namesc.nextLine().split(" "…

Centos7.6 源码编译部署percona mysql 5.7.39-42

Centos7.6 源码编译部署percona mysql 5.7.39-42 参考链接&#xff1a; mysql5.7.35源码编译安装部署CentOS7 编译安装 Percona Server 5.7percona Server for MySQL 5.7源码安装 一、部署环境准备 更换阿里云yum源 cd /etc/yum.repos.d/ mkdir bak && mv *.repo ba…

[附源码]java毕业设计江苏策腾智能科技公司人事管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

第1关:节点监听机制

ZooKeeper的监听机制 节点监听机制用以保证集群之间的一致性&#xff0c;以及服务器可以及时通知客户端节点状态的变化。 一个节点可以被监控&#xff0c;包括路径中存储的数据修改&#xff0c;子节点路径改变&#xff0c;当该节点发生修改&#xff0c;服务器可以通知设置监控…

AVS3帧间预测

帧间预测是去除时域冗余的重要工具&#xff0c;随着AVS标准发展&#xff0c;越来越多的帧间预测工具被加入标准&#xff0c;主要可以分为三类&#xff1a;预测编码类型、运动信息编码工具、CU级和子块级运动补偿。 预测编码类型 预测编码类型是指帧间预测的不同预测方式&#…