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

 更新时间:2024年03月09日 15:11:13   作者: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也没有语法错误。

总结

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

相关文章

  • java实现猜数字小游戏

    java实现猜数字小游戏

    这篇文章主要为大家详细介绍了java实现猜数字小游戏,随机给定一个数字,直到猜对大小,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • SpringBoot之Profile的两种使用方式详解

    SpringBoot之Profile的两种使用方式详解

    当在不同的环境下,想通过修改配置文件来连接不同的数据库,比如在开发过程中启动项目时,想连接开发环境对应的数据库,可以在配置文件中指定environment=dev,其他环境类似,此时就需要用到Spring为我们提供的Profile功能,本文给大家介绍了SpringBoot之Profile的两种使用方式
    2024-10-10
  • Java实现走迷宫回溯算法

    Java实现走迷宫回溯算法

    这篇文章主要为大家详细介绍了Java实现走迷宫回溯算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java内存泄漏问题排查与解决

    Java内存泄漏问题排查与解决

    大家好,本篇文章主要讲的是Java内存泄漏问题排查与解决,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • SpringBoot中@ConfigurationProperties注解的使用与源码详解

    SpringBoot中@ConfigurationProperties注解的使用与源码详解

    这篇文章主要介绍了SpringBoot中@ConfigurationProperties注解的使用与源码详解,@ConfigurationProperties注解用于自动配置绑定,可以将application.properties配置中的值注入到bean对象上,需要的朋友可以参考下
    2023-11-11
  • scala中常用特殊符号详解

    scala中常用特殊符号详解

    这篇文章主要介绍了scala中常用特殊符号详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • java多线程CyclicBarrier的使用案例,让线程起步走

    java多线程CyclicBarrier的使用案例,让线程起步走

    这篇文章主要介绍了java多线程CyclicBarrier的使用案例,让线程起步走!具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码图文详解

    IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码图文详解

    这篇文章主要介绍了IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码详细流程,在这里小编使用的是idea2021.1最新开发工具,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2021-05-05
  • 解析Mybatis的insert方法返回数字-2147482646的解决

    解析Mybatis的insert方法返回数字-2147482646的解决

    这篇文章主要介绍了解析Mybatis的insert方法返回数字-2147482646的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 深入探究SpringBoot中的Elasticsearch自动配置原理及用法

    深入探究SpringBoot中的Elasticsearch自动配置原理及用法

    SpringBoot中的Elasticsearch自动配置为我们提供了一种快速集成Elasticsearch的方式,使我们可以在SpringBoot应用程序中轻松地使用Elasticsearch,本文将介绍Spring Boot中的Elasticsearch自动配置的作用、原理和使用方法
    2023-07-07

最新评论