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

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

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

如果这样我的provId=0是传不进去的,当然用${provId}和#{provId}一样:
SELECT * FROM app_home_custwhere  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_custwhere  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_custwhere  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_custwhere  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即可。

好了,差不多就这样一会下班打游戏去了。。
时间: 2024-09-29 11:16:13