`
gufenglian
  • 浏览: 51275 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

关于模糊查询和预编译一个很容易出错的地方

阅读更多

前两天,上面叫我改一下一个查询的sql语句,改成模糊查询。觉得这个非常简单,于是在mysql中查询之后,看到数据正常,就直接写到代码里面去了,没有测试直接交了上去。今天部门老大突然给我发了一个异常过来,刚刚开始怀疑部门老大发错地方了,结果才发现原来就是自己错了。感觉很没面子,这么点小东西都没做好,刚刚开始还不知道问题出在哪里,怎么看都像是对的,在网上查阅之后发现真的很容易出错,所以贴出来,希望以后不要遇到同样的事情,然后不管多简单的东西,记得测试之后再交上去。

 

 

在mysql中的测试语句:select serviceCode from smsconfiginfo where configName like '%aa%'

这样肯定是没问题的。

用预编译PreparedStatement,直接把语句改成了

stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%?%')

然后stmt.setString(1,serviceNameKeyword);

是否貌似没什么问题。

 

当查询的时候发现抛这样一个异常:

  java.sql.SQLException: No parameters defined during prepareCall()
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
        at com.mysql.jdbc.ServerPreparedStatement.getBinding(ServerPreparedStatement.java:751)
        at com.mysql.jdbc.ServerPreparedStatement.setString(ServerPreparedStatement.java:1857)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:131)
        at org.apache.jsp.stat.statSmsMainProcessInclude_jsp._jspService(statSmsMainProcessInclude_jsp.java:195)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)
        at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:966)
        at org.apache.jsp.stat.smsYuanjing_jsp._jspService(smsYuanjing_jsp.java:59)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)

 

 

刚刚开始找到问题的根源,只知道自己只改了那一点代码于是先把

stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%?%')

这个改为

stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%aa%')

屏蔽掉设置参数,发现异常没有了

问题肯定就出在这个问号上,但是想象设置参数不就是用问号吗

仔细观察,发现这里把问号当成了条件,而不是参数的设置

这样

stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%'?'%')

就可以了。

 

别小看字符串的问题,越容易的东西越容易出错。

分享到:
评论
9 楼 huanghuangjava 2016-08-13  
'%'?'%'
我的这样写查询不到结果
'%' ? '%'把?两边加上空格就正常了
8 楼 colinzhy 2012-05-14  
我的也查不出东西,不过'%'?'%'改成'%'||?||'%'之后就行了
7 楼 BelieveTheGod 2010-01-15  
虚心学习 , 我也遇到这问题了 谢谢 大家
6 楼 hilor 2009-12-31  
gufenglian 写道
liweixw 写道
stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%?%')

改成
stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like ?)
stmt.setString(1,"%"+serviceNameKeyword+"%");

这样不优雅点。  呵呵。。

理解下预编译语句区别就知道你犯这错误的原因了、。



呵呵,谢谢了,有时就是脑子转不过弯,谢谢分享。

建议把博客原文的写法改下,最好把你自己的代码也改成这样的. stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like ?)
stmt.setString(1,"%"+serviceNameKeyword+"%");是标准写法, 以免后来者误解
5 楼 gufenglian 2009-10-30  
liweixw 写道
stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%?%')

改成
stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like ?)
stmt.setString(1,"%"+serviceNameKeyword+"%");

这样不优雅点。  呵呵。。

理解下预编译语句区别就知道你犯这错误的原因了、。



呵呵,谢谢了,有时就是脑子转不过弯,谢谢分享。
4 楼 liweixw 2009-10-29  
stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like '%?%')

改成
stmt = con.prepareStatement(select serviceCode from smsconfiginfo where configName like ?)
stmt.setString(1,"%"+serviceNameKeyword+"%");

这样不优雅点。  呵呵。。

理解下预编译语句区别就知道你犯这错误的原因了、。

3 楼 gufenglian 2009-07-13  
ranLoD 写道
错误没了。。也查不出东西了吧?

怎么会查不出东西呢?
我这个是解决问题之后才写的博客。你可以说说具体情况
2 楼 ranLoD 2009-07-11  
错误没了。。也查不出东西了吧?
1 楼 ranLoD 2009-07-10  
恩,谢谢MM,今天我也遇到这个问题了呢

相关推荐

    C的缺陷和陷进

    然而,位操作也使得代码变得更加难以阅读和维护,尤其是在复杂的位操作中容易出错。 由于这些缺陷,程序员在使用C语言时必须格外小心,以避免常见的编程错误。《C的缺陷和陷进》这本书正是帮助读者识别和避免这些...

    15个Java编程好习惯

    条件语句是编程中最常见的结构之一,但也是最容易出错的地方,尤其是混淆赋值运算符(=)与相等运算符(==)。采用逆序书写条件语句的方法,如`if (10 == i)`而非`if (i == 10)`,可以在一定程度上避免这类错误,因为...

    非计算机专业《C语言程序设计》课程教学问题的分析与探讨.pdf

    此外,C语言中变量类型和运算符的使用灵活性,若学生对规则理解不透彻,很容易导致程序出错。例如,在使用除号运算时,整数除法和浮点数除法的结果完全不同。为解决这些问题,教师应培养学生的良好程序设计风格,并...

    精易模块[源码] V5.15

    4、新增“窗口_是否被遮挡”,判断一个窗口是否被置顶窗口遮挡,代码由易友【@shituo】提供。 5、改善“汇编类->置入汇编代码”增添一个参数是否保留以前代码。感谢易友【@无名侠】反馈。 6、修正“文本_加密”返回...

Global site tag (gtag.js) - Google Analytics