🧩 一、基本比较运算符
| 方法 | SQL 表达式 | 含义 | 示例 |
|---|---|---|---|
eq("column", value) |
column = value |
等于 | .eq("status", 1) |
ne("column", value) |
column <> value |
不等于 | .ne("age", 18) |
gt("column", value) |
column > value |
大于 | .gt("score", 90) |
ge("column", value) |
column >= value |
大于等于 | .ge("age", 18) |
lt("column", value) |
column < value |
小于 | .lt("age", 60) |
le("column", value) |
column <= value |
小于等于 | .le("price", 1000) |
between("column", val1, val2) |
column BETWEEN val1 AND val2 |
范围查询 | .between("age", 18, 30) |
notBetween("column", val1, val2) |
column NOT BETWEEN val1 AND val2 |
范围排除 | .notBetween("date", "2024-01-01", "2024-12-31") |
🔍 二、模糊匹配(字符串 LIKE 类)
| 方法 | SQL 表达式 | 含义 | 示例 |
|---|---|---|---|
like("column", value) |
column LIKE '%value%' |
包含 | .like("name", "张") |
notLike("column", value) |
column NOT LIKE '%value%' |
不包含 | .notLike("name", "测试") |
likeLeft("column", value) |
column LIKE '%value' |
右匹配 | .likeLeft("suffix", ".jpg") |
likeRight("column", value) |
column LIKE 'value%' |
左匹配 | .likeRight("prefix", "user_") |
📋 三、集合运算(IN / NOT IN)
| 方法 | SQL 表达式 | 含义 | 示例 |
|---|---|---|---|
in("column", Collection<?>) |
column IN (...) |
包含于集合中 | .in("id", Arrays.asList(1,2,3)) |
notIn("column", Collection<?>) |
column NOT IN (...) |
不在集合中 | .notIn("id", ids) |
inSql("column", sqlSubquery) |
column IN (子查询SQL) |
SQL子查询 | .inSql("dept_id", "SELECT id FROM dept WHERE type='A'") |
notInSql("column", sqlSubquery) |
column NOT IN (子查询SQL) |
SQL子查询 | .notInSql("id", "SELECT id FROM blacklist") |
🧠 四、NULL 判断
| 方法 | SQL 表达式 | 含义 | 示例 |
|---|---|---|---|
isNull("column") |
column IS NULL |
为空 | .isNull("deleted_at") |
isNotNull("column") |
column IS NOT NULL |
不为空 | .isNotNull("email") |
⚙️ 五、嵌套与逻辑条件
| 方法 | 含义 | 示例 |
|---|---|---|
and(Consumer<Wrapper>) |
与 (AND) 条件组 | .and(w -> w.eq("a", 1).or().eq("b", 2)) |
or() |
添加一个 OR | .eq("a", 1).or().eq("b", 2) |
or(Consumer<Wrapper>) |
带括号的 OR 条件组 | .or(w -> w.eq("a", 1).ne("b", 2)) |
nested(Consumer<Wrapper>) |
嵌套条件(加括号) | .nested(w -> w.eq("a", 1).or().eq("b", 2)) |
apply(String sql, Object... params) |
原生 SQL 片段 | .apply("date_format(create_time,'%Y-%m-%d') = {0}", "2025-11-11") |
exists(String sql) |
存在子查询 | .exists("SELECT 1 FROM dept WHERE dept.id = user.dept_id") |
notExists(String sql) |
不存在子查询 | .notExists("SELECT 1 FROM blacklist WHERE blacklist.user_id = user.id") |
🧩 六、排序、分组、分页控制
| 方法 | SQL 表达式 | 含义 | 示例 |
|---|---|---|---|
orderByAsc("column") |
ORDER BY column ASC |
升序排序 | .orderByAsc("create_time") |
orderByDesc("column") |
ORDER BY column DESC |
降序排序 | .orderByDesc("id") |
orderBy(boolean condition, boolean asc, String... columns) |
条件排序 | .orderBy(true, false, "update_time") |
|
groupBy("columns...") |
GROUP BY ... |
分组 | .groupBy("dept_id") |
having(String sql, Object... params) |
HAVING ... |
分组后筛选 | .having("count(id) > {0}", 1) |
last(String sql) |
SQL 尾部追加 | .last("LIMIT 1") |
|
limit(int offset, int size) (MyBatis-Plus 3.5+) |
限制结果数 | .last("LIMIT 0, 10")(或新版 limit(0,10)) |
|
🧩 七、Lambda 风格(推荐写法)
若使用 LambdaQueryWrapper,可避免硬编码列名错误:
plain
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1)
.ge(User::getAge, 18)
.like(User::getName, "张")
.orderByDesc(User::getCreateTime);
✅ 优点:
- 自动推导字段名;
- 字段重构安全;
- IDE 自动提示。