首页 > 代码库 > 动态查询的传参测试,关于#和$在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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。