mybatis-plus构造器查询


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;
    }

// 3. 指定条件分页= 拼接 sql 语句.
public IPage<ClientVersionConfigResp> retrieves(HistoricalVersionReq req) {
        LambdaQueryWrapper<ClientVersionConfigPo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ClientVersionConfigPo::getPlatform, req.getPlatform());
        if (req.isSortRule()) {
            wrapper.orderByAsc(ClientVersionConfigPo::getId);
        } else {
            wrapper.orderByDesc(ClientVersionConfigPo::getId);
        }
        IPage<ClientVersionConfigPo> clientVersionConfigPoIPage = clientVersionConfigMapper.selectPage(
                new Page<>(req.getCurrent(), req.getSize()),wrapper);

        IPage<ClientVersionConfigResp> respIPage = clientVersionConfigPoIPage.convert(
                ConverterMapper.INSTANCE::ClientVersionConfigPoToResp);
        return respIPage;
    }

构造器:删除操作

// 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 查询字段
whereWHERE 语句,拼接 +?WHERE 条件
andAND 语句,拼接 +?AND 字段=值
andNewAND 语句,拼接 +?AND (字段=值)
orOR 语句,拼接 +?OR 字段=值
orNewOR 语句,拼接 +?OR (字段=值)
eq等于 =
allEq基于 map 内容等于 =
ne不等于 <>
gt大于 >
ge大于等于 >=
lt小于 <
le小于等于 <=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL
groupBy分组 GROUP BY
havingHAVING 关键词
orderBy排序 ORDER BY
orderAscASC 排序 ORDER BY
orderDescDESC 排序 ORDER BY
existsEXISTS 条件语句
notExistsNOT EXISTS 条件语句
betweenBETWEEN 条件语句
notBetweenNOT 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
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值