springboot項目通常配合mybatisplus來做數據CRUD。 我們在查詢或更新數據的時候,有時要用到in來過濾數據。比如SELECT * FROM emax_scbg_order WHERE order_no IN (1305679009380433922,130540525947283 ...
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方法同時支持傳入數組和集合。取決於你調用哪個重載方法。
使用in的姿勢