动态查询的传参测试,关于#和$在Integer下传0..o(^▽^)o
Posted adayday
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态查询的传参测试,关于#和$在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的主要内容,如果未能解决你的问题,请参考以下文章