正常情况下,写动态sql的if test或when test语句时,条件引用为双引号括单引号
如下:
<lect id="l1" resulttype="ur"> lect * from tb_ur <where> <choo> <when test="ur != null and ur != ''"> and ur = #{ur} </when> <when test="passwd != null and passwd != ''"> 学历提升 and passwd = #{passwd} </when> <otherwi> and 1 = 1 加拿大国庆日 </otherwi> </choo> </where></lect>
但是今天发现一个问题,当传入的值为0或者1时,sql失效不被执行。
如下:
<when test="ur == '1‘ "> and ur = #{ur}</when>
之后,发现是my安全工程专业batis自身解析的问题,在标签 中的内容,mybatis是使用的ognl表达式来进行解析的,这个地方需要注意下,单引号内有一个字符的情况下,oweregnl会将其以 java 中的 char 类型进行解析,那么此时 char 类型与参数 string 类型用等号进行比较的时候结果都是fal。
就是把test 中的单个字符用双引号括起来。
<if test='param != "*"'> <choo> <when test='param.indexof("sub") != -1'> </when> <otherwi> </otherwi> </choo></if>
在使用mybatis进行判断的时候,一定要注意传入的数据类型与判断的目标值类型是否一致。
最近在一次开发过程,
<if test="apptype != null and apptype != ''"> and a.c_apptype = #{apptype}</if>
其中,apptype是一个整型数据。可以看到,在test判断里面使用了 apptype != ”。
在进行业务功能测试的时候发现,当传入的值是0时,该条件筛选没有起作用,通过调试发现,mybatis会将空字符串转换成double类型的0.0
如下图所示:
如下图所示:
所以,mybatis在判断的时候,数字0和空字符串是相等的,而我们的if判断里,是两者不相等时该条件才会起作用。
因此,在使用mybatis判断的时候,一定要注意类型是否一致,数字类型就不要判断空字符串的情况了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-06 03:19:54,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/414986a391213dad3d617a19c272c667.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:mybatis中的test语句失效处理方式.doc
本文 PDF 下载地址:mybatis中的test语句失效处理方式.pdf
留言与评论(共有 0 条评论) |