【问题标题】:JDBC template update query errorJDBC模板更新查询错误
【发布时间】:2016-01-04 05:12:23
【问题描述】:

我正在尝试在 Spring 中使用 jdbc 模板更新查询来更新 mysql 数据库

我的查询

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    

【问题讨论】:

  • 答:我不太擅长DB..其实列release是Mysql里的一个关键字..所以才抛出异常..:)

标签: java mysql spring-mvc jdbc


【解决方案1】:

基于此错误消息:

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

问题似乎出在release 列上。 您确定该列存在吗? (正确的拼写,正确的名称中的大写/小写。)

更新

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

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

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

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

... where requestid= ?

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嘿,它会起作用 :) 但我很抱歉我不能接受两个答案.. 无论如何,实际原因是由于使用关键字作为列名
    • 没问题,你可以投票赞成答案:)。很好,你已经解决了你的问题。 :)
    【解决方案3】:

    为什么不在查询中参数化 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);  
    

    让我知道这是否适合你。

    【讨论】:

      【解决方案4】:
      request.getSpmId(), request.getRequestingTeam(), 
      

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

      【讨论】:

      • 不,我在 request.getRequestingTeam() 之后还要添加一个元素
      • 但您已经为 9 个占位符提供了 9 个值。我说的对吗?
      • 这是一个很好的捕获.. 但这不是问题.. 我已经根据 janos 的建议更新了我的代码.. 仍然抛出异常
      • 是的,我知道它删除了连接的双引号分号“;”最后在查询中,然后尝试一下。
      • 你试过update(String query,Object[] params)版本吗?
      猜你喜欢
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多