封装QueryWrapper
时间: 2023-05-19 13:05:49 浏览: 141
QueryWrapper 是 MyBatis-Plus 框架中的一个类,用于构建 SQL 查询条件。封装 QueryWrapper 的主要目的是为了提高代码的可读性和可维护性,同时也可以避免 SQL 注入等安全问题。在使用 QueryWrapper 时,我们可以通过链式调用的方式来构建查询条件,例如:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三").ge("age", 18);
这段代码表示查询名字为“张三”且年龄大于等于 18 岁的用户信息。封装 QueryWrapper 可以让我们更加方便地使用 MyBatis-Plus 框架进行数据库操作。
相关问题
QueryWrapper or(QueryCondition) QueryWrapper or(String) QueryWrapper or(String, Object...) QueryConditionBuilder<? extends QueryWrapper> or(LambdaGetter<Object>) QueryWrapper or(Consumer<QueryWrapper>) QueryWrapper or(Consumer<QueryWrapper>, boolean) QueryWrapper or(Map<String, Object>) QueryWrapper or(Map<String, Object>, SqlOperators) QueryWrapper or(Map<String, Object>, SqlOperators, SqlConnector) or只有这些构造器
你提到的这些 `or(...)` 方法都是 **MyBatis-Flex** 中 `QueryWrapper` 提供的用于构建 SQL 查询条件的方法,它们的作用是添加一个 **OR 条件** 到当前查询中。
---
## ✅ 你的问题
你希望实现如下逻辑:
```sql
WHERE (ZRZC != 1 OR ZRZC IS NULL)
AND (CY != 1 OR CY IS NULL)
AND (SW != 1 OR SW IS NULL)
```
但你发现 MyBatis-Flex 的 `QueryWrapper` 中没有像 `.and(QueryWrapper)` 这样的 API(比如 `.and(wrapper)`),所以你在使用 `or(...)` 方法时遇到了困惑。
---
## ✅ 解决方案:使用嵌套 QueryWrapper + or()
你可以使用 `Consumer<QueryWrapper>` 方式构造嵌套的 OR 条件。
### ✅ 示例代码如下:
```java
QueryWrapper query = QueryWrapper.create()
.ge("JJRQ", firstDate)
.le("JJRQ", lastDate)
// ZRZC != 1 OR ZRZC IS NULL
.and(QueryWrapper.create().or(wrapper -> {
wrapper.ne("ZRZC", 1).or().isNull("ZRZC");
}))
// CY != 1 OR CY IS NULL
.and(QueryWrapper.create().or(wrapper -> {
wrapper.ne("CY", 1).or().isNull("CY");
}))
// SW != 1 OR SW IS NULL
.and(QueryWrapper.create().or(wrapper -> {
wrapper.ne("SW", 1).or().isNull("SW");
}));
List<PdShiftrecord> list = sqlExecutor.queryForListByQuery(query, PdShiftrecord.class);
```
---
## 🔍 解释说明:
- `QueryWrapper.create().or(wrapper -> { ... })`:
- 创建一个新的子查询块,并通过 `or()` 添加多个 OR 条件。
- 每个字段的 `(col != 1 OR col IS NULL)` 都封装在一个独立的 `QueryWrapper` 中。
- `.and(...)`:
- 将每个字段的 OR 条件作为整体加入主查询中,形成 `AND (col != 1 OR col IS NULL)` 的结构。
---
## 🧠 更直观理解
上面的 Java 代码最终会生成如下的 SQL 片段:
```sql
WHERE JJRQ >= #{firstDate}
AND JJRQ <= #{lastDate}
AND (ZRZC != 1 OR ZRZC IS NULL)
AND (CY != 1 OR CY IS NULL)
AND (SW != 1 OR SW IS NULL)
```
---
## ✅ 如果你想手动写 SQL 表达式也可以这样:
```java
QueryWrapper query = QueryWrapper.create()
.ge("JJRQ", firstDate)
.le("JJRQ", lastDate)
.and(QueryWrapper.create().expr("(ZRZC != 1 OR ZRZC IS NULL)"))
.and(QueryWrapper.create().expr("(CY != 1 OR CY IS NULL)"))
.and(QueryWrapper.create().expr("(SW != 1 OR SW IS NULL)"));
```
---
## 📌 总结
| 写法 | 是否推荐 | 说明 |
|------|----------|------|
| 使用 `QueryWrapper.or(wrapper -> { ... })` | ✅ 推荐 | 类型安全、可读性高 |
| 使用 `.expr("(col != 1 OR col IS NULL)")` | ✅ 推荐 | 简洁,适合已有 SQL 经验 |
| 使用 `.ne().or().isNull()` 结合 | ✅ 推荐 | 更加语义化 |
---
根据传入Object封装成QueryWrapper对象
可以使用MyBatis-Plus提供的QueryWrapper类来实现。具体代码如下:
QueryWrapper<Object> queryWrapper = new QueryWrapper<>(object);
其中,object是传入的Object对象。这样就可以将Object对象封装成QueryWrapper对象了。
阅读全文
相关推荐

















