简介
大概流程就是
先把要联合查询的参数封装到一个类里进行返回 - 结果类
再在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
-
定义实体结果类
@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;
- 车牌号:只有这个属性是联合Car查询的,其他属性都是Device自带的
}
可以看到,这里我们将联合查询的carNumber封装了进去,这样返回时,就可以将设备信息和车牌号一并返回(多表联合查询的目的就是这个,联合多个表的数据进行返回)
- 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中定义
- 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