java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Mybatis foreach标签内传入list为空

Mybatis之foreach标签内传入list为空的问题

作者:Sibylsf

这篇文章主要介绍了Mybatis之foreach标签内传入list为空的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

foreach标签内传入list为空的问题

复盘一下填过的坑

mybatis中,如果不对list就行判空处理,就会出现当list为空或者list.size=0时抛异常,

错误示例如下:

 SELECT * FROM table_xxx (NOLOCK)
WHERE id in
  <foreach collection="list" index="index" item="item"  open="(" separator="," close=")">  
    #{item}
  </foreach>

解决方案如下:(推荐第二种)

1、对list判null和判空来处理

使用mybatis进行in()判断的时候传入参数为List,需要判断List是否为空了,当然可以在java代码中进行判断,但是我不想每次调用该方法都要进行判断,所有最好还是在mybatis的sql配置文件中判断

配置如下:

 SELECT * FROM table_xxx (NOLOCK) WHERE isactive=1
<if test="list != null and list.size() > 0">
 id in
  <foreach collection="list" index="index" item="item"  open="(" separator="," close=")">  
    #{item}
  </foreach>
</if>

2、对list判null和判空来处理(墙裂推荐

 SELECT * FROM table_xxx (NOLOCK) 
WHERE  isActive=1
<foreach collection="list" index="index" item="item" open="AND id IN (" separator="," close=")">
    #{item}
</foreach>

mybatis foreach list特殊处理

最近做一个功能,sql要用到 IN 条件,通过list传入IN 的值,如:

SELECT * FROM table1 WHERE id in (1,2,3)

对应的mybatis写法为:

    <select id="queryByIds" resultMap="resultMap" parameterType="list">
        SELECT * FROM table1
        WHERE id
        <foreach collection="list" item="rid" open="in(" separator="," close=")">
            #{rid}
        </foreach>
    </select>

期望结果是按list的值进行查询。

可是,当list为空的时候呢?

sql应该是这样的

SELECT * FROM table1 WHERE id in ()

直接在mysql中运行肯定是语法错误的。

无论如何是不会查到数据的,但mybatis又是什么策略呢?直接把这一条where条件给我忽略了…导致查全表数据。

这也不好说mybatis做的好不好,算不算bug了。

既然知道套路了,就得有策略来应对了。于是多写了两个if。

    <select id="queryByIds" resultMap="resultMap" parameterType="list">
        SELECT * FROM table1
        WHERE id
        <if test="list != null and list.size() > 0">
            <foreach collection="list" item="rid" open="in(" separator="," close=")">
                #{rid}
            </foreach>
        </if>
        <if test="list == null or list.size() == 0">
            = -1
        </if>
    </select>

不算是这么上策,但也能解决问题,当list为空时,给id赋值一个-1,保证查不到数据,sql也没有语法错误。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文