作者:汤圆

个人博客:javalover.cc

前言

背景:Spring Boot + MybatisPlus

用MybatisPlus就是为了不写SQL,用起来方便;

但是如果需要多表联合查询,还是需要手写SQL(不过GitHub上也是有一些开源的库,可以不写SQL)

本节介绍的还是通用的写法,基于注解SQL实现的多表联合查询

简介

大概流程就是

  1. 先把要联合查询的参数封装到一个类里进行返回 - 结果类
  2. 再在mapper中注入SQL查询语句 - @Select
  3. 最后在service中拼接查询条件 - QueryWrapper构造器(这里没用Lambda构造器,因为它不支持编写自定义的字段名)

正文

我们就按照上面的流程来演示:

先贴一下这里我们要执行的SQL查询语句:这里只贴了我们手写的部分,还有一部分是程序在后面自动追加的(比如条件、分页),这里先不写

select device.*, car.car_number from gps_device as device left join gps_car as car on device.car_id = car.car_id

1. 定义实体结果类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceResult extends Device implements Serializable { /**
* 车牌号:只有这个属性是联合Car查询的,其他属性都是Device自带的
*/
private String carNumber; /**
* 设备id
*/
private Long deviceId; /**
* 车辆id
*/
private Long carId; /**
* 设备类型:0-无线,1-有线
*/
private Integer deviceType; /**
* 设备编号
*/
private String deviceNumber; /**
* SIM卡号
*/
private String simNumber; }

可以看到,这里我们将联合查询的carNumber封装了进去,这样返回时,就可以将设备信息和车牌号一并返回(多表联合查询的目的就是这个,联合多个表的数据进行返回)

2. mapper中注入SQL语句

这里有多种方式:

  • 基于注解
  • 基于xml

这里我们用的是基于注解(因为Spring Boot中xml的使用还是比较少的)

DeviceMapper.java

public interface DeviceMapper extends BaseMapper<Device> {
/**
* 联合查询 left join car
*/
@Select("select device.*, car.car_number from gps_device as device left join gps_car as car on device.car_id = car.car_id ${ew.customSqlSegment}")
Page<DeviceResult> joinCarPage(Page<?> page, @Param(Constants.WRAPPER) Wrapper<Device> wrapper);
}

代码说明:

  • @Select注解:注入SQL语句

  • @Param(Constants.WRAPPER) Wrapper<Device> wrapper: 这个注解有点类似@RequestParam,用来代替SQL语句中的ew变量(如果把形参wrapper改为ew,就不需要加@Param注解);

    这里的构造器wrapper中的自定义SQL会自动追加到@Select语句的后面,最后的service中会有拼接结果SQL

  • BaseMapper:Mybatis-Plus的基类Mapper,封装了各种常用的数据库操作(增删改查分页等),有了它,一些基本的操作(增删改查等)我们就不用自己去写SQL

  • Page:Mybatis-Plus中的分页对象,将联合查询的数据进行分页;这里的分页相关的SQL会自动追加到wrapper包装器的后面(同上面的wrapper)

最后拼接的SQL为:

select device.*, car.car_number from gps_device as device left join gps_car as car on device.car_id = car.car_id LIMIT ?,?

其中limit ?, ?就是Page自动追加的SQL,wrapper追加的SQL在下面的service中定义

3. Service中调用mapper

此时在Service中就不能再使用Lambda表达式了,因为这里需要自定义字段名

核心代码如下:

QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(ObjectUtil.isNotEmpty(deviceParam.getDeviceType()), "device.device_type", deviceParam.getDeviceType());
queryWrapper.like(ObjectUtil.isNotEmpty(deviceParam.getCarNumber()), "car.car_number", deviceParam.getCarNumber());

最后拼接的SQL为:(这里假设deviceType和carNumber都有传进来)

select device.*, car.car_number from gps_device as device left join gps_car as car on device.car_id = car.car_id where (device.device_number = ? and car.car_number = ?) LIMIT ?,?

总结

基于注解的多表联合查询,分三步:

  1. 定义实体结果类:封装需要多表联合查询的数据
  2. 在mapper中注入SQL语句
  3. 在service中调用mapper,拼接where条件

后记

其实这种写法还是比较繁琐的,但好在用的不多;如果用的多,建议去找一些开源的库来整合

多表联合查询 - 基于注解SQL的更多相关文章

  1. springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany

    springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...

  2. SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询

    SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...

  3. mybatis:开发环境搭建--增删改查--多表联合查询(多对一)

    什么是mybatisMyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或 ...

  4. yii 多表联合查询的几种方法

    yii多表联合查询, 第一种,用command,自己拼接sql语句执行查询 第二种,用AR,model需继承下面的ar,执行queryall或queryrow方法 <?php //applica ...

  5. Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新

    CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...

  6. SharePoint 2013 列表多表联合查询

    在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...

  7. MyBatis 多表联合查询及优化 以及自定义返回结果集

    下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...

  8. 一步步学Mybatis-实现多表联合查询(4)

    上一章节中我们已经完成了对单表的CRUD操作,接下来今天这一讲讲述的是关于Mybatis在多表查询时候的应用,毕竟实际业务中也是多表的联合查询比较多嘛~ 还记得最一开始我们新建过一张Website表吗 ...

  9. MyBatis 多表联合查询,字段重复的解决方法

    MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...

随机推荐

  1. 1. HTML <fieldset> 标签

    定义和用法 fieldset 元素可将表单内的相关元素分组. <fieldset> 标签将表单内容的一部分打包,生成一组相关表单的字段. 当一组表单元素放到 <fieldset> ...

  2. 认识Git并了解Git的基本知识

    目录 认识Git 版本控制 版本控制的发展史 安装Git Git的核心概念 Git的使用原理 Git的工作流程 Git的基本流程 Git与SVN的区别 Git的基本使用 初始化Git 创建一个Git仓 ...

  3. webpack的构建流程

    一.运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条webpack机制中,去改变webpa ...

  4. C语言-内存函数的实现(二)之memmove

    C语言中的内存函数有如下这些 memcpy memmove memcmp memset 下面看看memmove函数 memmove 为什么会需要memmove函数? int main() { int ...

  5. 【全网首发】鸿蒙开源三方组件--强大的弹窗库XPopup组件

    目录: 1.介绍 2.效果一览 3.依赖 4.如何使用 5.下载链接 6.<鸿蒙开源三方组件>文章合集 1. 介绍 ​ XPopup是一个弹窗库,可能是Harmony平台最好的弹窗库.它从 ...

  6. 关于Spring Boot 多数据源的事务管理

    自己的一些理解:自从用了Spring Boot 以来,这近乎零配置和"约定大于配置"的设计范式用着确实爽,其实对零配置的理解是:应该说可以是零配置可以跑一个简单的项目,因为Spri ...

  7. hdu4046 不错的线段树单点更新

    题意:       给一个字符串,两种操作 0 a b 询问a,b之间有多少个wbw, 1 a c 就是把第a个改成c. 思路:       这个题目我们可以用线段树的点更新来做,一开始写了个好长好长 ...

  8. Windows下包管理工具Bower的安装和使用

    目录 安装Bower Bower的使用 安装Bower Windows下安装Bower之前,先安装好 nodejs 和 msysgit 环境 然后我们就可以使用npm包管理工具下载并全局安装bower ...

  9. Windows核心编程 第十一章 线程池的使用

    第11章 线程池的使用 第8章讲述了如何使用让线程保持用户方式的机制来实现线程同步的方法.用户方式的同步机制的出色之处在于它的同步速度很快.如果关心线程的运行速度,那么应该了解一下用户方式的同步机制是 ...

  10. Jenkins+Git的搭建和自动部署

    前言 Jenkins在工作中都使用过,之前都是运维去搭建部署,弄好了之后给我一个网址去构建项目就可以了,所以也都是一直没了解过安装过程. 今天在自己的服务器上搭建了一遍,中间有遇到很多坑,特在此归纳总 ...