springboot项目通常配合mybatisplus来做数据CRUD。
我们在查询或更新数据的时候,有时要用到in来过滤数据。比如
SELECT * FROM emax_scbg_order WHERE order_no IN (1305679009380433922,1305405259472830465)
mybatisplus中关于in方法的使用,在传多个字段值的时候,我们经常搞不清是传Array呢还是ArrayList呢?
其实,细心的同学,看一下in方法的签名定义,就明白了。
mybatisplus中有4个in方法的重载。
所有Wrapper的超类是AbstractWrapper,AbstractWrapper实现了Func<Children, R>接口。in方法主要在Func<Children, R>接口中定义。
下面是Func<Children, R>接口中in方法的4个重载:
//mybatis-plus-core-3.1.2.jar
package com.baomidou.mybatisplus.core.conditions.interfaces;
/**
* 查询条件封装
*
* @author hubin miemie HCL
* @since 2017-05-26
*/
@SuppressWarnings("unchecked")
public interface Func<Children, R> extends Serializable {
/**
* ignore
*/
default Children in(R column, Collection<?> coll) {
return in(true, column, coll);
}
/**
* ignore
*/
default Children in(R column, Object... values) {
return in(true, column, values);
}
/**
* 字段 IN (v0, v1, ...)
* <p>例: in("id", 1, 2, 3, 4, 5)</p>
*
* <li> 如果动态数组为 empty 则不会进行 sql 拼接 </li>
*
* @param condition 执行条件
* @param column 字段
* @param values 数据数组
* @return children
*/
default Children in(boolean condition, R column, Object... values) {
return in(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{}))
.collect(toList()));
}
/**
* 字段 IN (value.get(0), value.get(1), ...)
* <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
*
* <li> 如果集合为 empty 则不会进行 sql 拼接 </li>
*
* @param condition 执行条件
* @param column 字段
* @param coll 数据集合
* @return children
*/
Children in(boolean condition, R column, Collection<?> coll);
}
单从方法签名以及清晰的javadoc注释,我们可以看到,in方法接收字段值的方式,一种是Object...,一种是Collection<?>。
■ Collection<?>不用说了,是集合,比如List<E>、Set<E>、Queuet<E>等。
■ Object...是可变长参数(可变参数),可变长参数本质上就是一个数组,既可以接收一个或多个离散的值,也可以接收数组对象。
也就是说,in方法同时支持传入数组和集合。取决于你调用哪个重载方法。