好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

使用Integer类型查询出现的问题

mapper.xml :

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

< select id = "count" parameterType = "com.pinyu.system.web.page.Page" resultType = "java.lang.Integer" >

         select count(m.id) from hr_push_msg_model as m

         < where >

             < if test = "page.keyword != null and page.keyword != ''" >

                 m.text like '%${page.keyword}%'

             </ if >

             < if test = "page.entity != null" >

                 < if test = "page.entity.text != null and page.entity.text != ''" >

                     and  m.text like '%${page.entity.text}%'

                 </ if >

                 < if test = "page.entity.title != null and page.entity.title != ''" >

                     and  m.title like '%${page.entity.title}%'

                 </ if >

                 < if test = "page.entity.state != null and page.entity.state != ''" >

                     and  m.state = #{page.entity.state}

                 </ if >

                 < if test = "page.entity.type != null and page.entity.type != ''" >

                     and  m.type = #{page.entity.type}

                 </ if >

             </ if >

         </ where >

     </ select >

比如:

?

1

2

3

< if test = "page.entity.state != null and page.entity.state != ''" >

                    and  m.state = #{page.entity.state}

                </ if >

当state这个值为0的时候

mybatis为默认为空字符串"",所以如果状态这种类似的场景有0值得,查询就不要加上xxxx!=""这种。或者or xxx==0

代码示例:

1、

?

1

2

3

< if test = "page.entity.state != null" >

      and  m.state = #{page.entity.state}

</ if >

2、

?

1

2

3

< if test = "page.entity.state != null and page.entity.state != '' or page.entity.state==0" >

    and  m.state = #{page.entity.state}

</ if >

mybatis判断Integer遇到的bug

场景产出

需要查出状态为0的所有用户

我是这样写的

1.mapper:

?

1

BaseUser selectUserByStatus( @parm ( "status" ) Integer status);

这里传了0进去

2.sql:

?

1

SELECT * FROM base_user WHERE status=0

3.xml片段

?

1

2

3

< if test = "status != null and status != ''" >

    status = #{status},

</ if >

4.结果真正执行的sql

?

1

SELECT * FROM base_user

小结一下:

test="status != null and status != ''"这个是拿来判断String的!!!也就是说Double,BigDecimal等数字类型也会出现这样的情况

1.如果是Integer类型的话,如果变量的值是0,即 num = 0, mybatis在进行 num != '' " 的时候会认为  num 的值是空字符串;直接跳过判断了

所以如果是Integer类型只需要判断 != null 即可

2.如果String类型需要判断不等于0,则需要写name != '0'.toString(),否则会报错。

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

原文链接:https://blog.csdn.net/ypp91zr/article/details/84581161

查看更多关于mybatis使用Integer类型查询可能出现的问题的详细内容...

  阅读:20次