zoukankan      html  css  js  c++  java
  • 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也没有语法错误。

  • 相关阅读:
    通用爬虫和聚焦爬虫
    分布式缓存的介绍
    点击按钮执行后台方法
    jsp页面设置绝对路径
    vim调试
    图解Java 垃圾回收机制
    Java String 综述(上篇)
    Java 内部类综述
    深入理解Java类加载器(二):线程上下文类加载器
    深入理解Java类加载器(一):Java类加载原理解析
  • 原文地址:https://www.cnblogs.com/chenglc/p/14926665.html
Copyright © 2011-2022 走看看