JDBC模板更新查询错误

时间:2015-10-07 05:15:42

标签: java mysql spring-mvc jdbc

我正在尝试使用Spring中的jdbc模板更新查询更新mysql DB

我的查询

String query = "update request set regions=?, requesttype=?, requestorigin=?, lineofbusiness=?, destinationenvironment=?, release=?, workrequest=?,"
                    + " spmid=?, requestingteam=? where requestid="+request.getRequestId()+";"; 
            System.out.println(query);
            Object[] params = {request.getRegions(), request.getRequestType(), request.getRequestOrigin(),
                    request.getLineOfBusiness(),
                    request.getDestinationEnvironment(),
                    request.getReleaseValue(), request.getWorkRequest(),
                    request.getSpmId(), request.getRequestingTeam()
                     };
            int[] types = { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,
                    Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,
                    Types.VARCHAR };
            return jdbcTemplate.update(query, params, types);  

当我运行此查询时,它显示Mysql Grammar错误。我无法找到 哪里出错了。

堆栈跟踪

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/TDM] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [update request set regions=?, requesttype=?, requestorigin=?, lineofbusiness=?, destinationenvironment=?, release=?, workrequest=?, spmid=?, requestingteam=? where requestid=319;]; nested exception is com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'release='Search and Load', workrequest='zxZ', spmid='zxXZxZ', requestingteam='Se' at line 1] with root cause
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'release='Search and Load', workrequest='zxZ', spmid='zxXZxZ', requestingteam='Se' at line 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:873)
    at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:866)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:866)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:927)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:932)
    at org.verizon.tdm.dao.impl.RequestDaoImpl.updateRequest(RequestDaoImpl.java:62)
    at org.verizon.tdm.service.impl.RequestServiceImpl.updateRequestDetails(RequestServiceImpl.java:27)
    at org.verizon.tdm.controller.RequestDetailsController.saveRequestAjaxPage(RequestDetailsController.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)  

我的架构

***Field    Type    Null    Key Default Extra***
requestid   int(11) NO  PRI NULL    auto_increment
regions varchar(250)    YES     NULL    
requesttype varchar(95) YES     NULL    
requestorigin   varchar(25) YES     NULL    
lineofbusiness  varchar(250)    YES     NULL    
destinationenvironment  varchar(250)    YES     NULL    
release varchar(250)    YES     NULL    
workrequest varchar(250)    YES     NULL    
spmid   varchar(250)    YES     NULL    
requestingteam  varchar(250)    YES     NULL    
datapoints  varchar(500)    YES     NULL    
status  enum('SUBMITTED','SERVICED','DRAFT','INPROGRESS','FAILED')  YES     NULL    

4 个答案:

答案 0 :(得分:2)

基于此错误消息:

  

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在' release =' Search and Load',workrequest =' zxZ',spmid ='附近使用正确的语法; zxXZxZ',requesteam =' Se'在第1行

问题似乎与release列有关。 你确定这个专栏存在吗? (正确拼写,在名称中更正大小写。)

<强>更新

事实证明,release是MySQL中的关键字。 你需要使用反引号引用该字段,如下所示:

String query = "update request set regions=?, `release`=?, workrequest=?,"

与您的问题无关, 但就像你注入值设置?参数,对条件中的request.getRequestId()执行相同操作,而不是字符串连接。这样它将以类型安全的方式注入。

也就是说,SQL字符串的结尾应该如下所示:

... where requestid= ?

并在参数中添加request.getRequestId(),就像您在paramstypes中设置的其他值一样。

答案 1 :(得分:2)

检查是否通过引号,是否解决了问题?

"update `request` set `regions`=?, `requesttype`=?, `requestorigin`=?, `lineofbusiness`=?, `destinationenvironment`=?, `release`=?, `workrequest`=?,"
                    + " `spmid`=?, `requestingteam`=? where `requestid`="

答案 2 :(得分:0)

为什么不在查询中参数化requestId?假设requestId的类型为INTEGER,则可以将代码重写为:

String query = "update request set regions=?, requesttype=?, requestorigin=?, lineofbusiness=?, destinationenvironment=?, release=?, workrequest=?,"
                    + " spmid=?, requestingteam=? where requestid=?"; 
System.out.println(query);
Object[] params = {request.getRegions(), request.getRequestType(), request.getRequestOrigin(),
        request.getLineOfBusiness(),
        request.getDestinationEnvironment(),
        request.getReleaseValue(), request.getWorkRequest(),
        request.getSpmId(), request.getRequestingTeam(),
         request.getRequestId()};
int[] types = { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,
        Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,
        Types.VARCHAR, Types.INTEGER };
return jdbcTemplate.update(query, params, types);  

请告诉我这是否适合您。

答案 3 :(得分:0)

request.getSpmId(), request.getRequestingTeam(), 

您在Object数组的末尾放置一个逗号。