springboot2.x+mybatis-plus+mysql5.7动态拼接sql语句分页查询自定义sql查询条件分组排序

{{unidentified}}      2022-04-05     785

关键词:

在使用srpingboot2.x+mybatis-plus框架是遇到特殊需求时研究mybatis-plus的条件构造器动态拼接sql查询,这个查询接口涉及到了自定义sql动态拼接sql分页求和分组排序。

可以直接看业务实现方法


首先说一下接口的需求:

入参JSON:

 1 {
 2     "from": "2020-5-29",
 3     "limit": 10,
 4     "offset": 0,
 5     "order": "hitCount",
 6     "page": 1,
 7     "search": "",
 8     "sort": "desc",
 9     "sortDirection": "",
10     "to": "2020-6-10"
11 }

入参注释说明:

{
    "from": "开始查询时间",
    "limit": 条数,
    "offset": 0,
    "order": "需要排序的字段",
    "page": 页码,
    "search": "查询条件",
    "sort": "排序规则",
    "sortDirection": "",
    "to": "结束查询时间"
}

然后先写接口实现:

1     @PostMapping("categoryList")
2     public R getCategoryList(@Validated @RequestBody QaDetailSearchVo vo){
3         RobotPage pageHelper = new RobotPage(vo.getPage(),vo.getLimit());
4         return R.ok(iStatQaService.findQaStatCategory(pageHelper, vo));
5     }

解释:POST请求,R 是自定义的返回类型,RobotPage是为了实现一些特殊返回值 继承于mybatsi-plus分页的Ipage:

1 public class RobotPage<T> extends Page<T> implements Serializable {}

重点是业务实现类和mapper层:

对于一般的查询mybatis-plus的条件构造器已经可以满足了,例如:

1 SysUser sysUser = baseMapper.selectOne(Wrappers.<SysUser>lambdaQuery()
2                 .select(SysUser::getUserId, SysUser::getUsername, SysUser::getPhone, SysUser::getEmail, SysUser::getPassword, SysUser::getDeptId, SysUser::getJobId, SysUser::getAvatar)
3                 .eq(SysUser::getUsername, username));

但是对于一些需要复杂的或者多表的操作就需要自定义sql语句了,示例:

首先是mapper自定义分页查询接口:

1 @Select("SELECT s.category_id as id, s.category_name as category, SUM(s.hit_count) as hitCount, SUM(s.solve_count) as resolvedCount, SUM(s.not_solve_count) as unresolvedCount " +
2             "FROM core_stat_qa as s ${ew.customSqlSegment}")
3     IPage<QaDetailCategoryListVo> findCategoryListByParams(IPage<QaDetailCategoryListVo> page, @Param(Constants.WRAPPER) QueryWrapper<StatQa> wrappers);

这部分官网给的有示例:https://mybatis.plus/guide/wrapper.html#%E4%BD%BF%E7%94%A8-wrapper-%E8%87%AA%E5%AE%9A%E4%B9%89sql

业务接口不用看 直接是实现类:

 1 @Override
 2     public Grid findQaStatCategory(Page<QaDetailCategoryListVo> page, QaDetailSearchVo vo) {
 3         //声明返回
 4         Grid grid = new Grid();
 5         //组装查询语句
 6         QueryWrapper<StatQa> qaQueryWrapper = new QueryWrapper<>();
 7         //模糊查询
 8         qaQueryWrapper.like(StringUtils.isNotBlank(vo.getSearch()),"category_name",vo.getSearch());
 9         //where条件
10         qaQueryWrapper.ge("create_time", DateUtil.parse(vo.getFrom(),"yyyy-MM-dd"));
11         qaQueryWrapper.lt("create_time",DateUtil.parse(vo.getTo(), "yyyy-MM-dd"));
12         //分组
13         qaQueryWrapper.groupBy("category_id","category_name");
14         //排序
15         qaQueryWrapper.orderBy(true, !"desc".equals(vo.getSort()),vo.getOrder());
16         //调用自定义sql语句
17         IPage<QaDetailCategoryListVo> statQaIPage = baseMapper.findCategoryListByParams(page, qaQueryWrapper);
18         //抽取list
19         List<QaDetailCategoryListVo> statQaList = statQaIPage.getRecords();
20         grid.setList(statQaList);
21         grid.setTotal(statQaIPage.getTotal());
22         return grid;
23     }

需要解释的:

排序orderBy方法中的第一个true官网上也是给出解释的:表示该条件是否加入最后生成的sql中。

!"desc".equals(vo.getSort())  是排序规则 asc和desc

调用mapper自定义sql就是:
baseMapper.findCategoryListByParams(page, qaQueryWrapper);

接口完成。

springboot2.x配置文件讲解

SpringBoot2.x配置文件讲解简介:SpringBoot2.x常见的配置文件xml、yml、properties的区别和使用xml、properties、json、yaml1、常见的配置文件xx.yml,xx.properties,1)YAML(YetAnotherMarkupLanguage)写YAML要比写XML快得多(无需关注标签或引号)使用空格Spa... 查看详情

springboot2.x教程-thymeleaf原理是什么

layout:posttitle:SpringBoot2.x教程-Thymeleaf原理是什么categories:SpringBootdescription:SpringBoot2.x教程-Thymeleaf原理是什么keywords:SpringBoot,Spring,Thymeleaf---如要要理清楚Thymeleaf的原理,那么就要从模板引擎的原理说起。Thymeleaf只不过是众多模板 查看详情

springboot2.x集成单节点redis

Springboot2.x集成单节点Redis说明在Springboot1.x版本中,默认使用Jedis客户端来操作Redis,而在Springboot2.x版本中,默认使用Lettuce客户端来操作Redis。Springboot提供了RedisTemplate来统一封装了对Redis操作,开发者只需要使用RedisTemplate就可以... 查看详情

(汇总)springboot实践折腾记&springboot2.x实践记

SpringBoot2.x实践记SpringBoot2.x实践记:Retry(annotion)SpringBoot2.x实践记:GsonSpringBoot2.x实践记:MailSpringBoot2.x实践记:H2DatabaseSpringBoot实践折腾记SpringBoot实践折腾记(1&# 查看详情

springboot2.x搭建springbootadmin2.x

...用2.0.5SpringBootAdmin基于Eureka进行Client发现,Eureka搭建参见SpringBoot2.x搭建EurekaSpringBootAdmin项目文档参见SpringBootAdmin参考文档2创建项目在SpringBoot项目生成器中,输入Group和Artifact,如下配置:3编辑pom.xml文件p 查看详情

《springboot免费教程》连载目录

...Star关注支持一下,随时获得更新信息!快速入门SpringBoot2.x基础教程:版本关系SpringBoot2.x基础教程:快速入门SpringBoot2.x基础教程:工程结构推荐配置详解SpringBoot2.x基础教程:配置文件详解SpringBoot2.x基础教... 查看详情

《springboot免费教程》连载目录

...Star关注支持一下,随时获得更新信息!快速入门SpringBoot2.x基础教程:版本关系SpringBoot2.x基础教程:快速入门SpringBoot2.x基础教程:工程结构推荐配置详解SpringBoot2.x基础教程:配置文件详解SpringBoot2.x基础教... 查看详情

2018最新springboot2.0教程(零基础入门)

一、零基础快速入门SpringBoot2.01、SpringBoot2.x课程全套介绍和高手系列知识点简介:介绍SpringBoot2.x课程大纲章节java基础,jdk环境,maven基础2、SpringBoot2.x依赖环境和版本新特性说明简介:讲解新版本依赖环境和springboot2新特性概述3... 查看详情

springboot2.x文件上传实战

设置上传的文件大小:@ConfigurationpublicclassfileConfigure{@BeanpublicMultipartConfigElementmultipartConfigElement(){MultipartConfigFactoryfactory=newMultipartConfigFactory();//单个文件的大小factory.setMaxFileSize("20 查看详情

springboot2.x版本整合redis集群

参考技术A启动Redis集群搭建方式SpringBoot1.x版本默认使用jedis连接,2.x版本使用lettuce连接ymlyml测试 查看详情

springcloud:升级到springboot2.x/finchley.release遇到的坑

springboot2.x已经出来好一阵了,而且springcloud的最新Release版本Finchley.RELEASE,默认集成的就是springboot2.x,这几天将一个旧项目尝试着从低版本升级到2.x,踩坑无数,记录一下:一、gradle的问题springboot2.x要求gradle版本不能太旧,先... 查看详情

springboot2.x入门——helloworld

Springboot2.x入门——helloWorld一、简介1.1Springboot简介SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化... 查看详情

springboot2.x版本整合redis(单机/集群)(使用lettuce)

在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuce。此处springboot2.x,所以使用的是Lettuce。关于jedis跟lettuce的区别:Lettuce和Jedis的定位都是Redis的client,所以他们当然可以直接连接redisserver。Jedis在实现... 查看详情

springboot2.x上传文件限制大小

SpringBoot1.3.x multipart.maxFileSizemultipart.maxRequestSizeSpringBoot1.4.xand1.5.xspring.http.multipart.maxFileSizespring.http.multipart.maxRequestSizeSpringBoot2.xspring.servlet.multipart.maxF 查看详情

springboot2.x参数校验(代码片段)

本文主要对SpringBoot2.x参数校验进行简单总结,其中SpringBoot使用的2.4.5版本。一、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>&l 查看详情

springboot2.x和activiti如何配置

springboot2.x和activiti如何配置总是出现各种问题,有没有大神知道如何配置,要具体点的,包括配置文件如何配置、启动类添加哪些标签、activiti如何配置、需要引入那些jar参考技术A参考资料1.同从弟南斋玩月忆山阴崔少府.百度... 查看详情

springboot2.x-springboot整合amqp之rabbitmq

文章目录SpringBoot2.X-SpringBoot整合AMQP之RabbitMQRabbitMQ简介引入依赖编写配置编写接口启用Rabbit注解消息监听消息测试SpringBoot2.X-SpringBoot整合AMQP之RabbitMQSpringBoot2整合RabbitMQ案例。RabbitMQ简介简介RabbitMQ是一个由erlang开发的AMQP(AdvanvedMess... 查看详情

springboot2.x:springboot

 几个重要的事件回调机制: 1、配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunlistener 2、需要放在ioc容器中     3、ApplicationRunner &nbs 查看详情