Java Web项目中,如果是用的SQL语句查询,一般的话,会拼接SQL语句,而在拼接的过程中,必须要非常小心仔细。如果拼接时,少一个符号或多一个符号,将会影响查询语句执行的结果,“一符号影响大局”,今天总算领教到了。
前几天,我写了一个查询方法,是用SQL查询方式。由于查询条件比较多,SQL语句相对来说就比较长了,我在拼接的过程中,是按照数据库人员提供的SQL语句进行拼接的,并且在参数引入的地方加上了单引号,就是由于这个,导致后面出现问题。今天,我仔细检查页面,发现查询出的日期格式跟我所想要的日期格式不一致,需要的日期格式:20131012--20131212,而页面展示的结果只取了这个字符串的第一个字符,也就是“2”。
接着,我反复检查,执行DAO的Test,结果显示SQL语句查询出来的结果是正确的,日期格式也是想要的,但是在页面显示的却是“2”。后来,在Dao实现中打断点,启动debug模式,进行调试,发现在遍历查询的list日期对象结果是“2”。这就奇怪了,为什么SQL语句查询出来的日期格式是规范的,而list返回的结果却是有问题的,这到底是怎么回事?问题到底出在哪儿?
后来,经过反复地调试检查,在数据库开发人员的帮助下,终于找到了原因:拼接时多了两对单引号。
拼接时参数带单引号:
StringBuffer sb = new StringBuffer(); sb.append("select stu_num,"); sb.append("t.statis_date "); if(StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) { sb.append("from (select ‘") .append(startDate) .append("‘ || ‘--‘ || ‘") .append(endDate) .append("‘ statis_date,"); ...... ...... }
这个查询出来的的日期格式是:2
拼接时参数不带单引号:
StringBuffer sb = new StringBuffer(); sb.append("select stu_num,"); sb.append("t.statis_date "); if(StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) { sb.append("from (select ") .append(startDate) .append(" || ‘--‘ || ") .append(endDate) .append(" statis_date,"); ...... ...... }
这个查询出来的日期格式是:20131012--20131128
这一个小小的符号,导致多大的问题,总结起来,还是由于自己的不细心,不喜欢动脑子,才会导致这种低级错误。