iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mybatis-Plus——分页+模糊查询
  • 792
分享到

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

mybatismysql 2023-09-22 13:09:27 792人浏览 安东尼
摘要

建表:  create table pms_brand( brand_id bigint not null auto_increment comment '品牌id', name

建表: 

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 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}; // 在语句中加入 标签导致locate函数中#{}占位符未生效,使用'${}'替代

mapper接口

@Mapperpublic interface BrandMapper extends BaseMapper {        List queryLikeByName(String name, long current, long size);        //可以传入Page参数,分页插件拦截并返回Page结果    Page queryLikeByName(Page page,String name, long current, long size);}

Service层 

@Servicepublic class BrandServiceImpl extends ServiceImpl implements BrandService {    @Autowired    private BrandMapper brandMapper;        @Override    public PageUtils queryPage(Map params) {        QueryWrapper queryWrapper = new QueryWrapper<>();        //1、获取key        String key = (String) params.get("key");        IPage 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 brands = brandMapper.queryLikeByName(key,                    (pageNumber - 1) * pageSize, pageSize);            page.setRecords(brands);            page.setSize(pageSize);            page.setCurrent(pageNumber);        } else {            page = this.page(new Query().getPage(params));        }        return new PageUtils(page);    }}

来源地址:https://blog.csdn.net/weixin_52383177/article/details/127894664

您可能感兴趣的文档:

--结束END--

本文标题: Mybatis-Plus——分页+模糊查询

本文链接: https://www.lsjlt.com/news/415263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mybatis-Plus——分页+模糊查询
    建表:  create table pms_brand( brand_id bigint not null auto_increment comment '品牌id', name ...
    99+
    2023-09-22
    mybatis mysql
  • mybatis-plus之模糊查询
    一、like like(R column, Object val)like(boolean condition, R column, Object val) LIKE '%值%'例: like("name", "王")--->name li...
    99+
    2023-09-07
    mybatis java mysql
  • Mybatis-Plus分页查询
    分页插件 调用通用mapper提供的selectPage分页方法; 2、自定义查询方法使用分页功能:     - mapper接口中的方法返回值是Page类型     - 第一个参数要求是Page类型 3、映射文件中可以使用sql标签定义公...
    99+
    2023-08-31
    mybatis java mysql
  • mybatis-plus怎么指定字段模糊查询
    本篇内容主要讲解“mybatis-plus怎么指定字段模糊查询”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis-plus怎么指定字段模糊查询”吧!mybatis-plus版本:3.3...
    99+
    2023-06-30
  • Mybatis-Plus实现分页查询
    Mybatis-Plus实现分页查询 文章目录 Mybatis-Plus实现分页查询1.1技术概述1.2技术详述1.2.1配置分页插件1.2.2自定义分页1、如果你的mapper没有继承BaseMapper2、如果你的mapper继...
    99+
    2023-08-17
    mybatis java spring boot
  • mybatis plus 分页查询出现count()
    出现问题现象 使用mybatisplus分页时候count语句出错,控制台打印的sql为### The error may involve defaultParameterMap, The error occurred while sett...
    99+
    2023-08-17
    mybatis java mysql
  • MyBatis-Plus联表查询及分页
    MyBatis-Plus联表查询及分页 一、准备工作1、数据库结构以及数据2、依赖3、配置类让mybatis-plus-join在DataScopeSqlInjector中生效4、启动类排除MPJSqlInjector.class ...
    99+
    2023-08-16
    mybatis mysql java
  • Mybatis-plus LambdaQueryWrapper 模糊查询 like方法使用记录
    项目开发过程中使用Mybatis-Plus的lambda 表达式,对其中对模糊查询like方法开始不理解其中参数Boolean是什么作用。后边看其他的方法都是两个对应的,有带Boolean参数的有不带...
    99+
    2023-09-07
    mybatis java mysql
  • mybatis-plus分页查询三种方法
    mybatis-plus分页查询 一、前期准备表1、配置类 二、使用selectPage1、Service2、结果 三、使用2种分页查询的写法1、xml2、Mapper3、第一种写法4、第一种结果5、第二种写法6、第二种结果...
    99+
    2023-08-20
    mybatis java 开发语言
  • MyBatis实现模糊查询
    1.第一种方式 第一种方式:在java程序中,把like的内容组装好,把这个内容传入到sql语句 我们先在dao接口中定义一个方法 /ke的第一种方式List selectLikeOne(@Param("name") S...
    99+
    2023-10-20
    mybatis java mysql Powered by 金山文档
  • mybatis-plus指定字段模糊查询的实现方法
    mybatis-plus版本:3.3.0 oracle版本:11g 很常见的一个需求场景:某张表在前端显示时,查询条件中,往往name字段需要模糊查询,否则默认mybatis-plu...
    99+
    2022-11-13
  • MyBatis-Plus 分页查询的实现示例
    方法: 使用selectPage()方法,第一个参数是传入分页方法(传入当前页和当前显示多少条数据),第二个参数是传入查询条件(如果查询全部的话,可以传null)。 前提: 表中的...
    99+
    2022-11-13
  • mybatis-plus分页查询的3种方法
    今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。一、前期准备表CREATE TABLE `schoo...
    99+
    2023-08-03
  • MyBatis-Plus 分页查询以及自定义sql分页
    一、引言 分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。 物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较...
    99+
    2023-09-01
    mybatis sql mysql
  • MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)
    目录 1 MyBatisPlusConfig2 UserPagination3 Mapper3.1 UserMapper.java3.2 UserMap...
    99+
    2022-11-12
  • mybatis-plus分页查询三种方法小结
    目录一、前期准备表二、使用selectPage三、使用2种分页查询的写法1、xml2、Mapper3、第一种写法4、第一种结果5、第二种写法6、第二种结果四、使用PageH...
    99+
    2023-05-20
    mybatis-plus 分页查询 mybatis 分页查询
  • MyBatis-Plus分页查询的方法有哪些
    本文小编为大家详细介绍“MyBatis-Plus分页查询的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis-Plus分页查询的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方法:...
    99+
    2023-06-29
  • oracle+mybatis-plus+springboot怎么实现分页查询
    本篇内容主要讲解“oracle+mybatis-plus+springboot怎么实现分页查询”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“oracle+mybatis-plus+springb...
    99+
    2023-06-20
  • mybatis-plus 多表关联条件分页查询
    此处以一对多,条件分页查询为例: 一.表结构: 主表 CREATE TABLE `t_user` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(255) DEFAU...
    99+
    2023-08-20
    mybatis mysql java
  • Mybatis-plus分页查询不生效之问题排查
    Mybatis-plus分页查询不生效之问题排查 一、问题描述二、分析步骤三、解决方案四、总结 一、问题描述 在查询的时候,发现点击后台的分页器数字,第2页时候,数据还是和第1页的一致。就看后台的数据库打印语句,如下所示。点...
    99+
    2023-08-23
    mybatis java mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作