多表联合查询 - 基于注解SQL

简介
大概流程就是

先把要联合查询的参数封装到一个类里进行返回 - 结果类
再在mapper中注入SQL查询语句 - @Select
最后在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封装了进去,这样返回时,就可以将设备信息和车牌号一并返回(多表联合查询的目的就是这个,联合多个表的数据进行返回)

  1. mapper中注入SQL语句
    这里有多种方式:

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

DeviceMapper.java

public interface DeviceMapper extends BaseMapper {
/**
* 联合查询 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 joinCarPage(Page<?> page, @Param(Constants.WRAPPER) Wrapper wrapper);
}
代码说明:

@Select注解:注入SQL语句

@Param(Constants.WRAPPER) Wrapper 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中定义

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

核心代码如下:

QueryWrapper 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 ?,?
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值