JDBC在精确查询时对字符串型参数的校验处理

       今天遇到这样一个问题:用hibernate进行精确匹配查询的时候,一直出错。把查询参数去掉一个字符,即能顺利通过。刚开始还以为是hibernate在进行sql转换的的时候对匹配字段的参数进行校验,因为实体配置文件中该字段长度声明为10,而查询参数的长度刚好为11。但修改过配置文件以后问题依然存在,看了hibernate并没有去做这些参数的校验,那么问题会不会出现在jdbc上呢?想到这里便顺手些了下测试代码,发现问题确实是出现在JDBC上的。

   

      

PreparedStatement prsm = co.prepareStatement("select * from user where name= ?");
    	prsm.setString(1, name);
	prsm.executeQuery();

 数据库中name对应的字段长度定义为10,而参数中name的长度为11,这样执行查询的时候就会报类型不对匹配的问题,但是如果这些写

    

PreparedStatement prsm = co.prepareStatement("select * from user where name= '"+name+"'");
    	//prsm.setString(1, name);
	prsm.executeQuery();

 就能顺利通过。下面的亦能通过

PreparedStatement prsm = co.prepareStatement("select * from user where name like ?");
   	prsm.setString(1, name);
	prsm.executeQuery();

 

 

    (以上只对DB2数据库做了测试,其他的没有测试)

 

总结:在进行精确匹配查询的时候,一定要注意参数的长度,最好不要超过数据库对该字段的设定长度,如果底层方法包装的是PreparedStatement ,并且用setString进行参数填充的话,那么系统将抛出异样!但是如果是拼装sql,然后在执行,就不存在这样的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值