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

构造器:删除操作

// 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

相关推荐

  1. mybatis-plus构造查询

    2023-12-08 16:42:06       65 阅读
  2. MyBatis-Plus 关联查询

    2023-12-08 16:42:06       34 阅读
  3. MyBatis-Plus】分页查询

    2023-12-08 16:42:06       65 阅读
  4. Mybatis-plus手写SQL如何使用条件构造和分页

    2023-12-08 16:42:06       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 16:42:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 16:42:06       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 16:42:06       87 阅读
  4. Python语言-面向对象

    2023-12-08 16:42:06       96 阅读

热门阅读

  1. NGINX安装升级

    2023-12-08 16:42:06       55 阅读
  2. 我的创作纪念日

    2023-12-08 16:42:06       61 阅读
  3. 强引用、软引用、弱引用和虚引用

    2023-12-08 16:42:06       61 阅读
  4. 1、命名空间、C++的复合类型、缺省参数

    2023-12-08 16:42:06       56 阅读
  5. STM32-OLED显示屏

    2023-12-08 16:42:06       46 阅读
  6. 硬件时间与系统时间同步

    2023-12-08 16:42:06       54 阅读
  7. php研究课题

    2023-12-08 16:42:06       51 阅读
  8. MongoTemplate 常用查询

    2023-12-08 16:42:06       43 阅读
  9. C/C++ 快速排序

    2023-12-08 16:42:06       64 阅读
  10. C语言-动态内存分配

    2023-12-08 16:42:06       55 阅读