开发者

Mybatis的if从句中的赋值乌龙

目录
  • 问题背景
    • 问题分析
  • 问题解决
    • 总结

      最近遇到一个有点意思的bug,特此记录一下。

      问题背景

      前台参数:前端请求后台接口,上送参数进行查询,上传参数如下:

      Mybatis的if从句中的赋值乌龙

      可知上送为两个参数:activityType: “3”,merchantId: “3a9d21a0d18a4e1c819dac57b1730992”

      • 后台逻辑
      String activityType = vo.getActivityType();
      		String merchantId = vo.getMerchantId();
      		List<TbMarketActivity> activity = activityMapper.getActivityByMerchantId(activityType, merchantId);
      
      • SQL语句
      <select id="getActivityByMerchantId"
                  resultType="cn.buyforyou.aipc.small.api.entity.marketActivity.TbMarketActivity">
              SELECT
              <include refid="tbMarketActivityColumns"/>,
              b.product_discount as "productDiscount"
             kjmJPl FROM
      http://www.devze.com        tb_market_activity a
              left join tb_market_activity_product b on a.activity_id = b.activity_id
              <where>
                  a.status = '2'
                  and a.activity_type = #{activityType}
                  and a.merchant_id = #{merchantId}
              </where>
              <if test="activityType != null and activityType = '2'.toString()">
      			order by product_discount
      		</if>
      		limit 1
          </select>
      

      后台直接使用前台参数进行数据库查询,sql日志如下:

       ==> Preparing: SELECT a.activity_id AS "activityId", b.product_discount as "productDiscount" FROM tb_market_activity a left join tb_market_activity_product b on a.activity_id = b.activity_id WHERE a.status = '2' and a.activity_type = ? and a.merchant_id = ? order by product_discount limit 1 
       ==> Parameters: 2(String), 3a9d21a0d18a4e1c819dac57b1730992(String)
       <==      Total: 0
      

      那么问题就来了,中间并没有进行任何的上传参数处理,但是到了SQL语句中,activity_type的值是2,而不是上传的3

      问题分析

      排查一:确认上送参数

      Mybatis的if从句中的赋值乌龙

      如图,上传参数确实为3,但是到了sql中还是2,很纳闷,确定不是上送参数的问题

      • 排查二:SQL语句

        本次sql并不复杂,就是一个简单的条件过滤查询python,而且根据SQL日志来看,也已经成功绑定了

      • 排查三:特么没有可排查的啦,简直就没找到错误,暂定为悬案

      反思:为啥上传和代码处理都正确,但是SQL赋值出现错误,明明上kjmJPl传的activityType为3,可最后的条件是2;但又为啥不是其他偏偏是2呢。。。。。。

      问题解决

      问题的关键点就在于为啥偏偏是2身上,仔细看一下sql语句,这个activityType还是和2产生过联系的。如下:

      Mybatis的if从句中的赋值乌龙

      这是一个简单的条件判断,并决定排序字段的语句,但是中间却使用了等号作为判断条件,显然这儿是不成立的,大抵已经找到原因了。

      activityType就是在这个if判断语句中,被赋值为2的,即使在MyBATis的初始绑定值为3,那这么说的话,activityType不为null时,它的值会一直为2。

      继续往下面想,这个if语句的执行顺序,应该是在执行SQL查询之前,那可以推断的是,Mybatis在执行SQL时,首先是先将所有的标签转化组装为SQL,然后在执行SQL语句。所以这里就已经被赋错了值。

      解决办法也特别简单,就是再加一个=就可以了,标准的判断语句而已。

      补充 :mybatis的映射文件中,使用的是ognl表达式,所以在字符串进行判等的时候,可使用以下两种方法

      <if test="sex=='Y'.toString()">
      或者
      <if test = 'sex== "Y"'>
      

      唯独不能使用

      <if test="sex=='Y'">
      

      因为mybatis会把’Y’解析为字符,Java是强类型语言,所以不能这样写。

      总结

      确实觉得很有意思,一个很小的错误,发生的那么不经意,SQL不报错,页面也没有错误,排查起来确实费了点心,以后写代码还是得多加注意呀!!!

      到此这篇关于Mybatis的if从句中的赋值乌龙的文章就介绍到这了,更多相关Mybatis if从句赋值内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持kjmJPl编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜