【mybatis-plus@Select注解联表查询实现分页】

news2024/9/22 11:33:54

前言

MybatisPlus对于单表的操作很方便,但是多表查询等复杂的操作还是需要在xml中写sql语句来完成。那么,在MybatisPlus中如何实现多表联查、分页查询呢。


一、数据库表设计

我们模拟一个购物的情况,在数据库创建两个表,一个用户表,一个订单表。

用户表字段如下:

用户id、姓名、地址、deleted是一个假删除的字段,默认值是0,当对某个用户进行删除操作时将deleted的值0改为1。来标识某个数据被假删除了,查询的时候查不到,但是打开表数据还是存在的。

订单表字段如下:

订单id、数量、产品名、下单时间、更新时间、用户id

二、环境配置

1.引入依赖pom.xml
<!-- 数据库驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- lombok 简化set get toString -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <!-- mybatis-plus -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.4.3.1</version>
    </dependency>
   
2.application.yml

 

 3.实体类

User

private List<Order> orders;把order表的属性封装进一个几list集合里,用于实现多表联查。

@Data
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private String address;
    @TableLogic //逻辑删除
    private Integer deleted;
    @TableField(exist = false)//一对多
    private List<Order> orders;
}

Order

@Data
@TableName("`order`")
public class Order {
    @TableId("id")
    private Long id;
    private String number;
    @TableField("product_name")
    private String productName;
    @TableField("order_time")

    private LocalDateTime orderTime;
    @TableField("update_time")
    private LocalDateTime updateTime;
    @TableField("u_id")
    private Long uId;


    public Long getuId() {
        return uId;
    }
    
}
5.UserConller
 /**
     * mybatisplus分页插件分页
     * @param page
     * @return
     */
    @GetMapping("selectByPage")
    public Page<User> selectByPage(Page <User> page) {
        return userService.selectByPage(page);

    }
6.UserService
public interface UserService extends IService<User> {
    Page<User> selectByPage(Page <User> page)
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    private UserMapper userMapper;

     
    @Override
    public Page<User> selectByPage(Page<User> page) {
        return userMapper.selectByPage(page);
    }
}
7.UserMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {

          //自定义方法
    Page<User> selectByPage(@Param("page") Page <User> page);

}
8.OrderMapper 

通过@Select注解,可以让开发人员在不写XML 配置文件的情况下,直接在接口方法中编写SQL语句,简化了开发流程。如下图

@Mapper
public interface OrderMapper extends BaseMapper<Order> {


   @Select("select * from `order` where u_id=#{uid}")
   List<Order> selectByUserId(@Param("uid") Long uid);
}

 这个例子中,@Select注解指定了SQL查询语句,其中#{uid}是参数占位符,标识方法参数中的uid变量。mybatis会自动将查询到的结果映射到返回值类型为LIst<order>的变量中。

9.xml文件 

两个表连接条件是id=uid,通过xml文件里写的sql语句查询User 表中的所有记录,

<collection property="orders" column="id"得到用户id,
select="com.wedu.mapper.OrderMapper.selectByUserId"作为一个子查询,查询了order表里的数据,将得到的用户id传给@Select注解指定了SQL查询语句里的#{uid},从而得通过id=uid将两个表关联数据关联起来。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wedu.mapper.UserMapper">
    <resultMap id="selectResultMap" type="com.wedu.entity.User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="address" property="address"/>
        <result column="deleted" property="deleted"/>
        <!--
            collection:一对多映射
                property:要映射的实体类的属性名
                ofType:指定映射属性类型
         -->
        <collection property="orders" column="id" ofType="com.wedu.entity.Order" select="com.wedu.mapper.OrderMapper.selectByUserId">
        </collection>
    </resultMap>

        <select id="selectByPage" resultMap="selectResultMap">
        SELECT
            *
        FROM
            user u

    </select>

三、测试

通过postman进行测试

current是当前页数、size是条数,通过修改这两个值进行分页。

{
    "records": [
        {
            "id": 5,
            "name": "王五",
            "address": "北京",
            "deleted": 0,
            "orders": [
                {
                    "id": 11,
                    "number": "6",
                    "productName": "手机",
                    "orderTime": "2024-08-12T21:09:13",
                    "updateTime": "2024-08-12T21:09:16",
                    "uId": 5
                },
                {
                    "id": 16,
                    "number": "4",
                    "productName": "玩偶",
                    "orderTime": "2024-08-14T09:09:28",
                    "updateTime": "2024-08-14T09:09:35",
                    "uId": 5
                }
            ]
        },
        {
            "id": 6,
            "name": "赵六",
            "address": "上海",
            "deleted": 0,
            "orders": [
                {
                    "id": 14,
                    "number": "13",
                    "productName": "笔记本",
                    "orderTime": "2024-08-14T11:23:25",
                    "updateTime": "2024-08-14T11:23:30",
                    "uId": 6
                }
            ]
        }
    ],
    "total": 9,
    "size": 2,
    "current": 1,
    "orders": [],
    "optimizeCountSql": true,
    "searchCount": true,
    "countId": null,
    "maxLimit": null,
    "pages": 5
}

总结:

通过这个子查询实现的联表查询,得到的结果每个用户对应的订单不管有多少个分页时都算做一条数据,否则就会出现每个用户对应的订单号每有一个订单就算做一个数据,这样分页时同一个用户的不同订单就会被分散在不同页面。

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

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

相关文章

MeterSphere接口测试脚本断言

MeterSphere接口测试脚本断言 我们在接口自动化测试过程中&#xff0c;经常遇到无论我们传入什么数据信息&#xff0c;只要响应体报文中某个字段为不固定的特定信息&#xff08;如&#xff1a;或1或2或3&#xff09;&#xff0c;就符合预期&#xff0c;流程就可以继续&#xf…

通过JPA映射数据库

在 JPA (Java Persistence API) 中&#xff0c;实体类通常通过一系列注解来配置&#xff0c;以便与数据库表进行映射,与Mybatis-plus在功能上&#xff0c;具有一定的相似性,都是持久化框架。 package com.plumcarefree.demo.entity.user; import javax.persistence.*; impor…

用Python爬取高德地图地铁站点数据——Python程序及详解

0. 准备工作 在使用以下Python程序爬取高德地图地铁站点数据前&#xff0c;需要先在“高德开放平台”&#xff08;网站&#xff1a;高德开放平台 | 高德地图API&#xff09;申请一个API Key。具体操作为&#xff1a;注册一个“高德开放平台”账号&#xff0c;找到右上角的控制…

ImportError: DLL load failed: 找不到指定的程序的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

mycat读写分离实现、企业架构MySQL读写分离

一、mycat读写分离实现 1. 添加一个新的虚拟主机&#xff0c;设置ip为10.1.1.60,主机名为mycat.yuanyu.zhangmin.关闭防火墙 SELinux NetworkManager 2. 上传jdk和mycat安装包 3. 解压并且添加到指定的位置 [rootmycat ~]# ls anaconda-ks.cfg frp initserver.sh jdk1.8.0_19…

24暑假算法刷题 | Day30 | 贪心算法 IV | LeetCode 452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间

目录 452. 用最少数量的箭引爆气球题目描述题解 435. 无重叠区间题目描述题解 763. 划分字母区间题目描述题解 452. 用最少数量的箭引爆气球 点此跳转题目链接 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中…

【Docker】Elasticsearch 8.12 安装与搭建

由于工作过程中硬件资源未能达到要求&#xff0c;现将使用 Elasticsearch 取代原 Redis MySQL Milvus 技术栈&#xff0c;在重新搭建的同时记录一下搭建过程&#xff08;由于之前也分享过 Docker 版本 Elasticsearch 5.x 和 Elasticsearch 7.x 的部署方法&#xff0c;因此本文…

横看成岭侧成峰,远近高低各不同 —— 深入探讨Obfs4流量识别:特征、方法与应用

目录 引言 Obfs4流量特征 数据包大小与分布 时间间隔&#xff08;IAT&#xff09; 流量方向 加密特征 Obfs4流量识别方法 深度学习模型识别 示例代码 基于部分数据的多级剪枝方法 方法步骤 深度包检测与机器学习结合 应用场景 网络安全监控 Tor网络访问优化 匿…

分层神经网络(DNN)知多少?

分层神经网络作为深度学习的核心架构&#xff0c;已经彻底改变了我们处理复杂问题的方式。本文将带我们走进神经网络的基础知识&#xff0c;揭开GPT这些强大模型的神秘面纱。希望通过本文的介绍&#xff0c;我们不仅能够理解神经网络的基本构成&#xff0c;还能洞察到它们是如何…

OpenCV图像处理——轮廓的面积与弧长计算(C++/Python)

概述 轮廓面积与轮廓周长是图像分析中的两项核心统计特征&#xff0c;它们为理解和量化图像中的形状提供了基础。 轮廓面积&#xff1a;这代表了轮廓所界定区域的像素数量&#xff0c;是衡量区域大小的直接指标。面积的计算结果以像素平方为单位&#xff0c;为我们提供了一个量…

Wireshark_DNS_v7.0

Wireshark_DNS_v7.0 一、 nslookup 前置 nslookup 是一个网络命令行工具&#xff0c;用于查询域名系统&#xff08;DNS&#xff09;中的域名解析记录。通过使用 nslookup&#xff0c;你可以获取某个域名的IP地址&#xff0c;或者获取与某个IP地址关联的域名信息。 查看域名…

学校医院NTP电子钟让时间管理更加智能

在学校和医院这样的重要场所&#xff0c;时间的精确管理至关重要。每一分每一秒都可能关系到教学的进度、医疗的效果以及师生和患者的体验。而 NTP 电子钟的出现&#xff0c;为学校和医院的时间管理带来了全新的智能化变革。 一、NTP 电子钟在学校应用 NTP 电子钟&#xff0c;…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第七十八章 离线构建Yocto系统

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

【HarmonyOS】鸿蒙应用蓝牙功能实现 (一)

【HarmonyOS】鸿蒙应用蓝牙功能实现 前言 蓝牙技术是一种无线通信技术&#xff0c;可以在短距离内传输数据。它是由爱立信公司于1994年提出的&#xff0c;使用2.4 GHz的ISM频段&#xff0c;可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机…

工厂流水线MES报工一体机改善生产管理效率

作为智能制造的重要组成部分&#xff0c;MES系统&#xff08;制造执行系统&#xff09;在优化生产流程、提高生产效率、降低生产成本等方面发挥着不可替代的作用。而MES报工一体机作为MES系统的重要组成部分&#xff0c;更是帮助企业实现生产管理效率提升的利器。 一、MES报工一…

为何有了云计算,还需要边缘计算?EasyCVR视频平台助力数据高效汇聚与管理

在当今数字化的时代&#xff0c;云计算可谓是大名鼎鼎&#xff0c;它为我们的生活和工作带来了巨大的便利。但你有没有想过&#xff0c;既然有了强大的云计算&#xff0c;为什么还会出现边缘计算呢&#xff1f; 一、云计算与边缘计算&#xff1a;相辅相成的科技双雄 先来说说…

船员考证题库刷题

1、船舶主配电板系统&#xff0c;设有地气灯、配电板式兆欧表和低绝缘报警装置&#xff0c;及船舶照明分配电箱&#xff0c;当发生单相接地故障时而进行排查时&#xff0c;______设备是不能随意断电的。 A、厨房用电 B、卫星基站 C、起重机用电 答案&#xff1a;B 2、燃油…

修复或更换:螺杆机支撑座磨损后的处理选择

螺杆机后端支撑座磨损&#xff0c;主要是由于长期使用&#xff0c;润滑不足或使用劣质润滑油等原因导致的。当螺杆机支撑座出现磨损时&#xff0c;其承载能力会逐渐下降&#xff0c;加速磨损&#xff0c;导致设备运行不稳定&#xff0c;噪音增大&#xff0c;严重时还会导致设备…

老照片一键修复怎么做?6个软件帮助你快速进行老照片修复

老照片一键修复怎么做&#xff1f;6个软件帮助你快速进行老照片修复 老照片修复可以让陈旧、褪色或损坏的照片恢复到原有的光彩和清晰度。以下是六款方便好用的软件&#xff0c;能够帮助你快速进行老照片修复&#xff0c;且许多都支持一键操作。 智能修复老照片 这是一款专…

【Linux】守护进程:containerd的使用教程

这里写目录标题 前言一. ctr1.1 ctr CLI1.2 ctr 调试 二、 创建 container2.1 进入 NewContainer2.2 ContainerService().Create 前言 介绍了 kubelet 通过 cri 接口和 containerd 交互的过程&#xff0c;containerd 源码分析&#xff1a;启动注册流程 介绍了 containerd 作为…