如何在 MyBatis-Plus 中执行复杂条件查询?
时间: 2025-04-16 12:46:18 浏览: 22
### 使用 MyBatis-Plus 实现复杂条件查询
在 MyBatis-Plus 中,可以通过多种方式实现复杂的查询逻辑。以下是几种常见的方法:
#### 1. LambdaQueryWrapper 构建动态查询条件
LambdaQueryWrapper 提供了一种简洁的方式来构建动态查询条件,支持链式调用。
```java
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
public List<User> getUsersByConditions(String name, Integer age) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
if (name != null && !"".equals(name.trim())) {
queryWrapper.like(User::getName, name);
}
if (age != null) {
queryWrapper.eq(User::getAge, age);
}
return userMapper.selectList(queryWrapper);
}
```
此代码片段展示了如何根据传入参数动态设置查询条件[^1]。
#### 2. Wrapper 高级用法
除了基本的等于、不等于操作外,还可以使用更多高级功能来处理更复杂的场景。
```java
// 组合多个条件
queryWrapper.and(i -> i.ge("salary", minSalary).le("salary", maxSalary));
// 子查询
queryWrapper.inSql("id", "SELECT id FROM users WHERE department_id IN ({0})", deptIds);
// SQL 片段注入
String customCondition = "<if test='status!=null'>AND status=#{status}</if>";
queryWrapper.apply(customCondition, status);
```
这些例子说明了如何利用 `and`、`inSql` 和 `apply` 方法创建更为灵活多变的查询语句[^2]。
#### 3. 自定义 Mapper 接口扩展
当内置的功能无法满足需求时,可以自定义 mapper 接口并编写 XML 文件中的 SQL 映射。
```xml
<!-- UserMapper.xml -->
<select id="selectUsersWithCustomLogic" resultType="User">
SELECT * FROM t_user u
<where>
<!-- 动态拼接 where 条件 -->
<if test="name != null and name != ''"> AND u.name LIKE CONCAT('%', #{name}, '%') </if>
<if test="age != null"> AND u.age = #{age} </if>
</where>
</select>
```
配合 Java 代码调用:
```java
@Select("<script>" +
"SELECT * FROM t_user u" +
"<where>" +
"<if test='name != null and name != \"\"'> AND u.name LIKE CONCAT('%', #{name}, '%')</if>" +
"<if test='age != null'> AND u.age = #{age}</if>" +
"</where>" +
"</script>")
List<User> selectUsersWithCustomLogic(@Param("name") String name, @Param("age") Integer age);
```
这种方法允许完全控制生成的 SQL 并执行任意复杂的业务逻辑。
阅读全文
相关推荐


















