• mybatis if判断两个值是否相等存在的坑啊


    1、使用“==”比较 字符类型 的值

    用“==”比较的使用场景:

    不管你用的什么类型的变量,只要变量的值是字符类型就用“==”

    产生原因:

    在mybatis中如果<if>标签用一个“=”判断左右两边的值是否相等,则mybatis会把“=”两边的值自动拆箱成基础数据类型(Number类型)

    示例如下:

    参数:String queryKwd = "a";

    <select id="getFactoryInfoList" resultMap="BaseResultMap" >
       select * from PM_FACTORY_INFO
       where DEL_FLAG='0'
           <if test="queryKwd == 'a'"><!--正确写法-->
               and 1=1
           </if>
           <if test="queryKwd = 'a'"><!--错误写法: 字符类型不能用一个“=”判断是否相等,会报错:Caused by: java.lang.NumberFormatException: For input string: "a" -->
               and 2=2
           </if>
    </select>

    2、使用“=”比较 基本数据类型 的值

    用“=”比较的使用场景:

    1、不管你用的什么类型的变量,只要变量的值是基础数值类型就用“=”

    2、当传参的类型是Object的情况下,当Object的值为单个的大小写字母或一些特殊字符串会被转换成ASCII码,此时也用”=“

    产生原因:

    1、在mybatis中如果<if>标签用一个“=”判断左右两边的值是否相等,则mybatis会把“=”两边的值自动拆箱成基础数据类型(Number类型)

    2、当用Object为参数变量,且值是如下单个大小写字母或字符串,则会被转换成相应十进制数字(ASCII码表只截取部分,更多可以自己去网上查找)

    示例如下:

    参数:String queryKwd = "1";

    <select id="getFactoryInfoList" resultMap="BaseResultMap" >
       select * from PM_FACTORY_INFO
       where DEL_FLAG='0'
           <if test="queryKwd == '1'"><!--错误写法,虽然不报错,但是永远不会成立-->
               and 1=1
           </if>
           <if test="queryKwd = '1'"><!--正确写法-->
               and 2=2
           </if>
    </select>

     3、重要提示

    在使用mybatis时,需要特别注意,当使用的参数不管是String/Object/int等类型的变量,我们需要清楚业务变量的值会是字符型还是数值型

    只要变量值是字符型就用“==”!!!(比如: <if test=" '1'=='1' ">)

    只要变量值是数值型、整形等就用“==”!!!(比如: <if test=" 1==1 ">)

    整形数值与字符串数值比价要用“==”且使用双引号!!!(比如: <if test=' 1=="1" '>) 

    (错误写法:<if test=" 1=='1' ">,不会报错,但永不成立)

    (错误写法:<if test=' 1="1" '>或<if test=" 1='1' "> ,运行时抛异)

  • 相关阅读:
    个人项目1修改版——自动生成四则表达式
    个人项目1——自动生成四则运算
    《面向对象分析与设计》阅读笔记3
    《面向对象分析与设计》阅读笔记2
    《面向对象分析与设计》阅读笔记1
    《梦断代码》阅读笔记3
    《梦断代码》阅读笔记2
    MVC中的过滤器
    MVC中的区域
    MVC中的路由
  • 原文地址:https://www.cnblogs.com/tianchao/p/11558789.html
Copyright © 2020-2023  润新知