allEq 条件

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

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号