关于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不会被解析。
如何解决:
三种:
- 加 .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 <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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!