mybatis-plus的or()为啥拼接出来是and? 为啥不是or 怎样让sql拼成or
时间: 2024-05-05 10:15:28 浏览: 112
mybatis-plus的or()方法默认拼接出来的条件是使用"AND"连接的,因为它是基于MyBatis的Criteria API实现的,而MyBatis中的or方法也是这样实现的。
如果要让拼接出来的条件使用"OR"连接,可以使用LambdaQueryWrapper的or方法,并设置参数为true,例如:
```
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20)
.or(true)
.eq(User::getName, "Tom");
```
这样就能够拼接出使用"OR"连接的条件了。
相关问题
mybatis-plus 动态拼接sql
### MyBatis-Plus 中动态构建 SQL 查询
在 Spring Boot 项目中整合 MyBatis-Plus 后,可以通过多种方式实现 SQL 语句的动态拼接。MyBatis-Plus 支持通过 `Wrapper` 类及其子类来动态构建查询条件,这些类提供了丰富的 API 方法用于创建灵活多变的 SQL 语句。
#### 使用 QueryWrapper 实现基本的动态查询
对于简单的实体属性匹配场景,可以直接利用 `QueryWrapper` 进行条件组装:
```java
// 创建一个 User 对象作为查询条件载体
User userCond = new User();
userCond.setName("张三");
// 初始化 QueryWrapper 并传入 entity 参数
QueryWrapper<User> queryWrapper = new QueryWrapper<>(userCond);
// 添加额外的查询条件
queryWrapper.eq("age", 20).gt("score", 85);
```
上述代码会生成类似于 `"SELECT * FROM user WHERE name='张三' AND age=20 AND score > 85"` 的 SQL 语句[^4]。
#### 利用 Lambda 表达式简化字段访问
为了防止硬编码列名带来的风险并提升开发体验,推荐采用带有泛型支持的 `LambdaQueryWrapper`:
```java
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getName, "李").lt(User::getAge, 30);
```
这段逻辑最终会被转换成类似 `"SELECT * FROM user WHERE name LIKE '%李%' AND age < 30"` 的表达形式。
#### 复杂条件下组合多个 Wrapper 实例
当面对更为复杂的业务需求时,比如需要同时满足若干组独立又相互关联的过滤规则,则可通过嵌套的方式将不同类型的 `Wrapper` 组合起来使用:
```java
List<Integer> ids = Arrays.asList(1, 2, 3);
QueryWrapper<User> wrapper = Wrappers.<User>query()
.inSql("id", String.join(",", ids))
.and(i -> i.ge("create_time", startDate)
.or().le("update_time", endDate));
```
这里展示了如何在一个查询里混合运用时间范围和其他特定 ID 集合来进行筛选。
#### 动态控制 SQL 片段可见性
除了常规的等于、大于小于比较外,有时还需要根据实际情况决定某些部分是否加入到最终执行的 SQL 文本之中。此时可借助于 `apply()` 函数配合 Java 内联函数特性完成此目的:
```java
String customCondition = "status IN ('active', 'pending')";
QueryWrapper<User> dynamicWrapper = new QueryWrapper<>();
dynamicWrapper.apply(StringUtils.isNotBlank(customCondition), customCondition);
```
如果变量 `customCondition` 不为空字符串的话,那么这部分就会被追加至整体查询串内;反之则忽略不计。
mybatis-plus 拼接sql
Mybatis-plus是Mybatis的增强工具,提供了更加方便、快速的开发体验。在实际开发中,我们有时需要动态地拼接SQL,Mybatis-plus为我们提供了一些丰富的API来进行SQL拼接。
1. Wrapper
Wrapper是Mybatis-plus提供的一个用于拼接SQL语句的抽象类。它提供了一系列的查询条件构造方法,比如eq、ne、like等等。使用Wrapper可以有效地避免手写SQL语句时因为类型转换等问题导致的不安全因素,也可以避免SQL注入。
2. LambdaQueryWrapper
LambdaQueryWrapper是Wrapper的一个特殊子类,它采用lambda表达式的形式,更加方便地进行拼接。使用LambdaQueryWrapper可以在Java代码中写出和SQL一样的查询条件,比如:
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "张三");
List<User> userList = userService.list(wrapper);
上述代码中,我们使用LambdaQueryWrapper构造了一个查询条件,查询名字为“张三”的用户。可以看到,使用LambdaQueryWrapper的方式非常直观,更加方便。
3. UpdateWrapper
UpdateWrapper是用于构造更新操作的Wrapper子类。使用UpdateWrapper可以方便地设置更新的字段和更新条件,比如:
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("name", "张三");
wrapper.eq("id", 1);
userService.update(wrapper);
上述代码中,我们使用UpdateWrapper构造了一个更新条件,更新名字为“张三”的用户,条件是ID为1。
4. QueryBuilder
QueryBuilder是Mybatis-plus提供的一个动态SQL构造器,它可以将多个SQL片段拼接成一条完整的SQL语句。使用QueryBuilder可以更加方便地构建复杂的查询语句。比如:
String sql = new QueryBuilder()
.select("id", "name", "age")
.from("user")
.where("age > 18")
.orderBy("id DESC")
.build();
List<Map<String, Object>> userList = jdbcTemplate.queryForList(sql);
上述代码中,我们使用QueryBuilder构建了一个查询语句,查询所有年龄大于18的用户,按照ID降序排列。
总之,Mybatis-plus提供了众多API来拼接SQL,不管是Wrapper、LambdaQueryWrapper、UpdateWrapper还是QueryBuilder,都可以方便地满足我们的各种SQL拼接需求。开发者可以根据具体情况选择不同的API进行使用,提高代码的开发效率和可读性。
阅读全文
相关推荐
















