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

news2024/11/9 5:56:43

目录

  • 准备工作
    • 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;

    @TableLogic
    private 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 {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return 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 {

    @Autowired
    private SysUserMapper sysUserMapper;

    @Test
    void 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 {

    @Autowired
    private SysUserMapper sysUserMapper;

    @Test
    void 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 {

    @Autowired
    private SysUserMapper sysUserMapper;

    @Test
    void selectUsersByGender() {
        // 对性别做分组统计
        List<SysUserDTO> sysUsers = sysUserMapper.selectUsersByGender();
        System.out.println(JSON.toJSONString(sysUsers));
    }

}

  • 打印结果
[
    {
        "gender": "MALE",
        "num": 4
    },
    {
        "gender": "FEMALE",
        "num": 1
    }
]

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

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

相关文章

(web自动化测试+python)1

一.UI自动化测试介绍 1.测试化理论 UI就是指的是用户接口&#xff0c;指的是用户与电脑的接口&#xff0c;是用户界面 UI不仅仅指的是web&#xff0c;还可以指代app 我们为什么要进行自动化&#xff1f; 大量版本的回归 当新的功能出现&#xff0c;复测之间的--我们叫做回归&am…

《Diffusion Models Without Attention》CVPR2024

摘要 这篇论文探讨了在高保真图像生成领域&#xff0c;去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Models, DDPMs&#xff09;的重要性。尽管DDPMs在捕捉复杂视觉分布方面表现出色&#xff0c;但在高分辨率图像生成上面临显著的计算挑战。现有的方法&…

动物目标检测——基于YOLOv5和树莓派4B平台

目标检测在计算机视觉领域中具有重要意义。YOLOv5&#xff08;You Only Look One-level&#xff09;是目标检测算法中的一种代表性方法&#xff0c;以其高效性和准确性备受关注&#xff0c;并且在各种目标检测任务中都表现出卓越的性能。本文将详细介绍如何在性能更强的计算机上…

java实习生第一次被分配需求——完成需求的大概流程

一、分配需求后第一步&#xff0c;首先是把项目跑起来 在我进入公司一两个星期之后&#xff08;基本熟悉了公司的框架&#xff09;&#xff0c;就被我所在的开发小组的某个大哥分派了一个需求&#xff0c;然后他给我发了一个git地址&#xff0c;以及一个git的分支&#xff08;…

知名专家曹启富主任:冠心病低龄化?早预防早受益,守护心脏从日常做起

冠心病&#xff0c;这一曾被视为中老年疾病的代表&#xff0c;如今正悄然向更年轻的人群逼近。冠心病多发生于40岁以上的年龄段&#xff0c;但近年来&#xff0c;其发病低龄化的趋势日益明显&#xff0c;根据数据显示&#xff0c;我国城市人群15岁以及15岁以上的人口&#xff0…

STM32G474之TAMPALRM输出

TAMPALRM输出源是指“RTC唤醒”、“RTC报警A”和“RTC报警B”输出&#xff0c;可以配置从RTC_OU1(PC13)或RTC_OUT2(PB2)输出&#xff0c;而OUT2EN用来决定从哪个引脚输出。 1、TAMPALRM输出原理见下表&#xff1a; 若不看CALIB输出&#xff0c;可以简化如下表&#xff1a; 2、 …

【API Testing and Development with Postman 2nd_001】关于本书

译者按 今天又淘到一本介绍 Postman 的宝藏级小册子&#xff0c;非常适合想进一步了解 API 接口测试的朋友们。本书最大的特点就是手把手教学。想当年第 1 版问世时&#xff0c;初出茅庐的我随便拣了书中一两招&#xff0c;就能轻松搞定工作中五花八门的 API 疑难杂症。只是当时…

监听键盘事件

问题&#xff1a;点击输入框弹出键盘遮挡文字 需求&#xff1a;点击输入框键盘弹起&#xff0c;点击别处键盘回收&#xff0c;输入框回到原来状态&#xff0c; 解决办法&#xff1a; 1.采用占位的思想&#xff08;隐藏&#xff09;&#xff0c;文本框控制采用焦点控制&#…

多态的概念

多态 所谓的多态其实就是多种形态&#xff0c;它又被分为编译时多态(静态多态) 和 运行时多态(动态多态)。 静态的多态其实就是之前的模版和函数重载&#xff0c;今天我们主要讲动态的多态。所谓的动态多态其实就是相同的函数&#xff0c;完成不同的功能。 这就实现了明明都是…

C#搭建WebApi服务

1&#xff0c;OWIN的介绍 OWIN 的全称是 "Open Web Interface for .NET"&#xff0c; OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口&#xff0c; 其目的是为了实现服务器与应用之间的解耦&#xff0c;使得便携式 .NET Web 应用以及跨平台的愿望…

MongoDB事务机制

事务机制 1.事务概念 在对数据的操作的过程中&#xff0c;涉及到一连串的操作&#xff0c;这些操作如果失败&#xff0c;会导致我们的数据部分变化了&#xff0c;部分没变化。这个过程就好比如你去吃早餐&#xff0c;你点完餐了&#xff0c;并且吃完早餐了&#xff0c;没付钱你…

ES6标准---【五】【看这一篇就够了!!!】

目录 ES6以往文章 箭头函数的基本用法 箭头函数的用处 简化回调函数 rest参数与箭头函数结合 箭头函数使用注意点 this指向的问题 其它不存在的变量 不能使用call()、apply()、bind()方法改变this的指向 箭头函数不适用场合 定义对象时&#xff0c;对象方法内部包含…

信创环境下源代码防泄露解决方案

在当今数字化时代&#xff0c;信息安全已成为企业生存与发展的基石&#xff0c;尤其是在信息技术应用创新&#xff08;信创&#xff09;环境下&#xff0c;数据保护更是被提升至前所未有的高度。SDC沙盒防泄露系统以其独特的技术架构和卓越的安全性能&#xff0c;在信创环境中构…

ES6标准---【六】【学习ES6标准看这一篇就够了!!!】

目录 以往ES6文章 前言 对象属性的简洁表示法 一个实际例子 简介写法在打印对象时也很有用 注意 对象属性名表达式 用表达式做属性名 用表达式定义方法名 注意 对象方法的name属性 对象属性的可枚举性和遍历 可枚举性 属性的遍历 属性比那里次序规则 super关键…

图片生成PPT!首推这款一站式AI制作PPT工具!

在当今快节奏的工作中&#xff0c;制作一份精美的PPT演示文稿往往是一项费时费力的工作&#xff0c;特别是当我们需要将大量的图片转化为PPT时&#xff0c;传统的方法显得尤为繁琐。幸运的是&#xff0c;随着AI人工智能技术的飞速发展&#xff0c;一种更便捷地将图片转为ppt的解…

计算机毕业设计 《计算机基础》网上考试系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Java之线程篇三

​​​​​​​ 目录 线程状态 观察线程的所有状态 线程状态及其描述 线程状态转换 代码示例1 代码示例2 线程安全 概念 线程不安全的代码示例 线程不安全的原因 线程安全的代码示例-加锁 synchronized关键字 synchronized的特性 小结 形成死锁的四个必要条件 …

Java设计模式之命令模式介绍和案例示范

一、命令模式简介 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户端进行参数化、对请求排队或记录日志&#xff0c;以及支持可撤销的操作。命令模式的核心思想是将发出请…

kvm 虚拟机命令行虚拟机操作、制作快照和恢复快照以及工作常用总结

文章目录 kvm 虚拟机命令行虚拟机操作、制作快照和恢复快照一、kvm 虚拟机命令行虚拟机操作(创建和删除)查看虚拟机virt-install创建一个虚拟机关闭虚拟机重启虚拟机销毁虚拟机 二、kvm 制作快照和恢复快照**创建快照**工作常见问题创建快照报错&#xff1a;&#xff1a;intern…

超详细、史上最全pytorch安装教程

一、anaconda安装 1.下载 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirrorhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 这里划到最下面选择5.3.1最新版&#xff1a; 2.下载完成后安装 点击next 点击 I agree 选择All Us…