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>

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

(0)

相关推荐

  • 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的坑-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时,查出来的数据是未支付和已支付的所有数据. 此时就有点懵逼了

  • 关于mybatis遇到Integer类型的参数时动态sql需要注意条件

    目录 mybatisInteger类型参数动态sql注意条件 例如以下拼接的动态sql mybatis的坑——Integer类型参数解析问题 有时候我们使用实体类传递参数时 因为mybatis在解析Integer类型数据时 mybatis Integer类型参数动态sql注意条件 例如以下拼接的动态sql <if test="work_status !=null  and work_status !='' ">  and T.status=#{work_status,jdb

  • mybatis参数String与Integer类型的判断方式

    目录 String与Integer类型的判断 我们一般是这样写 使用<if>标签判断Integer类型的坑 没想到还有另外的问题 注意上面的第二个条件使用的单个等号 String与Integer类型的判断 mybatis写update时,正常是set了值才会进行update操作 我们一般是这样写 <if test="sampleBatchNo != null and sampleBatchNo != ''"> SAMPLE_BATCH_NO =#{sampleB

  • 浅谈Mybatis+mysql 存储Date类型的坑

    场景: 把一个时间字符串转成Date,存进Mysql.时间天数会比实际时间少1天,也可能是小时少了13-14小时 Mysql的时区是CST(使用语句:show VARIABLES LIKE '%time_zone%'; 查) 先放总结: 修改方法: 1. 修改数据库时区 2. 在jdbc.url里加后缀 &serverTimezone=GMT%2B8 3. 代码里设置时区,给SimpleDateFormat.setTimeZone(...) 例外:new Date() 可以直接存为正确时间,其他

  • mybatis使用Integer类型查询可能出现的问题

    目录 使用Integer类型查询出现的问题 当state这个值为0的时候 mybatis判断Integer遇到的bug 场景产出 我是这样写的 使用Integer类型查询出现的问题 mapper.xml : <select id="count" parameterType="com.pinyu.system.web.page.Page" resultType="java.lang.Integer">         select co

  • @insert mybatis踩坑记录,实体接收前端传递的参数

    目录 @insert mybatis踩坑实体接收前端传递的参数 mybatis获取主键及参数传递的有关问题 获取主键值 不同的参数类型,${}和#{}的不同取值方式 @insert mybatis踩坑实体接收前端传递的参数 插入方法使用的使用entity实体对象进行接收的 @Insert(" insert into infor (name,pass,salary) values (#{infor.name},#{infor.pass},#{infor.salary})")     pu

  • PHP中的integer类型使用分析

    integer 可以已10进制,8进制,16进制表示. 用八进制表示的时候,数字需要已0(零)开头: 用十六进制表示的时候,数字需要已0x(零x)或者0X(零大写X)开头: integer 溢出: integer溢出的时候,会自动的转化为float类型.同样的,如果integer类型的操作结果溢出了integer类型的边界,也会自动转化为float类型. 需要注意的一点就是,integer类型没有"/" (除法)操作,如果需要获得一个整型可以使用round等函数,或者直接使用(int)

  • JAVA Integer类型自加实例详解

    JAVA语言中有一些基本数据类型,比如int,long,double... 这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符 Integer类型是一个对象类型,居然也可以支持++运算,那么问题来了 一个Integer对象执行++操作之后还是原来那个对象吗? 测试代码 public class IntegerTest { @Test public void test() { Integer a = 1; System.out.println(System.identityH

  • Java形参和实参的实例之Integer类型与Int类型用法说明

    经常会有这样一道面试题,有两个整形变量分别是a = 1 ,b = 2.编写一个方法swap互换他们的值. 
class
 
Main
 
{


 
public
 
static
 
void
 main
(
String
[]
 args
)
 
{


 
Integer
 a 
=
 
1
;


 
Integer
 b 
=
 
2
;


 
System
.
out
.
println
(
"a="
 
+
 a 
+
 
",b="
 
+
 b


随机推荐