注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
本章节将介绍使用 nested() 方法添加嵌套 SQL,方法定义如下:
nested(Consumer<Param> consumer) nested(boolean condition, Consumer<Param> consumer)
参数说明:
consumer:构造内嵌SQL条件
condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。
实例:查询所有姓黄,性别为男,年龄大于 30,薪水大于 9000 的用户信息,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>(); wrapper.likeRight("name", "黄"); wrapper.nested(new Consumer<QueryWrapper<UserBean>>() { @Override public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) { userBeanQueryWrapper.eq("sex", "男") .gt("age", 30).gt("salary", 9000); } });
上面查询条件将拼接出如下 SQL 语句:
SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (name LIKE ? AND (sex = ? AND age > ? AND salary > ?))
可以看到嵌套 SQL 语句就是在 where 子句中添加一个括号“()”,即“(sex = ? AND age > ? AND salary > ?)”。
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; import java.util.function.Consumer; @RunWith(SpringRunner.class) @SpringBootTest class Condition16Test { @Autowired private SimpleMapper simpleMapper; @Test void contextLoads() { QueryWrapper<UserBean> wrapper = new QueryWrapper<>(); wrapper.likeRight("name", "黄"); wrapper.nested(new Consumer<QueryWrapper<UserBean>>() { @Override public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) { userBeanQueryWrapper.eq("sex", "男") .gt("age", 30).gt("salary", 9000); } }); List<UserBean> userBeanList = simpleMapper.selectList(wrapper); System.out.println("result size=" + userBeanList.size()); } }
运行上面代码,实际上将执行下面 SQL 语句:
Preparing: SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (name LIKE ? AND (sex = ? AND age > ? AND salary > ?)) Parameters: 黄%(String), 男(String), 30(Integer), 9000(Integer)