Contents

【mybatis/java】关于mybatis中test的神奇问题

关于mybatis中test的神奇问题

缘起

项目中出现一个bug,某sql搜出了不该搜的出的数据。
一直把type=‘AAA’的数据检索出来。实际上上层代码一直传的type是BBB。

经过

其实经过调查,问题居然发送在mybatis中when test的用法。

 SELECT * FROM A_TABLE
        WHERE TYPE =#{type}
        AND PER =#{per}
        AND POINT >= #{rate}
        <choose>
            <when test="type='AAA'">
                AND IFNULL(SET_NAME,'')=''
            </when>
            <when test="type='BBB'">
                <if test="setName !=null and setName !=''" >
                    AND SET_NAME =#{setName}
                </if>
            </when>
        </choose>
        ORDER BY ID limit 1

这里test后面用了=符号,是错误的,会造成where条件第一个字段的数据被覆盖成AAA,
这样会造成很诡异的bug,正确的写法这里应该用==,而不是一个=。
通常看了很多例子都是在test后面用!=,还是能不用=号的为妙!

结语

其实就是一个mybatis的使用问题,虽然很基础但是结合具体数据会很诡异。