原创

MyBatis 真坑!Integer 类型赋值 0 ,使用判断,无法进入执行SQL语句

开发微信小程序“Java精选面试题”后台管理系统时,遇到根据状态判断是或否发布。

MySQL数据库中设计数据库表,其中某字段status使用tinyint数据类型,当修改状态的时候,赋值status属性的值为0,用于改变状态记录试题库中发布情况。

但是通过Debug模式查看Controller控制层明显已经获取到status等于0,但是在执行到MyBatis中xml文件SQL语句时,总是无法赋值成功,xml配置如下:

<update id="updateWarehouse" parameterType="Warehouse">
update t_warehouse 
<set>
<if test="title != null and title != ''">title = #{title},</if>
<if test="code != null and code != ''">code = #{code},</if>
<if test="content != null and content != ''">content = #{content},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="parentId != null and parentId != ''">parentId = #{parentId}</if>
</set>
where id = #{id}
</update>

分析:

通过分析表面上没有任何传参问题,通过上网查询MyBatis相关资料,终于弄明白什么原因。

此行代码中

<if test="status != null and status != ''">status = #{status},</if>

and status != '',MyBatis中传参status的值为0时,因为数据类型为Integer类型,判断为false值。

MyBatis认定 0 = ''的,因此判断status != ''为false,这导致修改试题信息时状态值无法改变为0。

正确写法:

<update id="updateWarehouse" parameterType="Warehouse">
update t_warehouse 
<set>
<if test="title != null and title != ''">title = #{title},</if>
<if test="code != null and code != ''">code = #{code},</if>
<if test="content != null and content != ''">content = #{content},</if>
<if test="status != null">status = #{status},</if>
<if test="parentId != null and parentId != ''">parentId = #{parentId}</if>
</set>
where id = #{id}
</update>
~阅读全文-人机检测~

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信