mysql的in查询缺陷:
比如说你的数据库的字段有‘1,2,3’,‘1,2’,‘1,3’,‘2,3’,‘1’,‘2’,‘3’
现在你的查询条件是‘2,3’,你会发现,不仅‘2,3’的被查出来,‘1,3’的也被查出来了
刚开始想到了一个办法,就是过来一个字段先拆成任意组合,比如说‘1,2,3’就拆成‘1,2,3’,‘1,2’,‘1,3’,‘2,3’,‘1’,‘2’,‘3’,然后查询条件由in变成=,这样当选项太多的时候效率太差。
另外一个从纯理论角度考虑的方法是:
这种方法我刚想出来的时候感觉妙极了,但是小组长说不适合我们系统
最后比较合理的处理方法就是,过来‘1,2,3’,我们拆成‘1’,‘2’,‘3’,再分别like。
用mybatis实现就是:
在service层中,把过来的‘1,2,3’拆分成数组:
String status = (String) paramMap.get("status");
String openBusinessType = (String) paramMap.get("openBusinessType");
String[] statusIn = null;
String[] openBusinessTypeIn = null;
if(StringUtils.isNotBlank(status)){
statusIn = StringUtil.getArrayBySplitStr(status);
}
if(StringUtils.isNotBlank(openBusinessType)){
openBusinessTypeIn = StringUtil.getArrayBySplitStr(openBusinessType);
}
paramMap.put("statusIn", statusIn);
paramMap.put("openBusinessTypeIn", openBusinessTypeIn);
然后在mapper中:
<if test="openBusinessType !=null and openBusinessType!='' ">
PAI.OPEN_BUSINESS_TYPE IN
<foreach item="item" index="index" collection="openBusinessTypeIn" open="(" separator="," close=")">
#{item}
</foreach>
</if>
就酱。