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);
}
答案是不成立的,看结果:
等式中的sql没有被执行。
原因是,java是强转型的,在比较中,等式两边的字段类型,要调整成一样的才能匹配,这里的‘2’,被认为是字符类型,但是你传的type是数值类型,所以不能匹配,java这时会给你做强转,字符‘2’,呗转成了,ascii码值(字符的比较,就是ascii的比较)。这里看了下‘2’的ascii的值是50,所以最后表达式变成了 2== 50,所以等式不会成立的,这时如果type传值50等式就会成立。
拓展1
<if test="type == '22'">
如果type,同样传数值类型,值为22,等式会不成立嘞。
先换一个
<if test="type == 22">
这样会不会成立呢,答案肯定是的。因为第二个中的 22 明确是数值类型,答案可定是成立的。
但是第一个‘22’是类型暂时还不固定,他是根据等式左边传过来的参数确定类型的,前面穿过来的是数字,这是,等式右边会转成数字类型的,答案也是一样,也是成立的。
那如果,type是字符串呢,答案也是成立的,因为后面会转成字符串类型进行比较。
拓展2
像第一个例子中,如果type传一个字符串“50”, 等式也是成立的,java强转之后,ascll值转成了字符串“50”
拓展3
虽然,java会帮我们强转,但是也不是所有都能转的,比如说:
<if test="type == 'aa'">
type传过来一个数值类型,上面‘aa’由于强转 就会报异常:
问题
我也是看到这些情况,做了些总结,但是目前还不知道,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);
}
总结
大家可能平时写代码,也遇不到上面的问题,只要按规则写,数值就是数值比较,字符串就是字符串比较,尽量少强转,避免上述问题。但是既然遇到了,还是做个记录吧,避免以后万一有人问了,不想说不知道,嘿嘿,拜拜!!