注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
前一个章节介绍 in 和 notIn 条件的用法,这两个条件只允许我们手动输入已知的条件。如果我们需要通过 SQL 动态查询 in 和 notIn 需要的条件呢?MyBatis Plus 条件构造器提供了 inSql 和 notInSql,这两个条件允许我们传递 SQL 语句给这两个方法,方法将自动执行 SQL 且将 SQL 的结果作为条件输入值。它们的定义如下:
inSql(R column, String inValue) inSql(boolean condition, R column, String inValue)
参数说明:
column:列名称
inValue:查询 in 条件值的 SQL 语句
condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
实例:查询用户 ID 小于 10 的用户信息列表,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.inSql("user_id", "select user_id from user where user_id<10");notInSql(R column, String inValue) notInSql(boolean condition, R column, String inValue)
参数说明:
column:列名称
inValue:查询 in 条件值的 SQL 语句
condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件
实例:查询性别不是“男”或“女”的用户信息,如下:
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.notInSql("user_id", "select user_id from user where sex in ('男','女')");package com.hxstrive.mybatis_plus.simple_mapper.condition;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxstrive.mybatis_plus.mapper.SimpleMapper;
import com.hxstrive.mybatis_plus.model.UserBean;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
class Condition10Test {
@Autowired
private SimpleMapper simpleMapper;
@Test
void contextLoads() {
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.inSql("user_id", "select user_id from user where user_id<10");
List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
wrapper = new QueryWrapper<>();
wrapper.notInSql("user_id", "select user_id from user where sex in ('男','女')");
userBeanList = simpleMapper.selectList(wrapper);
for(UserBean userBean : userBeanList) {
System.out.println(userBean);
}
}
}运行上面代码,实际执行的 SQL 语句如下:
Preparing: SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (user_id IN (select user_id from user where user_id<10))
Parameters:
Preparing: SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (user_id NOT IN (select user_id from user where sex in ('男','女')))
Parameters: