浅析mybatis判断数字类型遇到的坑及解决
一、问题背景
1、项目场景:
看下面这几个数值型的字段筛选,默认不筛选时前端就会传空字符串,包括type,然后后端就都加了判断不为空字符串的判断,但是结果是 type 为 0 时会失效。
也就是说:如果是数值类型的字段,限制 != '' 的话,type=0 的时候会失效。
2、结论:数值型不用限制 != '',因为数值型到mybatis,空字符会自动转为null了。
二、MyBatis 数值类型 where 条件配置的坑
1、先通过案例复现该类异常,StudentMapper.xml 中根据条件获取学生信息的 SQL 配置如下所示
<!-- 根据条件获取学生信息-->
<select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_student
<where>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="sex != null and sex != ''">
AND sex = #{sex}
</if>
<if test="selfcardNo != null">
AND selfcard_no = #{selfcardNo}
</if>
</where>
</select>
该配置问题出在 <if test="sex != null and sex != ''"> 这段代码,sex 在传入的参数中是 Byte 类型,属于数值类型,而 sex != '' 适用于字符串类型判断,我们误将数值类型当成字符串类型配置了。
当我们错误的配置了 sex 字段的判断条件,传入 sex = 0 时,sex != '' 会返回 false,传入 sex = 1 时,sex != '' 会返回 true,同样是传入数字,为什么会出现两种不同的结果呢?
2、分析源码
org.apache.ibatis.ognl.OgnlOps#compareWithConversion(Object v1, Object v2) 该方法在比较 (Byte)0 和 "" 时,返回的是 true,也就是该方法认为两者是相同的,执行结果如下图所示。
也就是说:参数一个是0,一个是"",最终debug会走进case 8 里面,0和 "" 都会被转成double进行比较,都会变成0.0,这就是 mybatis 中 if test 0 != "" 判定为false的原因
所以,sex = 0 的条件没有出现在生成的 SQL 中。
那么当 sex = 1 的时候,compareWithConversion(Object v1, Object v2) 方法的执行结果是怎样的呢?
修改参数,调试测试接口,执行结果如下图所示:
compareWithConversion(Object v1, Object v2) 方法返回的结果是 false,其实该问题的本质是,org.apache.ibatis.ognl.OgnlOps#doubleValue(Object value) 方法当 value 是空字符串时返回 0.0D。
3、结论:对于数值类型的参数,在配置 where 条件的时候要注意,不能把它当成字符串类型判断,数值型只需要判断 sex != null 就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律