关于Mybatis中if标签未生效问题

今日索引

今天需要更改以前写的功能,增加字段来当控制器判断是执行方案一还是方案二

在前端增加传值时,纠结了是传Boolean还是整形还是字符串类型

因为是复选框类型,所以默认传的是Boolean类型,一开始传参不成功。以为是JS无法传布尔类型给后端,所以在前端做了判断更改了传的类型为字符类型的1与0

结果还是不成功,DEBUG之后发现是实体类中新增的字段未成功启用,将package clean&Install之后传值成功。

 

 

实际解决方法

在更改Mapper时用了大量的<if>标签,可读性很差耦合性强,所以改成了<chose><when>标签。在更改之后出现<chose>标签外的if<标签>条件未生效

查阅资料时初发现:

mybatis是用OGNL表达式来解析的,在OGNL的表达式中,'0’会被解析成字符,java是强类型的,char 和 一个string 会导致不等,所以if标签中的sql不会被解析。

 


如何解决:

三种:

 

  1. 加 .toString()
1 <if test="computationRule == '1'.toString()">
2    FROM app_sz_bbb a
3 </if>
4 <if test="computationRule == '2'.toString()">
5    FROM app_ccc a
6 </if>
  1. 单引号 换成双引号
1 <if test='computationRule == "1"'>
2    FROM app_sz_bbb a
3 </if>
4 <if test='computationRule == "2"'>
5    FROM app_ccc a
6 </if>

  3.java 传值为 数值类型 Integer int之类的

1 <if test='computationRule == 1'>
2    FROM app_sz_bbb a
3 </if>
4 <if test='computationRule == 2'>
5    FROM app_ccc a
6 </if>

 

参考资料:https://blog.csdn.net/qq_43167632/article/details/110189333

 

但前端与后端在改为Integer类型后,还是判断未生效,不过情况比前面稍微好一点就是变成部分未生效

在又经过繁琐的查阅资料后,得出一下结论:

 

前端传入status=1,查询的结果与预期一致,status=1的行记录被查询出来。当status=0时,status像未生效一样,查询出的行记录包含status=1和status=0的记录,这真是见了鬼了,我明明赋值写了查询条件为status=0了啊。

其实这是mybatis的一个bug,当判断条件status为整型时,如果status=0时,if test里会判断status=’ '。

建议是

1         <if test="status !=null and status != ''">
2             and status = #{status}
3         </if>
4 修改为
5         <if test="status !=null">
6             and status = #{status}
7         </if>

即去掉 status != ‘ ‘

 

但在更改后效果仍然不算太好

将前端传值从1,0改为1,2。mapper判断将0改为2后,程序正常运行

 

参考资料:

Mybatis整型if判断不生效,你也踩坑了吗?:https://blog.csdn.net/chanllenge/article/details/105127483

mybatis if 标签 判断不生效 :https://blog.csdn.net/qq_43167632/article/details/110189333

mybatis中动态标签「if」没有生效的原因: https://blog.csdn.net/weixin_41968562/article/details/107069557

posted @   无火祭祀场  阅读(516)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示