在mybatis中,当 where in 条件大于1000时可以做的特殊处理:
<select id = "queryBranchPage" >
select project_id, branch_name from gitlab_branch m
<where>
<if test="projectIds != null and projectIds.size() != 0">
and m.project_id in
<trim suffixOverrides = "or m.project_id in()">
<foreach collection ="projectId" item = "id" index = "index" open="(" colse = ")">
<if test="index != 0">
<choose>
<when test="index % 100 === 999">
) or m.project_id in (
</when>
<otherwise>
,
</otherwise>
</choose>
</if>
#{id}
</foreach>
</trim>
</if>
</where>
</select>
1.通过trim标签的属性suffixOverrides:去掉后缀匹配上的东西,例子中后缀如果是or m.project_id in()与suffixOverrides属性值刚好匹配,则去掉or m.project_id in()
2.index集合迭代的位置是从0开始, 是为了in条件中开头多余的一个逗号,如果没有,sql则是:m.project_id in(**,**1,2,3…)
3.foreach 元素的属性主要包括:
3.1.item:集合中每一个元素或者该集合的对象,支持对象点属性的方式获取属性#{obj.filed}或者#{value}
3.2.index:循环的下标,从0开始
3.3.open:表示以什么开始
3.4.separator:每次进行迭代之间以什么符号作为分隔符
3.5.colse:表示以什么结束
4.trim标签四个属性及其作用:
4.1.prefix:添加前缀
4.2.prefixOverrides:删除前缀
4.3.suffix:添加后缀
4.4.suffixOverrides:删除后缀
5.sql结果:
当大于999,sql 则是: m.project_id in(1,2,3…998) or m.project_id in(999,1000,…1998) …
当小于999,sql 则是: m.project_id in(1,2,3…)