2.3 条件构造器
条件方法一览
| 方法 | 说明 | 示例 |
|---|---|---|
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.select(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.select(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.select(User.class)
.eq(User::getStatus, 1)
.or(w -> w.eq(User::getName, "张三").gt(User::getAge, 20))
.queryBeanList();
// (type=1 OR type=2) AND (status=1 AND level>3)
DB.Pojo.select(User.class)
.or(w -> w.eq(User::getType, 1).eq(User::getType, 2))
.and(w -> w.eq(User::getStatus, 1).gt(User::getLevel, 3))
.queryBeanList();
自定义 SQL 片段
// 使用 #{key} 命名参数
DB.Pojo.select(User.class)
.sql("age > #{minAge} AND age < #{maxAge}",
new JSONMap("minAge", 18, "maxAge", 60))
.queryBeanList();
// EXISTS 查询
DB.Pojo.select(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}]
独立 Condition
Condition condition = Condition.where()
.eq("status", 1)
.gt("age", 18);
// 复用到不同操作
DB.Table.select("user").where(condition).queryList();
DB.Table.update("user").set("flag", 1).where(condition).execute();
DB.Table.delete("user").where(condition).execute();