MybatisPlus多表联查-分页关联查询+根据id获取多表联查后的单行数据

news2025/5/22 4:25:59

分页关联查询

需求分析

两张表w以及d,需要w的一些字段以及d的一些字段在前端显示
此时就需要用到关联查询,查询到的数据放入视图类,显示在前端

项目结构

在这里插入图片描述

视图类

package com.wedu.modules.tain.entity.vo;

import lombok.Data;

import java.util.Date;

@Data
public class WarnVo {
    //传输给前端展示
    //id
    private Long id;
    //车间
    private String workshops;
    //设备编号
    private String deviceNumber;
    //设备名称
    private String deviceName;
    //设备型号
    private String deviceModel;
    //维保到期时间
    private Date tainEndTime;
    //预警时间
    private Date warnTime;
    //状态(是否生成预警信息 是否被保养)
    private int status;
}

定义关联查询分页方法

首先在mapper接口中再定义分页的关联查询方法,复用分页类page,querywrapper组装where条件

@Mapper
public interface TainWarnMapper extends BaseMapper<TainWarn> {
    IPage<WarnVo> selectWarnPage(IPage<WarnVo> page, @Param(Constants.WRAPPER) QueryWrapper<WarnVo> wrapper);
}

在对应xml内创建对应的关联查询

  • TainWarnMapper.xml
<select id="selectWarnPage" resultType="com.wedu.modules.tain.entity.vo.WarnVo">
        select w.id,d.workshops,d.device_number,d.device_name,d.device_model,w.warn_time,w.tain_end_time,d.status
        from tain_warn w left join device d
                                   on d.id=w.device_id
            ${ew.customSqlSegment}
    </select>

${ew.customSqlSegment}是MyBatis Plus提供的动态SQL语句拼接功能。
在使用MyBatis Plus进行数据库操作时,可以通过Wrapper对象来构建查询条件。Wrapper对象可以通过链式调用的方式动态添加查询条件,包括等于、大于、小于等各种条件。而${ew.customSqlSegment}就是Wrapper对象中自定义的SQL片段,可以灵活地根据业务需求进行动态拼接。

service层

在service内写一个接口方法在impl内实现,先新建一个查询每页显示10条,再手动关闭sql优化避免查询总数的时候只查询主表,再创建querywrapper对象写查询条件,最后调用mapper接口的分页关联查询方法,传入分页的查询和查询条件,最后返回对象

  • ITainWarnService
public interface ITainWarnService extends IService<TainWarn> {
    PageUtils queryWarnPage(Map<String, Object> params);
}
  • TainWarnServiceImpl
    @Autowired
    private TainWarnMapper tainWarnMapper;

    @Override
    public PageUtils queryWarnPage(Map<String, Object> params) {
        // 从参数中获取当前页码和每页大小
        //.toString() 从 params 集合中检索到的值转换为字符串格式
        //Integer.parseInt()将字符串解析为整数
        int current = Integer.parseInt(params.get("page").toString());
        int pageSize = Integer.parseInt(params.get("limit").toString());
        // 设置分页参数
        Page<WarnVo> page = new Page<>(current,pageSize);
        //一定要手动关闭 SQL 优化,不然查询总数的时候只会查询主表
        page.setOptimizeCountSql(false);
        QueryWrapper<WarnVo> qw = new QueryWrapper<>();
        //组装查询条件 where status = 1
        qw.eq("status","1");
        IPage<WarnVo> wp = tainWarnMapper.selectWarnPage(page,qw);
        return new PageUtils(wp);
    }

TainWarnController实现分页查询

和之前写的分页查询一模一样,查询过程变了,但最后和前端的交互是一样的

    @Autowired
    private ITainWarnService iTainWarnService;

    @GetMapping("/queryWarnMessage")
    public R queryWarnMessage(@RequestParam Map<String,Object> params){
        PageUtils page = iTainWarnService.queryWarnPage(params);
        return R.ok().put("page",page);
    }

前端显示如图,分页关联查询成功
在这里插入图片描述

根据id获取当前一行数据

在前端点击添加保养记录的时候获取这条数据的id,根据当前点击数据的id查询warnVo实体类找到该条数据,warnVo是w和d两张表关联查询的结果

TainWarnMapper

首先写一个接口,传入id获取单行数据的实体类,@Param("id")写别名

@Mapper
public interface TainWarnMapper extends BaseMapper<TainWarn> {
    WarnVo selectById(@Param("id") Long id);
}

在xml内写查询语句,这里明确根据id查找可以直接写where,不用高级查询querywrapper再拼接

<select id="selectById" resultType="com.wedu.modules.tain.entity.vo.WarnVo" parameterType="java.lang.Long">
        select w.id,d.workshops,d.device_number,d.device_name,d.device_model,w.warn_time,w.tain_end_time,d.status
        from tain_warn w left join device d
                                   on d.id=w.device_id
        where w.id = #{id}
    </select>

ITainWarnService

public interface ITainWarnService extends IService<TainWarn> {
    WarnVo selectById(Long id);
}

TainWarnServiceImpl

    @Override
    public WarnVo selectById(Long id) {
        return tainWarnMapper.selectById(id);
    }

TainWarnController

    //根据id拿出用户信息
    @GetMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        WarnVo warnVo = iTainWarnService.selectById(id);
        return R.ok().put("warnVo",warnVo);
    }

根据id查询结果可在network的response内看到
在这里插入图片描述
在这里插入图片描述

部分前端代码

<script>
export default {
  data() {
    return {
      dataForm: {
        id: 0,
        workshops: "",
        deviceNumber: "",
        deviceName: "",
        deviceModel: "",
        tainEndTime: "",
        warnTime: "",
        status: "",
      },
      dialogVisible: false,
    };
  },
  methods: {
    init(id) {
        this.dataForm.id=id;
      this.dialogVisible = true;
      this.$nextTick(() => {
        this.$refs["dataForm"].resetFields();
      });
      if (this.dataForm.id) {
        this.$http({
          url: this.$http.adornUrl(`/tain/warn/info/${this.dataForm.id}`),
          method: "get",
        }).then(({ data }) => {
          if (data && data.code === 0) {
            (this.dataForm.workshops = data.warnVo.workshops),
              (this.dataForm.deviceNumber = data.warnVo.deviceNumber),
              (this.dataForm.deviceName = data.warnVo.deviceName),
              (this.dataForm.deviceModel = data.warnVo.deviceModel),
              (this.dataForm.tainEndTime = data.warnVo.tainEndTime),
              (this.dataForm.warnTime = data.warnVo.warnTime),
              (this.dataForm.status = data.warnVo.status);
          }
        });
      }
    },
    handleClose(done) {
      this.$confirm("确认关闭?")
        .then((_) => {
          done();
        })
        .catch((_) => {});
    },
  },
};
</script>

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

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

相关文章

深度学习基础——U-Net图像分割

图像分割&#xff0c;就是根据图像的某种相似性特征(如亮度、颜色、纹理、面积、形状、位置、局部统计特征或频谱特征等&#xff09;将医学图像划分为若干个互不相交的“连通”区域。 相关特征在同一区域内表现出一致性或相似性&#xff0c;而在不同区域间表现出明显的…

阿赵UE学习笔记——16、渲染性能相关

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。上一篇说了灯光的移动性问题&#xff0c;这一篇来看看怎样去辨别灯光性能的好坏。   虚幻引擎里面有一组显示模式是专门用来看场景当前的灯光和网格渲染的&#xff0c;叫做优化试图模式&#x…

动态内存管理(中)

动态内存管理&#xff08;上&#xff09;-CSDN博客&#xff08;malloc&#xff0c; realloc&#xff0c; calloc&#xff0c; free函数的用法以及注意事项等知识点&#xff09; 目录 1.对空指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态内存开辟空间使用free空间…

SpringBoot + Nacos 实现动态化线程池

1.背景 在后台开发中&#xff0c;会经常用到线程池技术&#xff0c;对于线程池核心参数的配置很大程度上依靠经验。然而&#xff0c;由于系统运行过程中存在的不确定性&#xff0c;我们很难一劳永逸地规划一个合理的线程池参数。 在对线程池配置参数进行调整时&#xff0c;一…

网络:SNMP协议

1. SNMP技术原理 SNMP的结构包括网管站NMS&#xff08;Network Management Station&#xff09;和Agent两部分。SNMP协议是规定NMS和Agent之间如何传递管理信息的应用层协议&#xff08;UDP协议&#xff0c;使用162端口&#xff09;。 2. SNMP版本 SNMPv1:方便实现&#xff0c…

怎么在电脑上做工作笔记?电脑桌面电子笔记软件

在繁忙的职场中&#xff0c;随时随地记录工作笔记是许多职场人士的日常需求。这不仅包括了会议记录、项目进展&#xff0c;还有一些灵感、规划和工作要点&#xff0c;都需要随手记下&#xff0c;以便随时查看和回顾。那么我们如何在电脑上做工作笔记更高效、便捷呢&#xff1f;…

Python实现线性逻辑回归和非线性逻辑回归

线性逻辑回归 # -*- coding: utf-8 -*- """ Created on 2024.2.20author: rubyw """import matplotlib.pyplot as plt import numpy as np from sklearn.metrics import classification_report from sklearn import preprocessing from sklearn…

jmeter 命令行启动 动态参数化

[Jmeter命令行参数] 一、在linux中&#xff0c;使用非gui的方式执行jmeter。若需更改参数&#xff0c;必须先编辑jmx文件&#xff0c;找到对应的变量进行修改&#xff0c;比较麻烦。因此&#xff0c;可以参数化一些常用的变量&#xff0c;直接在Jmeter命令行进行设置 二、参数…

信息安全法律法规体系

信息安全法律法规体系 我国信息安全法规体系可以分为4层。 法律层面具体对应的法律、法规一般性法律规定宪法、国家安全法、国家秘密法、治安管理处理条例等虽然没有专门针对信息安全的条款,但约束了信息安全相关的行为规范和惩罚信息网络犯罪的法律《中华人名共和国刑法》《…

专家之路上的Flow高级秘籍

公众号「稀有猿诉」 原文链接 专家之路上的Flow高级秘籍 『君不见&#xff0c;黄河之水天上来&#xff0c;奔流到海不复回。』 学习与河流一样&#xff0c;一方面学无止境&#xff0c;又是逆水行舟&#xff0c;不进则退&#xff0c;因为其他人都在卷。前文一篇文章讲了F…

单片机02_寄存器_GPIO设置

芯片概述 C51&#xff1a;0口、1口、2口、3口&#xff0c;P00~p07、P10~P17、P20~P27、P30~P37 STM32&#xff1a;A口、B口、C口、D口&#xff0c;PA0~PA15/PA5 GPIOA.5 STM32F407ZGT6有7组GPIO端口&#xff0c;分别是&#xff1a;A B C D E F G&#xff0c;每组均有16个GPIO端…

com.alibaba.fastjson.JSONException: toJSON error的原因

问题&#xff1a; 导出接口报错&#xff0c;显示json格式化异常 发现问题&#xff1a; 第一个参数为HttpResponse,转换成json的时候报错 修改方法&#xff1a; 1.调换两个参数的位置 2.在aop判断里边 把ServletAPI过滤掉 Before("excudeWebController()")pub…

Leetcode1206(设计跳表)

例题&#xff1a; 分析&#xff1a; 我们先来找一找跳表与单链表的相同点和不同点。 相同点&#xff1a; 跳表和单链表一样&#xff0c;都是由一个一个的节点组成的链表。 不同点&#xff1a; ①&#xff1a;跳表中的元素已经是排好序的&#xff08;图中从小到大&#xff09;&…

突破性创新:OpenAI推出Sora视频模型,预示视频制作技术的未来已到来!

一、前言 此页面上的所有视频均由 Sora 直接生成&#xff0c;未经修改。 OpenAI - Sora is an AI model that can create realistic and imaginative scenes from text instructions. 2024 年 2 月 16 日&#xff0c;OpenAI 发布 AI 视频模型 Sora&#xff0c;60 秒的一镜到底…

STM32-启用蜂鸣器

目录 1 、电路构成及原理图 2、编写实现代码 main.c beep.c beep.h 3、代码讲解 4、 烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开…

VILT算法解读

VILT是一种典型的单塔结构&#xff0c;不同于双塔结构由两个独立的Image Encoder以及Text Encoder组成&#xff08;比如clip&#xff09;&#xff0c;单塔结构的模型一般只有一个共用的编码器&#xff0c;称为Multi-Modal Encoder。 1、VILT算法原理 VILT被认为是最简单的…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

PostgreSQL按日期列创建分区表

在PostgreSQL中&#xff0c;实现自动创建分区表主要依赖于表的分区功能&#xff0c;这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据&#xff0c;通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤&…

docker之安装mongo创建运行环境

目录 一、docker pull 最新资源 二、启动mongo镜像 启动命令查看日志拉取低版本镜像成功启动 三、进入mongo容器 进入容器进入mongo环境查询当前所在库切换库至admin随意切换库 并 创建用户登录用户新增文档数据等 五、总结 版本兼容可备份操作 一、docker pull 最新资源…