注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “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)