in传数组 mybstis_mybatis-plus中的in的使用,是传Array?还是传List?别再纠结了
springboot项目通常配合mybatisplus来做数据crud。
我们在查询或更新数据的时候,有时要用到in。比如
SELECT * FROM emax_scbg_order WHERE order_no IN (1305679009380433922,1305405259472830465)
mp中关于in方法的使用,在传多个字段值的时候,我们经常搞不清是传Array呢还是ArrayList呢?
其实,细心的同学,看一下in方法的定义,就明白了。
mp中有4个in方法的重载。
所有Wrapper的超类是AbstractWrapper,AbstractWrapper实现了Func接口。in方法主要在Func接口中定义。

//mybatis-plus-core-3.1.2.jar
packagecom.baomidou.mybatisplus.core.conditions.interfaces;/*** 查询条件封装
*
*@authorhubin miemie HCL
*@since2017-05-26*/@SuppressWarnings("unchecked")public interface Func extendsSerializable {/*** ignore*/
default Children in(R column, Collection>coll) {return in(true, column, coll);
}/*** ignore*/
defaultChildren in(R column, Object... values) {return in(true, column, values);
}/*** 字段 IN (v0, v1, ...)
*
例: in("id", 1, 2, 3, 4, 5)
*
*
如果动态数组为 empty 则不会进行 sql 拼接*
*@paramcondition 执行条件
*@paramcolumn 字段
*@paramvalues 数据数组
*@returnchildren*/
default Children in(booleancondition, R column, Object... values) {return in(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> newObject[]{}))
.collect(toList()));
}/*** 字段 IN (value.get(0), value.get(1), ...)
*
例: in("id", Arrays.asList(1, 2, 3, 4, 5))
*
*
如果集合为 empty 则不会进行 sql 拼接*
*@paramcondition 执行条件
*@paramcolumn 字段
*@paramcoll 数据集合
*@returnchildren*/Children in(boolean condition, R column, Collection>coll);
}
我们可以看到,in方法接收字段值的方式,一种是Object...,一种是Collection>。
Collection>不用说了,是集合,比如Listt、Sett、Queuet等。
Object...是可变长参数(可变参数),可变长参数本质上就是一个数组,既可以接收一个或多个离散的值,也可以接收数组对象。
也就是说,in方法同时支持传入数组和集合。取决于你调用哪个重载方法。
正确姿势一(List集合):
List ids = Arrays.asList(122L,23L);;new QueryWrapper().lambda().in(Driver::getServiceId,ids);
正确姿势二(数组对象):
Long[] ids={1305679009380433922,1305679009380433922};
LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda().in(Driver::getServiceId,ids);
正确姿势三(离散值):
new QueryWrapper().lambda()
.in(Driver::getServiceId,1305679009380433922,1305679009380433922);
正确结果:
==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN(?,?)==> Parameters: 1305679009380433922(String), 1305405259472830465(String)<== Total: 2
千万别传模棱两可的参数,这样jvm会给你意想不到的结果。
错误姿势一:
.in(StringUtils.isNotBlank(vo.getOrderNumList()),ScbgOrder::getOrderNo,
StringUtils.isNotBlank(vo.getOrderNumList())? vo.getOrderNumList().split(",") : "")
错误结果一:
==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN (?)
==> Parameters: [Ljava.lang.String;@3eb6d7a9(String[])
<== Total: 0
调试程序可以看到values里的参数值:

错误姿势二:
.in(StringUtils.isNotBlank(vo.getOrderNumList()),ScbgOrder::getOrderNo,"123,4566");
错误结果二:
==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN (?)
==> Parameters: 1,3(String)
<== Total: 0
OK,那么not in怎么用呢?在mybatisplus中,not in的用法与in是相同的。如下notIn方法签名的截图一看便知:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)