首页 > 代码库 > 动态查询的传参测试,关于#和$在Integer下传0..o(^▽^)o

动态查询的传参测试,关于#和$在Integer下传0..o(^▽^)o

做项目的时候发现mapper中的小问题于是我做了:

/**int全部为Integer类型*/
关于mybatis中的动态查询语句的小测试:

如果这样我的provId=0是传不进去的,当然用${provId}和#{provId}一样:
SELECT * FROM app_home_cust
where 1=1
<if test="provId != null and provId != ‘‘">
AND prov_id = ${provId}
</if>
执行的sql
[14:24:04 985 DEBUG] ==>  Preparing: SELECT * FROM app_home_cust where 1=1

当provId=1的时候是可以传进去的:
SELECT * FROM app_home_cust
where 1=1
<if test="provId != null and provId != ‘‘">
AND prov_id = #{provId}
</if>
运行的结果
[14:43:50 533 DEBUG] ==>  Preparing: SELECT * FROM app_home_cust where 1=1 AND prov_id = ?
[14:43:50 556 DEBUG] ==> Parameters: 1(Integer)

SELECT * FROM app_home_cust
where 1=1
<if test="provId != null and provId != ‘‘">
  AND prov_id = ${provId}
</if>
运行的结果:
[14:40:40 088 DEBUG] ==>  Preparing: SELECT * FROM app_home_cust where 1=1 AND prov_id = 1
[14:40:40 130 DEBUG] ==> Parameters:

首先我们知道#传字符串就是‘aaaa‘这样的而$符号就变成了aaaa,$符号直接在后面接值不会管类型。建议除了int使用$其余的最好使用#。

我们的问题是为什么0传不进来:Integer不是字符串,进行测试判断。

测试代码:
SELECT * FROM app_home_cust
where 1=1
<if test="provId != null">
AND prov_id = #{provId}
</if>

测试结果:
[15:09:09 684 DEBUG] ==>  Preparing: SELECT * FROM app_home_cust where 1=1 AND prov_id = ?
[15:09:09 723 DEBUG] ==> Parameters: 0(Integer)

测试发现是provId != ‘‘在provId为0的时候判断成立
正常来说,0不为空也不是空字符串,在数据库中也是查询条件。
因此我建议:如果类型为Integer类型,就去掉 !=‘‘的判断,只判断!=null即可。

好了,差不多就这样一会下班打游戏去了。。

动态查询的传参测试,关于#和$在Integer下传0..o(^▽^)o