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也没有语法错误。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot中@ConfigurationProperties注解的使用与源码详解
这篇文章主要介绍了SpringBoot中@ConfigurationProperties注解的使用与源码详解,@ConfigurationProperties注解用于自动配置绑定,可以将application.properties配置中的值注入到bean对象上,需要的朋友可以参考下2023-11-11java多线程CyclicBarrier的使用案例,让线程起步走
这篇文章主要介绍了java多线程CyclicBarrier的使用案例,让线程起步走!具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-02-02IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码图文详解
这篇文章主要介绍了IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码详细流程,在这里小编使用的是idea2021.1最新开发工具,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下2021-05-05解析Mybatis的insert方法返回数字-2147482646的解决
这篇文章主要介绍了解析Mybatis的insert方法返回数字-2147482646的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-04-04深入探究SpringBoot中的Elasticsearch自动配置原理及用法
SpringBoot中的Elasticsearch自动配置为我们提供了一种快速集成Elasticsearch的方式,使我们可以在SpringBoot应用程序中轻松地使用Elasticsearch,本文将介绍Spring Boot中的Elasticsearch自动配置的作用、原理和使用方法2023-07-07
最新评论