2015-10-07 76 views
1

我试图更新MySQL数据库使用JDBC模板更新查询春季JDBC模板更新查询错误

我的查询

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的语法错误。我无法找到
我错了。

堆栈跟踪

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  
+0

答: 我不是在DB很好..其实列版本是MySQL中的关键字..这就是为什么它被抛出的异常.. :) – Mahi

回答

2

基于此错误消息:

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

该问题似乎与release列有关。 你确定该列存在吗? (正确拼写,在名称正确/小写)

UPDATE

事实证明,release是MySQL中的关键字。 您需要引用使用反引号的那场,就像这样:

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

不相关的问题, 但就像你注入到设定值是多少?参数,在条件中为request.getRequestId()执行相同的操作,而不是字符串连接。这样它将以安全的方式注入。

也就是说,SQL字符串的结尾应该是这样的:

... where requestid= ? 

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

2

检查是否加引号,解决问题吗?

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

嘿它会工作:),但很抱歉,我不能接受两个答案..反正实际的原因是由于使用关键字作为列名 – Mahi

+0

没问题,你可以upvote答案:)。很好,你已经解决了你的问题。 :) –

0

为什么你还没有参数化查询中的requestId?假设的requestId为整数类型,代码可以被重新写入此:

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); 

让我知道这对你的作品。

+0

仍然我得到相同的错误 – Mahi

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

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

+0

不,我有一个元素添加request.getRequestingTeam() – Mahi

+0

后,但你已经给9个值9个占位符。我对吗? – jcool

+0

多数民众赞成在一个很好的..但这不是一个问题..我已经更新我的代码基于janos的建议..仍然会抛出异常 – Mahi