首页 > 其他 > 详细

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

时间:2016-09-03 16:35:28      阅读:183      评论:0      收藏:0      [点我收藏+]
做项目的时候发现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

原文:http://www.cnblogs.com/adayday/p/5837168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!