当前位置:首页 > Java技术 > MyBatis 数值类型 where 条件配置的坑

MyBatis 数值类型 where 条件配置的坑

2022年09月17日 13:48:20Java技术8

更多文章参考我的笔记:https://www.yuque.com/yinjianwei/vyrvkf

 

复现异常

我们先通过案例复现该类异常,测试项目地址:https://gitee.com/yin_jw/demo/tree/master/mybatis-demo/springboot-mybatis-demo,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,同样是传入数字,为什么会出现两种不同的结果呢? 

sex = 0 的执行效果如下图所示:

MyBatis 数值类型 where 条件配置的坑 _ JavaClub全栈架构师技术笔记

sex = 1 的执行效果如下图所示:

MyBatis 数值类型 where 条件配置的坑 _ JavaClub全栈架构师技术笔记

sex = 0 的执行返回内容明显不是我们需要的结果,下面我们通过源码分析来解开这个谜题。

分析源码 

通过源码分析篇中的“MyBatis 源码篇-SQL 执行的流程”章节,我们知道 MyBatis 执行 SQL 最终都会交给 Executor 类执行。 

前面的调试步骤省略,直接进入 CacheExecutor 类的 query 方法。

MyBatis 数值类型 where 条件配置的坑 _ JavaClub全栈架构师技术笔记

猜测 MyBatis 根据参数和映射配置文件生成 boundSql 的时候,出现了一些问题。我们一路往下 DEBUG,发现问题出在 MyBatis 对 OGNL 表达式处理上面。 

org.apache.ibatis.ognl.OgnlOps#compareWithConversion(Object v1, Object v2) 该方法在比较 (Byte)0 和 "" 时,返回的是 true,也就是该方法认为两者是相同的,执行结果如下图所示。

MyBatis 数值类型 where 条件配置的坑 _ JavaClub全栈架构师技术笔记

所以,sex = 0 的条件没有出现在生成的 SQL 中。

那么当 sex = 1 的时候,compareWithConversion(Object v1, Object v2) 方法的执行结果是怎样的呢?

修改参数,调试测试接口,执行结果如下图所示:

MyBatis 数值类型 where 条件配置的坑 _ JavaClub全栈架构师技术笔记

compareWithConversion(Object v1, Object v2) 方法返回的结果是 false,其实该问题的本质是,org.apache.ibatis.ognl.OgnlOps#doubleValue(Object value) 方法当 value 是空字符串时返回 0.0D。

MyBatis 数值类型 where 条件配置的坑 _ JavaClub全栈架构师技术笔记

结论 

对于数值类型的参数,在配置 where 条件的时候要注意,不能把它当成字符串类型判断,数值型只需要判断 sex != null 就可以了。

作者:殷建卫
来源链接:https://www.cnblogs.com/yinjw/p/11933361.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42710.html

标签: MyBatis
分享给朋友:

“MyBatis 数值类型 where 条件配置的坑” 的相关文章

MyBatis配置的pom文件

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200...

mybatis实战之拦截器

mybatis实战之拦截器 在服务的开发过程中,往往存在这样的需求,针对业务,实现对数据库操作语句做统一的处理。比如对某些敏感数据如用户姓名、手机号等坐脱敏处理保存和查询、对未实现权限的查询通过添加关联查询实现权限控制查询结果等等。 这时,myba...

mybatis:在springboot中的配置

## Mybatis 配置 mybatis.type-aliases-package=com.xfind.core.entity.xianyu mybatis.mapper-locations=classpath:mapper/*.xml #使全局的映射器启用或禁用缓存。 mybati...

springboot中配置mybatis别名该怎么写?

springboot中配置mybatis别名该怎么写?

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。 今天给大家分享的是,在springboot配置文件中,如何给mybatis实体类起别名。 在以前,我们写mybatis的时候,有一个文件为mybatis-config.xml,sql映射m...

mybatis配置文件中config与mapper的约束

Config的约束: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3....

Mybatis分页插件PageHelper的配置和使用方法

Mybatis分页插件PageHelper的配置和使用方法

http://www.cnblogs.com/kangoroo/p/7998433.html   前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页。 前端...

Mybatis Generator最完整配置详解

Mybatis Generator最完整配置详解

背景 通过mybatis插件自动生成代码 MyBatis 介绍 MyBatis 是一款标准的 ORM 框架,被广泛的应用于各企业开发中。MyBatis 最早是 Apache 的一个开源项目 iBatis,2010 年这个项目由 Apache Software F...

Mybatis使用xml方式配置

Mybatis使用xml方式配置

官网地址:https://mybatis.org/mybatis-3/zh/getting-started.html 使用案例: 我们创建一个数据库叫做mybatis,在其下创建userinfo数据表,然后创建相应的字段,对应的数据库字段如下: 然后,...

MyBatis配置下划线转驼峰

myBatis配置实现数据库字段下划线映射到java对象的驼峰式命名属性。 要实现上面的配置需要在mybatis-config.xml配置文件中添加如下设置: <?xml version="1.0" encoding="UTF-8" ?>...

使用MyBatis快速生成代码

使用MyBatis快速生成代码

使用MyBatis根据数据库快速生成代码的几种方法 一、使用MyBatis插件和EasyCdoe插件 1. 安装插件 2. IDEA里配置MySQL 3.根据数...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。