注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
在 MyBatis Plus 中定义了多个 allEq 方法,该方法将把参数 Map 中的参数使用 and 进行连接。假如我们传递如下 Map 参数给 allEq 方法:
Map<String,Object> params = new HashMap<>(); params.put("age", 40); params.put("sex", "男");
allEq 方法组成如下 SQL 语句:
age=50 and sex='男'
所有的 allEq 方法定义如下:
allEq(Map<R, V> params) allEq(Map<R, V> params, boolean null2IsNull) allEq(boolean condition, Map<R, V> params, boolean null2IsNull) allEq(BiPredicate<R, V> filter, Map<R, V> params) allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
参数说明:
params:查询条件,key 为数据库字段名,value 为字段值
null2IsNull:指定当 params 条件的 value 为 null 时,是否转换成 SQL 的 is null。如果为 true 则在 map 的 value为 null 时,调用 isNull 方法。为 false 时则忽略 value 为 null 的条件。例如:
// 示例1: Map<String,Object> params = new HashMap<>(); params.put("age", null); params.put("sex", "男"); allEq(params ) // 对应的 SQL 语句 sex = '男' and age is null // 示例2: Map<String,Object> params = new HashMap<>(); params.put("age", null); params.put("sex", "男"); allEq(params , false) // 对应的 SQL 语句,忽略了 value 等于 null 的条件 sex = '男'
filter:过滤函数,判断是否允许某个字段传入此对条件中。例如:
Map<String,Object> map = new HashMap<>(); map.put("sex", "男"); map.put("age", null); QueryWrapper<UserBean> wrapper = new QueryWrapper<>(); wrapper.allEq(new BiPredicate<String,Object>(){ @Override public boolean test(String s, Object o) { System.out.println(s + "=>" + o); // 过滤条件值为 null 的条件 // 如果条件的值为 null,则不参与过滤 return null != o; } }, map); List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
condition:使用这个条件我们可以构建动态SQL条件,而不需要使用 if-else。如果当 condition 为 true,则将 allEq 方法中的可用条件添加到 SQL 条件中。如果为 false,则所有 allEq 条件均不添加到 SQL 条件中。例如:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>(); wrapper.gt("salary", 7000); // 用户薪水大于7000 UserBean userBean = getUserBeanById(100); Map<String,Object> params = new HashMap<>(); if(null != userBean) { params.put("age", userBean.getAge()); params.put("sex", userBean.getSex()); } wrapper.allEq(null != userBean, params , true); // 如果 userBean 为 null,则应用 params 条件
验证 allEq 方法中 null2IsNull 参数的用法。代码如下:
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.HashMap; import java.util.List; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest class Condition2Test { @Autowired private SimpleMapper simpleMapper; @Test void contextLoads() { Map<String,Object> map = new HashMap<>(); map.put("sex", "男"); map.put("age", null); // sex=男 and age is null QueryWrapper<UserBean> wrapper = new QueryWrapper<>(); wrapper.allEq(map); List<UserBean> userBeanList = simpleMapper.selectList(wrapper); System.out.println("result size=" + userBeanList.size()); System.out.println("================= 分割线 ================="); // sex=男 wrapper = new QueryWrapper<>(); wrapper.allEq(map, false); userBeanList = simpleMapper.selectList(wrapper); System.out.println("result size=" + userBeanList.size()); } }
上面的示例中,使用如下参数:
Map<String,Object> map = new HashMap<>(); map.put("sex", "男"); map.put("age", null);
a、当 null2IsNull = true 时,将执行如下 SQL 语句:
Preparing: SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (sex = ? AND age IS NULL) Parameters: 男(String)
注意,allEq 方法默认 null2IsNull = true,源码如下:
/** * ignore */ default <V> Children allEq(Map<R, V> params) { return allEq(params, true); }
b、当 null2IsNull = false 时,将执行如下 SQL 语句:
Preparing: SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (sex = ?) Parameters: 男(String)