文章目录
- Hutool工具包Vo与entity转换
- 多表分页查询
- 构造器:查询
- 构造器:拼接
- 构造器:删除操作
- 构造器:修改操作
- 查询关键字
Hutool工具包Vo与entity转换
BeanUtils:copyProperties(vo, entity),vo转实体类。
LambdaQueryWrapper 构造不同类型的查询条件,
orderByDesc 方法用于降序排序。
需要注意:
使用 LambdaQueryWrapper 时,实体类 和 **数据库表 **之间映射关系。
实体类必须使用 @TableName 注解,指定表名。
多表分页查询
IPage<DeviceItemResp> devicePages = tDevicesMapper.selectJoinPage(userPage, DeviceItemResp.class,new MPJLambdaWrapper<TDevices>().select(TDevices::getSn) // 查询出指定字段.select(TDevices::getName).selectAs(TDevices::getBlueContent, DeviceItemResp::getBluetooth).innerJoin(TuserDevice.class, TuserDevice::getDeviceSn, TDevices::getSn).eq(TuserDevice::getUserId, userId).orderByDesc(TDevices::getCreateDate));// new MPJLambdaWrapper<TDevices>():
// MPJLambdaWrapper 是一个条件构造器,用于构建查询条件。
// new MPJLambdaWrapper<TDevices>() 创建了一个 TDevices 实体类的条件构造器对象。
// .selectAs() 方法用于指定查询的字段,并将其作为另一个字段的别名。这里使用 TDevices::getBlueContent 方法引用来查询 TDevices 实体类的 blueContent 字段,并将其作为 DeviceItemResp 类中的 bluetooth 字段的别名。/*** .selectAs() 方法用于指定查询的字段,并将其作为另一个字段的别名。* 这里使用 TDevices::getBlueContent 方法引用来查询 TDevices 实体类的 blueContent 字段,并将其作为 DeviceItemResp 类中的 bluetooth 字段的别名。** .innerJoin() 方法用于指定联合查询的表和关联条件。这里使用 TuserDevice.class 表示联合查询的表是 TuserDevice,并通过 TuserDevice::getDeviceSn 和 TDevices::getSn 方法引用来指定关联条件。** .eq() 方法指定查询的相等条件,这里使用 TuserDevice::getUserId 方法引用来查询 TuserDevice 表中的 userId 字段,并与变量 userId 进行相等比较。** .orderByDesc() 按照 createDate 字段进行降序排序。** 以上就是这段代码的详细解释。它主要实现了一个联合查询,并通过条件构造器指定了查询字段、关联表和条件,并对结果进行了分页和排序。*/
构造器:查询
// 简化构造器LambdaQueryWrapper<ThingInfoPO> lambdaQueryWrapper =Wrappers.lambdaQuery(类.class).eq(类::getCode, code);// 1、根据指定条件进行查询一条记录。
LambdaQueryWrapper<SaveDevice> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(SaveDevice::getDeviceUid, registerDTO.getDeviceUid());SaveDevice saveDevice = saveDeviceMapper.selectOne(queryWrapper);// 1.1 查询指定名称的用户列表
List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, "John").orderByDesc(User::getAge));// 1.2 批量查询LambdaQueryWrapper<PlantLabelConfigPo> queryWrapper =Wrappers.lambdaQuery(PlantLabelConfigPo.class).in(PlantLabelConfigPo::getId, listLabelId);// 1.3 查询出指定字段,修改时间不在某个区间的值。
LocalDateTime now = LocalDateTime.now();LocalDateTime localDateTime = now.minusHours(1);Date oneHourBefore = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());this.listObjs(new LambdaQueryWrapper<DeviceDetailLowFrequency>().notBetween(DeviceDetailLowFrequency::getUpdateTime, oneHourBefore, new Date()).select(DeviceDetailLowFrequency::getSn), Object::toString);
构造器:拼接
// 1、构造器拼接SQL语句
LambdaQueryWrapper<ThingInfoPO> wrapper =buildThingInfoQuery(tenantId).eq(ThingInfoPO::getCode, thing.getCode());// 2、拼接构造条件
private LambdaQueryWrapper<ThingInfoPO> buildThingInfoQuery(@Nullable Long tenantId) {LambdaQueryWrapper<ThingInfoPO> wrapper = new QueryWrapper<ThingInfoPO>().lambda();if (tenantId != null) {wrapper.eq(ThingInfoPO::getTenantId, tenantId);}return wrapper;}
构造器:删除操作
// 1、删除所有名字为 Jack 的用户记录
int rows = userMapper.delete(new LambdaQueryWrapper<User>().eq(User::getName, "Jack"));// 2、批量删除
LambdaQueryWrapper<PlantLabelInfoPo> wrapper = new QueryWrapper<PlantLabelInfoPo>().lambda();wrapper.in(PlantLabelInfoPo::getPlantLabelId, idList);plantLabelInfoDao.delete(wrapper);
构造器:修改操作
// 更新所有名字为 John 的用户记录,设置年龄为 30
int rows = userMapper.update(new User(), new LambdaQueryWrapper<User>().eq(User::getName, "John").set(User::getAge, 30));// 根据指定条件进行修改。
UpdateWrapper<SaveDevice> wrapper = new UpdateWrapper<>();wrapper.eq("device_uid", registerDTO.getDeviceUid());wrapper.set("psk", psk);
saveDeviceMapper.update(null, wrapper);// 更新多个字段.
LambdaUpdateWrapper<DeviceDetail> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(DeviceDetail::getSn, req.getSn());deviceDetail.setUpdateBy(CurrentUser.getUser());deviceDetail.setUpdateTime(new Date());// 更新实体类中所有字段,会覆盖数据库字段。谨慎使用。
deviceDetailMapper.update(new DeviceDetail(), updateWrapper);
查询关键字
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 +?WHERE 条件 |
and | AND 语句,拼接 +?AND 字段=值 |
andNew | AND 语句,拼接 +?AND (字段=值) |
or | OR 语句,拼接 +?OR 字段=值 |
orNew | OR 语句,拼接 +?OR (字段=值) |
eq | 等于 = |
allEq | 基于 map 内容等于 = |
ne | 不等于 <> |
gt | 大于 > |
ge | 大于等于 >= |
lt | 小于 < |
le | 小于等于 <= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
/*** 屏幕尺寸*/
@Max(message = "尺寸最大值不超过10", value = 10)
@Min(message = "尺寸最小值不低于4", value = 4)
private Integer screenSize;/*** 运行的系统平台*/@EnumVale(value = {"system_linux", "system_android", "system_none"}, message = "运行的系统平台不允许填入其他值")@NotBlank(message = "运行的系统平台数据不为空")private String system;// 使用Sa-token实现单点登录
QueryDSL仅仅是一个通用的查询框架,专注于通过 JavaAPI 构建类型安全的 Sql 查询,也可以说 QueryDSL 是基于各种 ORM 框架以及 Sql 之上的一个通用的查询框架,QueryDSL 的查询,类是于 SQL 查询,很全面只不过一个是用 SQL 一个是用代码来代替 SQL。