当前位置: 首页 > news >正文

MyBatis-Plus分页查询、分组查询

目录

  • 准备工作
    • 1. 实体类
    • 2. Mapper类
    • 3. 分页插件
    • 4. 数据
  • 分页查询
    • 1. 使用条件构造器
    • 2. 使用自定义sql
  • 分组查询
    • 1. 分组结果类
    • 2. 自定义sql
    • 3. 测试类

准备工作

1. 实体类

  • 对地址字段address使用字段类型转换器,将List转为字符串数组保存在数据库中
package com.example.server.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;import java.util.List;@Data
@TableName(autoResultMap = true)
public class SysUser {@TableId(type = IdType.AUTO)private String id;@TableLogicprivate Integer delFlag;private String name;private Integer age;private String gender;@TableField(typeHandler = JacksonTypeHandler.class)private List<String> address;}
  • 对应的表
CREATE TABLE SYS_USER
(ID       INT PRIMARY KEY    NOT NULL AUTO_INCREMENT,NAME     VARCHAR(100)       NOT NULL,AGE      INT                NOT NULL,GENDER   VARCHAR(100)       NOT NULL,ADDRESS  VARCHAR(100)       NOT NULL,DEL_FLAG SMALLINT DEFAULT 0 NOT NULL
);

2. Mapper类

package com.example.server.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.server.entity.SysUser;public interface SysUserMapper extends BaseMapper<SysUser> {}

3. 分页插件

@Configuration
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}

4. 数据

在这里插入图片描述

分页查询

1. 使用条件构造器

  • 使用lambdaQuery条件构造器
package com.example.server;import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.server.entity.SysUser;
import com.example.server.mapper.SysUserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class ServerApplicationTests {@Autowiredprivate SysUserMapper sysUserMapper;@Testvoid selectList() {IPage<SysUser> page = new Page<>(1, 10);// 只查询18和20岁的用户IPage<SysUser> userIPage = sysUserMapper.selectPage(page, Wrappers.<SysUser>lambdaQuery().in(SysUser::getAge, List.of(18, 20)).orderByAsc(SysUser::getId));System.out.println(JSON.toJSONString(userIPage));}}
  • 打印结果
{"current": 1,"pages": 1,"records": [{"address": ["北京市朝阳区"],"age": 20,"delFlag": 0,"gender": "MALE","id": "1","name": "Jack"},{"address": ["北京市朝阳区","南京市鼓楼区"],"age": 18,"delFlag": 0,"gender": "MALE","id": "2","name": "Fisher"}],"size": 10,"total": 2
}

2. 使用自定义sql

  • 定义查询条件vo类
package com.example.server.vo;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SysUserVO {private Integer ageMax;private Integer ageMin;private List<String> genderList;private List<String> addressList;}
  • 动态sql,因为SysUser中使用了字段类型处理器typeHandler,需要手动指定resultMap(格式为”mybatis-plus_实体类”,和BaseMapper后的泛型类一致),否则address字段的转换器会不生效
package com.example.server.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.server.entity.SysUser;
import com.example.server.vo.SysUserVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;public interface SysUserMapper extends BaseMapper<SysUser> {@ResultMap("mybatis-plus_SysUser")@Select("<script>" +"SELECT * FROM SYS_USER WHERE DEL_FLAG = 0 " +"  <if test='sysUser.ageMax != null'>" +"AND AGE <![CDATA[ <= ]]> #{sysUser.ageMax} " +"  </if>" +"  <if test='sysUser.ageMin != null'>" +"AND AGE <![CDATA[ >= ]]> #{sysUser.ageMin} " +"  </if>" +" <if test='sysUser.genderList != null and sysUser.genderList.size() > 0'>" +"AND GENDER IN " +"<foreach collection='sysUser.genderList' item='item' open='(' separator=',' close=')'>" +"#{item}" +"</foreach>" +"  </if>" +" <if test='sysUser.addressList != null and sysUser.addressList.size() > 0'>" +"AND ( " +"<foreach collection='sysUser.addressList' item='item' index='index' open='' close='' separator='OR'>" +"ADDRESS LIKE concat('%', #{item}, '%') " +"</foreach>" +" )" +"  </if>" +"</script>")IPage<SysUser> selectUsersByPage(@Param("page") IPage<SysUser> page, @Param("sysUser") SysUserVO sysUser);}
  • 测试方法
package com.example.server;import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.server.entity.SysUser;
import com.example.server.mapper.SysUserMapper;
import com.example.server.vo.SysUserVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class ServerApplicationTests {@Autowiredprivate SysUserMapper sysUserMapper;@Testvoid selectUsersByPage() {// 分页查询,年龄在18到35岁之间,性别男或女,地址在北京或南京的用户IPage<SysUser> page = new Page<>(1, 10);SysUserVO sysUserVO = SysUserVO.builder().ageMax(35).ageMin(18).genderList(List.of("MALE", "FEMALE")).addressList(List.of("北京市", "南京市")).build();IPage<SysUser> userIPage = sysUserMapper.selectUsersByPage(page, sysUserVO);System.out.println(JSON.toJSONString(userIPage));}}
  • 打印结果
{"current": 1,"pages": 1,"records": [{"address": ["北京市朝阳区"],"age": 20,"delFlag": 0,"gender": "MALE","id": "1","name": "Jack"},{"address": ["北京市朝阳区","南京市鼓楼区"],"age": 18,"delFlag": 0,"gender": "MALE","id": "2","name": "Fisher"},{"address": ["北京市朝阳区"],"age": 35,"delFlag": 0,"gender": "MALE","id": "5","name": "James"}],"size": 10,"total": 3
}

分组查询

1. 分组结果类

  • 对性别进行分组统计
package com.example.server.dto;import lombok.Data;@Data
public class SysUserDTO {private String gender;private Integer num;}

2. 自定义sql

package com.example.server.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.server.dto.SysUserDTO;
import com.example.server.entity.SysUser;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface SysUserMapper extends BaseMapper<SysUser> {@Select("select gender, count(*) num from sys_user where del_flag = 0 GROUP BY gender")List<SysUserDTO> selectUsersByGender();}
  • 这里没有使用mybatis-plus的groupBy方法进行统计,使用继承了BaseMapper<SysUser>后使用原生的api得到的返回值是SysUser,但是这里不好引入统计结果字段,如果加了,统计没有问题,但是查详情的时候有问题,因为表中没有这个字段

3. 测试类

package com.example.server;import com.alibaba.fastjson.JSON;
import com.example.server.dto.SysUserDTO;
import com.example.server.mapper.SysUserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class ServerApplicationTests {@Autowiredprivate SysUserMapper sysUserMapper;@Testvoid selectUsersByGender() {// 对性别做分组统计List<SysUserDTO> sysUsers = sysUserMapper.selectUsersByGender();System.out.println(JSON.toJSONString(sysUsers));}}
  • 打印结果
[{"gender": "MALE","num": 4},{"gender": "FEMALE","num": 1}
]

相关文章:

MyBatis-Plus分页查询、分组查询

目录 准备工作1. 实体类2. Mapper类3. 分页插件4. 数据 分页查询1. 使用条件构造器2. 使用自定义sql 分组查询1. 分组结果类2. 自定义sql3. 测试类 准备工作 1. 实体类 对地址字段address使用字段类型转换器&#xff0c;将List转为字符串数组保存在数据库中 package com.exa…...

2024年9月HarmonyOS鸿蒙应用开发者高级认证全新题库(覆盖99%考题)

一个小时通过鸿蒙高级认证 1、在开发 Harmony0S 应用工程时&#xff0c; 随着业务的发展&#xff0c;现在需要创建一个模块&#xff0c; 关于在 DevEco Studio 中创建 Module &#xff0c; 下列选项哪种方式是错误的? 必对 在 hvigor 目录下&#xff0c;单击鼠标右键&#xf…...

大工程师插件下载 官方地址

https://download.3dsource.cn/3DSource_Client.exe...

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS&#xff0c;官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本&#xff1a;rtems-5.3 版本&#xff0c; 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的&#xff0c;当前支持 STM32F4…...

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2&#xff09;比较含退格的字符串 .1- 题目解析 .2- 代码编写 3&#xff09;基本计算器 II .1- 题目解析 .2- 代码编写 4&…...

【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API

Django AI 聊天机器人项目&#xff1a;基于 ChatGPT 的 Django REST API 本文档将介绍如何使用 Django 和 Django REST Framework 构建一个 AI 聊天机器人项目&#xff0c;并结合 OpenAI 的 GPT 模型提供代码解释服务。步骤包括创建 Django 项目、配置 API、与 OpenAI 集成&am…...

System.out源码解读——err 和 out 一起用导致的顺序异常Bug

前言 笔者在写一个小 Demo 的过程中&#xff0c;发现了一个奇怪的问题。问题如下&#xff1a; // 当 flagtrue 时打印 a1 &#xff1b;当 flagfalse 时打印 a2。 public static void main(String[] args) {boolean flag false;for (int i 0; i < 10; i) {if (flag) {Sys…...

汽车软件开发之敏捷开发

一、前言 目前汽车电子产品&#xff0c;特别是汽车几大域控&#xff08;如&#xff1a;智能座舱、智能驾驶、智能网联、车身控制&#xff09;市场竞争激烈&#xff0c;消费者对汽车的需求逐渐多元化和个性化&#xff0c;用户对座舱和智驾产品的要求也越来越高。他们不仅要求产…...

ListBox显示最新数据、左移和右移操作

1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Sys…...

mysql实用系列:日期格式化

在MySQL中&#xff0c;你可以使用DATE_FORMAT()函数来格式化日期。DATE_FORMAT() 函数通常用于格式化 DATETIME 或 TIMESTAMP类型的字段。这个函数允许你按照指定的格式来显示日期和时间。下面是一些常见的日期格式化的例子&#xff1a; 显示年-月-日&#xff1a; SELECT DATE_…...

时钟频率、AI采样率与AO更新率的关系

在数据采集和信号生成设备&#xff08;如NI板卡&#xff09;中&#xff0c;时钟频率、AI&#xff08;模拟输入&#xff09;采样率、以及AO&#xff08;模拟输出&#xff09;更新率是三个至关重要的参数。它们共同决定了设备在信号采集与生成时的性能表现。本文将详细分析它们之…...

代理IP设置后IP不变?可能的原因及解决方法

在使用代理IP时&#xff0c;有时会遇到代理设置后IP地址却没有变化的情况。这种问题可能会让人感到困惑&#xff0c;但其实背后有多种原因。本文将详细探讨这些原因&#xff0c;并提供相应的解决方法&#xff0c;帮助你顺利解决问题。 可能的原因 代理IP设置后IP地址不变的原…...

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法&#xff0c;本次使用了触觉智能的EVB3588开发板演示&#xff0c;搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计&#xff0c;为工业场景设计研发的模块化产品&#xff0c;10年以上稳定供货,帮助…...

Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求

在军事国防领域&#xff0c;全新技术的投入使用最看重的就是保密与安全。作为全球领先的XR头戴式显示器提供商Varjo&#xff0c;近日正式宣布将在位于芬兰的赫尔辛基开设一家新的安全制造工厂。 此次工厂扩建将使Varjo能够满足国防训练和模拟领域对其高分辨率XR解决方案日益增…...

python 识别省市、区县并组建三级信息数据库

一、网址&#xff1a; 全国行政区划信息查询平台 二、分析并搭建框架 检查网页源码&#xff1a; 检查网页源码可以发现&#xff1a; 所有省级信息全部在javaScript下的json中&#xff0c;会在页面加载时加载json数据&#xff0c;填充到页面的option中。 1、第一步&#xff1a…...

家用小型超声波清洗机怎么选?四大人气爆款品牌不可错过!

在现代社会快节奏的步伐中&#xff0c;保持高度的个人及家居卫生标准成为了日常生活的重要组成部分&#xff0c;对于追求高端生活品质的人群而言&#xff0c;这一点尤为重要。因此&#xff0c;选取一款集高效与便利于一体的超声波清洗机&#xff0c;无疑是升级日常清洁体验的理…...

NVIDIA最新AI论文介绍NEST:一种用于语音处理的快速高效自监督模型

语音处理专注于开发能够分析、解释和生成人类语音的系统。这些技术涵盖了多种应用&#xff0c;例如自动语音识别&#xff08;ASR&#xff09;、说话人验证、语音转文本翻译以及说话人分离。随着对虚拟助手、转录服务和多语言交流工具的依赖不断增加&#xff0c;高效准确的语音处…...

聊聊对别人表示真正的关注

在工作和生活中,那些重要人士所得到的关注已经很多了&#xff0c;所以你不能只关注那些重要的人&#xff0c;对那些保洁门卫、前台等也需要我们给予真心的关注。 他们可使你的生活正常有序&#xff0c;但却经常被你忽略&#xff0c;见面打个招呼时常跟他们聊一聊&#xff0c;这…...

大数据-133 - ClickHouse 基础概述 全面了解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

第1步win10宿主机与虚拟机通过NAT共享上网互通

VM的CentOS采用NAT共用宿主机网卡宿主机器无法连接到虚拟CentOS 要实现宿主机与虚拟机通信&#xff0c;原理就是给宿主机的网卡配置一个与虚拟机网关相同网段的IP地址&#xff0c;实现可以互通。 1、查看虚拟机的IP地址 2、编辑虚拟机的虚拟网络的NAT和DHCP的配置&#xff0c;…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...