关于LambdaQueryWrapper

LambdaQueryWrapper 是 MyBatis-Plus 提供的一种类型安全的条件构造器,使用 Java 8 的 Lambda 表达式来引用实体类字段,避免了硬编码字段名

LambdaQueryWrapper<Material> wrapper = new LambdaQueryWrapper<>();
//Material为操作的实体类

常用条件方法 

// 等于
wrapper.eq(Material::getMaterialType, "办公用品");

// 不等于
wrapper.ne(Material::getMaterialType, "耗材");

// 模糊匹配
wrapper.like(Material::getMaterialName, "椅");

// 区间查询
LocalDateTime start = LocalDateTime.of(2025, 5, 2, 0, 0);
LocalDateTime end = LocalDateTime.of(2025, 5, 9, 23, 59, 59);
wrapper.between(Material::getCreateTime, start, end);

// 为空判断
wrapper.isNull(Material::getDeleteTime);

// IN查询
List<String> types = Arrays.asList("家具", "设备");
wrapper.in(Material::getMaterialType, types);

排序与分页

// 排序
wrapper.orderByDesc(Material::getCreateTime)
       .orderByAsc(Material::getPrice);

// 分页查询
Page<Material> page = new Page<>(1, 10);
Page<Material> result = materialMapper.selectPage(page, wrapper);

你可能有疑问这里并没有传入数据库相关的字段啊,他怎么匹配的

核心匹配机制

1. Lambda 表达式解析

当使用 Material::getMaterialName 这样的方法引用时:

wrapper.eq(Material::getMaterialName, "椅子");

MyBatis-Plus 通过 ASM 字节码技术解析 Lambda 表达式,获取:

  • 属性名materialName
  • 实体类com.example.Material

2. 实体类元数据解析

框架会检查 Material 类的元数据:

public class Material {
    private String materialName;
    
    // 对应的 getter 方法
    public String getMaterialName() {
        return materialName;
    }
}

3. 数据库字段名转换

MyBatis-Plus 默认使用 驼峰转下划线 命名策略:

  • 属性名称:materialName
  • 转换后的数据库字段名:material_name

4. 最终 SQL 生成

将转换后的字段名放入 SQL 语句:

WHERE material_name = ?

默认是这样但是如果实体类的字段和数据库里的不一样,都会采用@TableField匹配数据库的字段

public class Material {
    @TableField("mat_name") // 显式指定数据库字段名
    private String materialName;
}

//对应sql
WHERE mat_name = ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值