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 = ?