mybatis_if_中字段类型的强转

demo

举个例子,你认为下面的代码中,如果type传过来的是数值2,等式是成立的还是不成立的?

<if test="type == '2'">

详情代码如下:
xml:

<select id="selectByUserNameTest" resultMap="BaseResultMap">
  SELECT * FROM `sys_user`
  WHERE is_delete = 0
  <if test="type == '2'">
    and is_delete = 1
  </if>
</select>

mapper:

 SysUser selectByUserNameTest(Integer type); 

test:

@Test
    public void ssss() {
    
    

    getAscii('2');
    sysUserMapper.selectByUserNameTest(2);
    System.out.println(1);
}

答案是不成立的,看结果:
image.png
等式中的sql没有被执行。
原因是,java是强转型的,在比较中,等式两边的字段类型,要调整成一样的才能匹配,这里的‘2’,被认为是字符类型,但是你传的type是数值类型,所以不能匹配,java这时会给你做强转,字符‘2’,呗转成了,ascii码值(字符的比较,就是ascii的比较)。这里看了下‘2’的ascii的值是50,所以最后表达式变成了 2== 50,所以等式不会成立的,这时如果type传值50等式就会成立。
image.png

拓展1

<if test="type == '22'">

如果type,同样传数值类型,值为22,等式会不成立嘞。
先换一个

<if test="type == 22">

这样会不会成立呢,答案肯定是的。因为第二个中的 22 明确是数值类型,答案可定是成立的。
但是第一个‘22’是类型暂时还不固定,他是根据等式左边传过来的参数确定类型的,前面穿过来的是数字,这是,等式右边会转成数字类型的,答案也是一样,也是成立的。
那如果,type是字符串呢,答案也是成立的,因为后面会转成字符串类型进行比较。

拓展2

像第一个例子中,如果type传一个字符串“50”, 等式也是成立的,java强转之后,ascll值转成了字符串“50”
image.png
image.png

拓展3

虽然,java会帮我们强转,但是也不是所有都能转的,比如说:

<if test="type == 'aa'">

type传过来一个数值类型,上面‘aa’由于强转 就会报异常:
image.png

问题

我也是看到这些情况,做了些总结,但是目前还不知道,java在mybatis中强转的规则。对上面的例子,还有一点不是很清楚,mybaitis中,明明是根据参数做强转的,但是为什么,demo中的字符‘2’,没有被强转成字符串或者数字呢,可能是只要出现字符就会看作为ascll的比较吧,这也是我的猜想。希望大神为我指点迷津。感谢感谢。

工具

java字符转ascii值代码

 private void getAscii(char ch) {
    
    
        int asciiValue = (int) ch;
        System.out.println("ASCII value of " + ch + " is: " + asciiValue);
    }

总结

大家可能平时写代码,也遇不到上面的问题,只要按规则写,数值就是数值比较,字符串就是字符串比较,尽量少强转,避免上述问题。但是既然遇到了,还是做个记录吧,避免以后万一有人问了,不想说不知道,嘿嘿,拜拜!!

猜你喜欢

转载自blog.csdn.net/weixin_40741732/article/details/132235058
今日推荐