mybatis的坑-integer类型为0的数据if test失效问题

integer类型为0的数据if test失效

mybatis的where动态判断语句if test 遇到tinyint类型为0的数据失效

发现一个mybatis的坑,有个支付表,通过状态去筛选已支付/未支付的数据,支付状态用status字段表示,status=0表示未支付,status=1表示已支付,且status类型为Integer。当选择已支付即status=1时,可以筛选成功已支付的数据列表,但是当选择未支付即status=0时,查出来的数据是未支付和已支付的所有数据。

此时就有点懵逼了,后面debug一层层去追踪,发现status=0时,mybatis构建的sql中where条件没有把status字段拼接上去,但是status=1时,sql中可以看到where中有status字段。

经过后面找资料发现,integer类型的字段,在mybatis中的if test 条件中,会把值为0的当成false处理,因为会将integer=0的参数默认为‘’(空串),即status=0的判断结果为false,所以未支付的条件永远不可能出现,查出来的数据就是所有状态的数据。

以下图为出错时的语句:

<where>
            <trim prefixOverrides="and">
                <if test="status != null and status !=''">and status=#{status}</if>
                <if test="createdDtBegin != null">and created_dt <![CDATA[ >= ]]>
                    #{createdDtBegin, jdbcType=TIMESTAMP}
                </if>
                <if test="createdDtEnd != null">and created_dt <![CDATA[ <= ]]>
                    #{createdDtEnd, jdbcType=TIMESTAMP}
                </if>
            </trim>
</where>

解决方式

改成 **<if test=“status != null”>and status=#{status, jdbcType=TINYINT}</if>

这样即可,即把 status != ''去掉

或者还有一种做法,即:

如果status为integer,<if test=“status != null and status != -1”>或者:如果status为integer,<if test=“status != null and status != ‘’ or status == 0”>

mybatis if 判断 Integer 类型的坑

当POJO中的属性类型为 Integer 时,传入 0,此时在 xxxMapper.xml的 if 判断中总是不能满足条件,进而导致查询条件无效,这是因为 mybatis 针对 integer 类型的 0 进行了特殊处理,当成了 ‘’ 来处理,进行如下判断即可:

payStatus 为 Integer 类型

<if test="payStatus != null and payStatus != '' or payStatus == 0">
    and a.pay_status = #{payStatus}
</if>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2022-01-12

Mybatis Integer类型参数值为0时得到为空的解决方法

今日遇到的问题: 查询版本信息时,由于version是Integer类型,所以当前台选择版本为0时,变成了查询了所有的版本信息. sql片段: </if> <if test="version != null and version != '' "> AND a.version = #{version} </if> 原因: MyBatis因自身原因默认了 Integer类型数据值等于0时 为 ""(空字符串) 解决办法: 1. 某些

解决myBatis返回integer值的问题

经过测试 将 resultMap="java.lang.Integer" 改成 resultType="java.lang.Integer" 也可以解决问题~ 补充知识:mybatis返回count(*)的整数值 1.mybatis中resultType定义为"java.lang.Integer" <select id="selectNums" resultType="java.lang.Integer&quo

mybatis修改int型数据无法修改成0的解决

目录 mybatis修改int型数据无法修改成0 场景如下 过程如下 解决方法 mybatis int类型值为0判空 问题现状 问题原因 解决方法 mybatis修改int型数据无法修改成0 今天遇到一个很奇葩的问题,修改user实体里面的一个int型的状态量1.2.3........都可以修改成功,唯独参数为0时修改不成功,控制台也没有报错,一切正常.项目用的是ssm框架.最后找到问题是出在mybatis的mapper.xml里了. 场景如下 修改status的值,0为禁用,1为启用.当传入的

Mybatis逆工程jar包的修改和打包

上一篇文章Mybatis逆工程的使用主要是讲了mybatis-generator-core-1.3.2.jar的使用,这一篇我要介绍的是,修改jar包代码,实现生成自定义模板. 1.我们从这里可以下载mybatis-generator-core-1.3.2.jar项目源码 http://maven.outofmemory.cn/org.mybatis.generator/mybatis-generator-core/1.3.2/ 2.在eclipse下导入存在的maven项目,File->Imp

修改Maven settings.xml 后配置未生效的解决

1. 问题描述: 自己修改了下 ${M2_HOME}/conf/settings.xml中的本地repository地址,但是重新执行mvn的时候发现repository地址并没有改变.那么问题所在? 2. settings.xml文件位置 settings.xml文件一般存在于两个位置: 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: user.home/.m2/settings.xml (note:用户配置优先于全局配置.) 3. 配置优先级: 需要注意的是

mybatis 使用jdbc.properties文件设置不起作用的解决方法

这样写的时候起作用: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases

JavaScript CSS修改学习第三章 修改样式表

请注意代码和传统的DHTML的区别.在DHTML你通过直接修改页面上的特定元素来改变样式,而这里的代码修改的是样式表.在这里查看W3C DOM-CSS的兼容性列表.定义 一个页面总是包含一个或者几个样式表,一个样式表里面包含一条或者几条规则,一条规则里有详细的样式声明.这个页面的样式表如下: 复制代码 代码如下: <link rel="stylesheet" href="../quirksmode.css"> <style> <!--

intellij idea修改maven配置时总是恢复默认配置的解决方法idea版本(2020.2.x)

该方法针对idea版本(2020.2.x) C:\Users\yanghao\AppData\Roaming\JetBrains\IntelliJIdea2020.2\options\project.default.xml <component name="MavenImportPreferences"> <option name="generalSettings"> <MavenGeneralSettings> <opti

sqlserver 2008手工修改表结构,表不能保存的问题与解决方法

如果点击"保存文本文件"将会弹出保存文本文件的对话框口, 保存的文本文件中的内容是如下: /*    2010年4月5日0:34:53    用户:    服务器: LONGGEL    数据库: longgel    应用程序: */ ChildCaiClass 保存的对于我来说简直是没用的信息,只是记录了事务的发生时间和一些相关信息,结果这样操作了数据库的结构还是没能修改并保存,而是继续弹出上面的那个窗口,这下我就郁闷了. 点击"取消"却弹出 同样也是没有完成表

计算机名称修改后Oracle不能正常启动问题分析及解决

前一阵子,在下给老妹装好oracle后,发现老妹的计算机名称好长,不容易记,于是一时手痒,将其计算机名称更改了一下,没想到就这一步操作,可苦坏了俺老人家了,一场悲剧即将开始! 当更改计算机名称,重启电脑后,发现oracle不能启动了.当时俺就想呀,差哪呀,安装完成后,oracle还是可以启动的呢,怎么现在就不行了呢.经过俺老人家仔细的回忆,才发现罪魁祸首就是俺随手更改的计算机名称.因为oracle启动的监听,代理等都是与计算机名称绑定在一起的. 俺马上使出俺唯一的杀手戬--google,经过网上

易语言如何修改图标?易语言修改图标步骤

易语言是一门计算机程序语言.以"易"著称,以中文作为程序代码表达的语言形式.当写好一个程序的时候想要放一个漂亮的图标就至关重要~! 1.先打开易语言,在打开要修改的易语言程序源码文件. 2.找到菜单栏的"文件"里面有一个配置. 3.在"配置"里面我们可以输入详细的程序作者信息,这些就不详细说明了,说修改图标. 4.点击"设置程序图标",选择好图标文件就可以啦,图标文件格式必须是 ico文件的! 5.要是你没有,我们可以去简单的

Mybatis返回int或者Integer类型报错的解决办法

会报错如下: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Mapper method 'com.bill.springMybatis.dao.UserDao.getUserIdByName attempted to return null from a m

mysql修改密码的三方法和忘记root密码的解决方法

方法1: 用SET PASSWORD命令 复制代码 代码如下: mysql -u rootmysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); 方法2:用mysqladmin 复制代码 代码如下: mysqladmin -u root password "newpass" 如果root已经设置过密码,采用如下方法 复制代码 代码如下: mysqladmin -u root password oldpas