3.2 条件构造器
条件方法一览
| 方法 | 说明 | 示例 |
|---|---|---|
isNull(字段) | 为空 | column IS NULL |
isNotNull(字段) | 不为空 | column IS NOT NULL |
eq(字段, 值) | 等于 | column = ? |
ne(字段, 值) | 不等于 | column <> ? |
gt(字段, 值) | 大于 | column > ? |
ge(字段, 值) | 大于等于 | column >= ? |
lt(字段, 值) | 小于 | column < ? |
le(字段, 值) | 小于等于 | column <= ? |
in(字段, 值列表) | 在列表中 | column IN (...) |
notIn(字段, 值列表) | 不在列表中 | column NOT IN (...) |
like(字段, 值) | 模糊匹配 | column LIKE '%值%' |
likeLeft(字段, 值) | 后缀匹配 | column LIKE '%值' |
likeRight(字段, 值) | 前缀匹配 | column LIKE '值%' |
notLike(字段, 值) | 非模糊 | column NOT LIKE '%值%' |
between(字段, 值1, 值2) | 范围 | column BETWEEN ? AND ? |
notBetween(字段, 值1, 值2) | 非范围 | column NOT BETWEEN ? AND ? |
基础条件
DB.pojo.selectWrapper(User.class)
.eq(User::getStatus, 1) // status = 1
.ne(User::getType, 0) // type <> 0
.gt(User::getAge, 18) // age > 18
.ge(User::getScore, 60) // score >= 60
.lt(User::getLevel, 10) // level < 10
.le(User::getRetryCount, 3) // retry_count <= 3
.isNull(User::getDeleteTime) // delete_time IS NULL
.isNotNull(User::getEmail) // email IS NOT NULL
.queryBeanList();
IN / BETWEEN 查询
// IN:支持字符串、数组、子查询
.in(User::getId, "1,2,3,4,5")
.in(User::getId, Arrays.asList(1, 2, 3))
.in(User::getDeptId, "sql:SELECT id FROM dept WHERE status = 1")
// NOT IN
.notIn(User::getName, "admin,root")
// BETWEEN
.between(User::getAge, 18, 30)
.between(User::getAge, "18,30")
// NOT BETWEEN
.notBetween(User::getScore, 0, 60)
模糊查询
DB.pojo.selectWrapper(User.class)
.like(User::getName, "张") // LIKE '%张%'
.likeLeft(User::getPhone, "138") // LIKE '%138'
.likeRight(User::getAddress, "北京") // LIKE '北京%'
.notLike(User::getDescription, "测试") // NOT LIKE '%测试%'
.queryBeanList();
OR / AND 嵌套
// (status=1) AND (name='张三' OR age>20)
DB.pojo.selectWrapper(User.class)
.eq(User::getStatus, 1)
.ors(w -> w.eq(User::getName, "张三").gt(User::getAge, 20))
.queryBeanList();
// (type=1 OR type=2) AND (status=1 AND level>3)
DB.pojo.selectWrapper(User.class)
.ors(w -> w.eq(User::getType, 1).eq(User::getType, 2))
.ands(w -> w.eq(User::getStatus, 1).gt(User::getLevel, 3))
.queryBeanList();
自定义 SQL 片段
// 使用 #{key} 命名参数
DB.pojo.selectWrapper(User.class)
.sql("age > #{minAge} AND age < #{maxAge}",
new JSONMap("minAge", 18, "maxAge", 60))
.queryBeanList();
// EXISTS 查询
DB.pojo.selectWrapper(User.class)
.sql("EXISTS (SELECT 1 FROM vip WHERE user_id = t.id AND level >= #{lv})",
new JSONMap("lv", 3))
.queryBeanList();
Lambda 表达式(类型安全)
所有条件方法都支持 Lambda 和字符串两种方式:
// ✅ Lambda 方式:编译期检查
.eq(User::getStatus, 1)
// ✅ 字符串方式:适合动态场景
.eq("status", 1)
字段名解析规则:
| Lambda | 数据库字段 |
|---|---|
User::getUserName | user_name(驼峰转下划线) |
User::getId | id |
User::getCreateTime | create_time |
@TableField("email_address") | email_address(注解覆盖) |
空值自动忽略
// 三参形式:条件为 false 时不添加
.eq(name != null, "name", name)
// SQL 方括号:参数为 null 时整个条件忽略
// SQL: [AND status = #{status}]
复用条件
8.0 的稳定业务 API 是在各类 Wrapper 上直接构建条件。Condition 位于 com.dlz.db.internal 实现包,不应在业务代码中直接导入或作为自定义 API 的参数类型。需要复用时,将条件组装封装成面向具体 Wrapper 的业务方法:
private PojoQuery<User> activeAdults(PojoQuery<User> query) {
return query.eq(User::getStatus, 1)
.gt(User::getAge, 18);
}
List<User> users = activeAdults(DB.pojo.selectWrapper(User.class))
.queryBeanList();