MP条件构造器之常用功能详解(or、and、exists、notExists)
文章目录
- or
- 使用范围
- 方法签名
- 参数说明
- 示例
- 使用 `or` 改变查询条件的连接方式为 OR
- 动态根据条件改变查询条件的连接方式为 OR
- 使用 `or(Consumer<Param> consumer)` 添加 OR 嵌套条件
- 动态根据条件添加 OR 嵌套条件
- and
- 使用范围
- 方法签名
- 参数说明
- 示例
- 动态根据条件添加 AND 嵌套条件
- exists
- 使用范围
- 方法签名
- 参数说明
- 示例
- 动态根据条件添加 EXISTS 子查询
- 生成的 SQL 语句
- notExists
- 使用范围
- 方法签名
- 参数说明
- 示例
or
or
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于在查询条件中添加 OR 逻辑。通过调用 or
方法,可以改变后续查询条件的连接方式,从默认的 AND 连接变为 OR 连接。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
// 改变后续查询条件的连接方式为 OR
or()
or(boolean condition)
// 添加 OR 嵌套条件
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
参数说明
condition
:一个布尔值,用于控制是否应用这个 OR 逻辑。consumer
:一个Consumer
函数式接口,它接受一个Param
类型的参数,并可以调用Param
对象上的方法来构建 OR 嵌套条件。
示例
使用 or
改变查询条件的连接方式为 OR
假设我们有一个 User
表,其中包含字段 username
和 email
。我们希望查询 username
为 “admin” 或 email
为 “admin@example.com” 的用户。
普通 Wrapper (QueryWrapper
):
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 设置查询条件,username 为 "admin" 或 email 为 "admin@example.com"
queryWrapper.eq("username", "admin").or().eq("email", "admin@example.com");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 设置查询条件,username 为 "admin" 或 email 为 "admin@example.com"
queryWrapper.eq(User::getUsername, "admin").or().eq(User::getEmail, "admin@example.com");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句:
SELECT * FROM user WHERE username = 'admin' OR email = 'admin@example.com';
动态根据条件改变查询条件的连接方式为 OR
现在,我们希望根据动态条件来决定是否使用 OR 连接查询条件。
普通 Wrapper (QueryWrapper
):
// 动态设置 OR 连接条件
boolean useOr = true; // 例如从外部条件中获得
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 根据条件动态设置查询条件,使用 OR 连接
queryWrapper.eq("username", "admin").or(useOr).eq("email", "admin@example.com");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 动态设置 OR 连接条件
boolean useOr = true; // 例如从外部条件中获得
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 根据条件动态设置查询条件,使用 OR 连接
queryWrapper.eq(User::getUsername, "admin").or(useOr).eq(User::getEmail, "admin@example.com");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
如果 useOr
为 true
,生成的 SQL 语句如下:
SELECT * FROM user WHERE username = 'admin' OR email = 'admin@example.com';
如果 useOr
为 false
,生成的 SQL 语句如下:
SELECT * FROM user WHERE username = 'admin' AND email = 'admin@example.com';
使用 or(Consumer<Param> consumer)
添加 OR 嵌套条件
现在,我们希望查询 username
为 “admin”,或者 (email
为 “admin@example.com” 并且 status
为 “active”) 的用户。
普通 Wrapper (QueryWrapper
):
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 设置查询条件,username 为 "admin" 或者 (email 为 "admin@example.com" 并且 status 为 "active")
queryWrapper.eq("username", "admin")
.or(wrapper -> wrapper.eq("email", "admin@example.com").eq("status", "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 设置查询条件,username 为 "admin" 或者 (email 为 "admin@example.com" 并且 status 为 "active")
queryWrapper.eq(User::getUsername, "admin")
.or(wrapper -> wrapper.eq(User::getEmail, "admin@example.com").eq(User::getStatus, "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句:
SELECT * FROM user WHERE username = 'admin' OR (email = 'admin@example.com' AND status = 'active');
动态根据条件添加 OR 嵌套条件
现在,我们希望根据动态条件来决定是否使用 OR 嵌套条件。
普通 Wrapper (QueryWrapper
):
// 动态设置嵌套 OR 条件
boolean useNestedOr = true; // 例如从外部条件中获得
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 根据条件动态设置查询条件,使用 OR 嵌套条件
queryWrapper.eq("username", "admin")
.or(useNestedOr, wrapper -> wrapper.eq("email", "admin@example.com").eq("status", "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 动态设置嵌套 OR 条件
boolean useNestedOr = true; // 例如从外部条件中获得
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 根据条件动态设置查询条件,使用 OR 嵌套条件
queryWrapper.eq(User::getUsername, "admin")
.or(useNestedOr, wrapper -> wrapper.eq(User::getEmail, "admin@example.com").eq(User::getStatus, "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
如果 useNestedOr
为 true
,生成的 SQL 语句如下:
SELECT * FROM user WHERE username = 'admin' OR (email = 'admin@example.com' AND status = 'active');
**如果 **useNestedOr
为 fals
,生成的 SQL 语句如下:
SELECT * FROM user WHERE username = 'admin' AND email = 'admin@example.com' AND status = 'active';
and
and
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于在查询条件中添加 AND 逻辑。通过调用 and
方法,可以创建 AND 嵌套条件,即在一个 AND 逻辑块中包含多个查询条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
// 添加 AND 嵌套条件
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
参数说明
consumer
:一个Consumer
函数式接口,它接受一个Param
类型的参数,并可以调用Param
对象上的方法来构建 AND 嵌套条件。condition
:一个布尔值,用于控制是否应用这个 AND 嵌套逻辑。
示例
假设我们有一个 User
表,其中包含字段 username
、email
和 status
。我们希望查询 username
为 “admin”,并且 email
为 “admin@example.com” 且 status
为 “active” 的用户。
普通 Wrapper (QueryWrapper
):
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 设置查询条件,username 为 "admin" 并且 (email 为 "admin@example.com" 且 status 为 "active")
queryWrapper.eq("username", "admin")
.and(wrapper -> wrapper.eq("email", "admin@example.com").eq("status", "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 设置查询条件,username 为 "admin" 并且 (email 为 "admin@example.com" 且 status 为 "active")
queryWrapper.eq(User::getUsername, "admin")
.and(wrapper -> wrapper.eq(User::getEmail, "admin@example.com").eq(User::getStatus, "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句:
SELECT * FROM user WHERE username = 'admin' AND (email = 'admin@example.com' AND status = 'active');
动态根据条件添加 AND 嵌套条件
现在,我们希望根据动态条件来决定是否使用 AND 嵌套条件。
普通 Wrapper (QueryWrapper
):
// 动态设置嵌套 AND 条件
boolean useNestedAnd = true; // 例如从外部条件中获得
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 根据条件动态设置查询条件,使用 AND 嵌套条件
queryWrapper.eq("username", "admin")
.and(useNestedAnd, wrapper -> wrapper.eq("email", "admin@example.com").eq("status", "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 动态设置嵌套 AND 条件
boolean useNestedAnd = true; // 例如从外部条件中获得
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 根据条件动态设置查询条件,使用 AND 嵌套条件
queryWrapper.eq(User::getUsername, "admin")
.and(useNestedAnd, wrapper -> wrapper.eq(User::getEmail, "admin@example.com").eq(User::getStatus, "active"));
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句
如果 useNestedAnd
为 true
,生成的 SQL 语句如下:
SELECT * FROM user WHERE username = 'admin' AND (email = 'admin@example.com' AND status = 'active');
如果 useNestedAnd
为 false
,生成的 SQL 语句如下:
SELECT * FROM user WHERE username = 'admin' AND email = 'admin@example.com' AND status = 'active';
exists
exists
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于在查询中添加一个 EXISTS 子查询。通过调用 exists
方法,可以将一个完整的 SQL 子查询作为 EXISTS 条件添加到主查询中。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
// 添加 EXISTS 子查询
exists(String existsSql)
exists(boolean condition, String existsSql)
参数说明
existsSql
:一个字符串,包含要作为 EXISTS 条件的 SQL 子查询。condition
:一个布尔值,用于控制是否应用这个 EXISTS 条件。
示例
假设我们有两个表:User
表和 Order
表。我们希望查询那些至少有一笔订单的用户,即查询 User
表中存在与 Order
表关联的记录的用户。
普通 Wrapper (QueryWrapper
):
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 添加 EXISTS 子查询,查询至少有一笔订单的用户
queryWrapper.exists("SELECT 1 FROM orders WHERE orders.user_id = user.id");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 添加 EXISTS 子查询,查询至少有一笔订单的用户
queryWrapper.exists("SELECT 1 FROM orders WHERE orders.user_id = user.id");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句:
SELECT * FROM user WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = user.id);
动态根据条件添加 EXISTS 子查询
现在,我们希望根据动态条件来决定是否使用 EXISTS 子查询。
普通 Wrapper (QueryWrapper
):
// 动态设置 EXISTS 条件
boolean useExists = true; // 例如从外部条件中获得
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 根据条件动态设置 EXISTS 子查询,查询至少有一笔订单的用户
queryWrapper.exists(useExists, "SELECT 1 FROM orders WHERE orders.user_id = user.id");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 动态设置 EXISTS 条件
boolean useExists = true; // 例如从外部条件中获得
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 根据条件动态设置 EXISTS 子查询,查询至少有一笔订单的用户
queryWrapper.exists(useExists, "SELECT 1 FROM orders WHERE orders.user_id = user.id");
// 执行查询,获取符合条件的用户列表
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句
如果 useExists
为 true
,生成的 SQL 语句如下:
SELECT * FROM user WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = user.id);
如果 useExists
为 false
,生成的 SQL 语句如下:
SELECT * FROM user;
notExists
notExists
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于在查询中添加一个 NOT EXISTS 子查询。通过调用 notExists
方法,可以将一个完整的 SQL 子查询作为 NOT EXISTS 条件添加到主查询中。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
// 添加 NOT EXISTS 子查询
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
参数说明
notExistsSql
:一个字符串,包含要作为 NOT EXISTS 条件的 SQL 子查询。condition
:一个布尔值,用于控制是否应用这个 NOT EXISTS 条件。
示例
与 exist
基本一致,照猫画虎。