mybatis 如何判断list集合是否包含指定数据

 更新时间:2021年06月21日 11:04:14   作者:yyoc97  
这篇文章主要介绍了mybatis 判断list集合是否包含指定数据的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

需求

1、在mybatis脚本中想要判断list中是否含有某个字符串。

2、动态使用list中的属性,添加到数据库crud字段。

网上也没搜到类似的案例,配置choose功能,可以方便做写动态sql拼装,所以记录下。

准备

之前脚本中用的最多的list函数就是size和遍历了。那么mybatis脚本中是不是又包含函数了。首先我们要清楚list的类型。写个简单的测试用例。

<select id="test" parameterType="java.util.Map" resultType="java.util.Map">
        select
          <if test="list.containsKey('0')">
              'yes' as a,
          </if>
          1
    </select>

在list后接一个方法containsKey,运行后会抛出一个异常:

Caused by: org.apache.ibatis.ognl.MethodFailedException: Method "containsKey" failed for object [0, 1] [java.lang.NoSuchMethodException: java.util.Arrays$ArrayList.containsKey(java.lang.Character)]

我们可以看到list的类型为:ArrayList,它没有containsKey方法,但是我们知道List应该有contains()方法,是的没错。不过脚本在计算大小时size是不用加()的,加上还会抛异常。

细节

上面异常中还有一个细节就是containsKey(java.lang.Character),Character在java里面是字符类型的,也就是List中如果是存的[0,1]或则[“0”,“1”],那么多少匹配不到了,比较整数只能是contains(0),比较字符串只能是双引号,而不能是单引号,因为java做了强制类型比较,而mybatis中双引号需要用转义字符&quot;,所以比较字符串必须有这种方式:

 <if test="list.contains(&quot;0&quot;)">
              #{逻辑}
        </if>

从list动态取数

-- 插入字段直接从list中获取,通过${list[0].retainDay} 方式。

当然也可以将list封装到map里面,这样代码中就要多操作一步

<insert id="insert">
           insert ignore into ads_circle_user_retain
             (eventDate,${list[0].retainDay})
           VALUES
            <foreach collection="list" item="item" separator=",">
                (#{item.eventDate1},#{item.readNum})
            </foreach>
           on DUPLICATE KEY UPDATE ${list[0].retainDay} = values(${list[0].retainDay})
    </insert>

集合(list)判断是否存在对应的字符串或对象

判断集合中是否存在某个字符串对象,存在返回true,不存在返回false

list.contains("str1")

判断集合中时候存在完全一样的某个对象(所有属性都一样),存在返回true,不存在返回false

list.containsAll(Objcet obj)

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

相关文章

  • Java开发利器之Guava Cache的使用教程

    Java开发利器之Guava Cache的使用教程

    缓存技术被认为是减轻服务器负载、降低网络拥塞、增强Web可扩展性的有效途径之一。今天咱们就来聊聊Guava Cache本地缓存,感兴趣的可以了解一下
    2022-09-09
  • Java 基于UDP协议实现消息发送

    Java 基于UDP协议实现消息发送

    这篇文章主要介绍了Java 基于UDP协议实现消息发送,帮助大家更好的理解和学习Java网络编程,感兴趣的朋友可以了解下
    2020-11-11
  • 基于SpringMVC入门案例及讲解

    基于SpringMVC入门案例及讲解

    这篇文章主要介绍了基于SpringMVC入门案例及讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java中Lambda表达式的使用详细教程

    Java中Lambda表达式的使用详细教程

    这篇文章将通过示例为大家详细展示Java中Lambda表达式的用法,同时也会介绍Lambda的相关知识,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • Spring中ApplicationEventPublisher发布订阅模式的实现

    Spring中ApplicationEventPublisher发布订阅模式的实现

    本文主要介绍了Spring中ApplicationEventPublisher发布订阅模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 解决SpringBoot多模块发布时99%的问题

    解决SpringBoot多模块发布时99%的问题

    本文归纳了以下 8 个原则和发布时经常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎可以解决绝大数SpringBoot发布问题
    2019-07-07
  • Spring内部bean和级联属性用法详解

    Spring内部bean和级联属性用法详解

    这篇文章主要介绍了Java内部bean和级联属性用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • RocketMQ事务消息保证消息的可靠性和一致性

    RocketMQ事务消息保证消息的可靠性和一致性

    RocketMQ事务消息是一种能够保证消息传递的可靠性和一致性的消息传递模式。它通过引入“半消息”和“事务状态”机制,实现了消息发送和本地事务执行的原子性,从而确保了消息的可靠性和一致性
    2023-04-04
  • Java StackTraceElement实例代码

    Java StackTraceElement实例代码

    这篇文章主要介绍了Java StackTraceElement实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • jdk线程池的实现

    jdk线程池的实现

    本文主要介绍了jdk线程池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论