Java 使用语句时出现MySQL错误。返回\u生成的\u键

Java 使用语句时出现MySQL错误。返回\u生成的\u键,java,mysql,jsp,jdbc,myisam,Java,Mysql,Jsp,Jdbc,Myisam,我继承了一个旧的Servlet/JSP网站,该网站已更新为Java1.8.0\u201和MySQL 5.7.28。最近,在向数据库添加新记录时,我开始出现以下错误: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareSta

我继承了一个旧的Servlet/JSP网站,该网站已更新为Java1.8.0\u201和MySQL 5.7.28。最近,在向数据库添加新记录时,我开始出现以下错误:

Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().
我用谷歌搜索了一下发生了什么,发现我需要向我的Statement.executeUpdateQuery添加Statement.RETURN\u生成的\u键,所以我这样做了。然而,我仍然得到了错误。更新的代码,错误出现在语句
result=stmt.getGeneratedKeys()

但是,insert起作用,数据被放入数据库

然后我想我应该更新Mysql连接器库,所以我从版本5.4更新到了Mysql-Connector-java-8.0.18.jar。仍然得到相同的错误

我没有使用任何准备好的语句,只是使用一个字符串作为查询文本。这是查询字符串:

INSERT INTO Flights(rocket_name, weight, angle, baseline, egg_id, shockcord_id, notes, date, rocketModelID, mission_specialists, flight_engineers, teacher_id) VALUES ('asdfasdfasd', 98.0, 60.0, 60.0, 2, 2, 'sfdg sfdg sdg sfdg sdfg sfdg sfdg', '2020-01-07', 4,'asdfasdf', 'asdfasdfas', 13);
航班的表定义:

| Flights | CREATE TABLE `Flights` (
  `flight_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `teacher_id` int(11) NOT NULL DEFAULT '0',
  `egg_id` int(10) unsigned NOT NULL DEFAULT '0',
  `shockcord_id` int(10) unsigned NOT NULL DEFAULT '0',
  `rocket_name` varchar(100) NOT NULL DEFAULT '',
  `weight` decimal(10,4) unsigned NOT NULL DEFAULT '0.0000',
  `angle` decimal(10,5) NOT NULL DEFAULT '0.00000',
  `baseline` decimal(10,5) NOT NULL DEFAULT '0.00000',
  `date` date NOT NULL DEFAULT '0000-00-00',
  `rocketModelID` int(11) unsigned NOT NULL DEFAULT '0',
  `flight_engineers` varchar(100) NOT NULL DEFAULT '',
  `mission_specialists` varchar(100) NOT NULL DEFAULT '',
  `notes` text,
  PRIMARY KEY (`flight_id`),
  FULLTEXT KEY `search1` (`mission_specialists`),
  FULLTEXT KEY `search2` (`flight_engineers`),
  FULLTEXT KEY `search3` (`flight_engineers`,`mission_specialists`)
) ENGINE=MyISAM AUTO_INCREMENT=562 DEFAULT CHARSET=latin1 
我不知道如何进行。如有任何建议,将不胜感激


标记

建议按如下方式更改代码:

  • 命名键列

  • executeUpdate
    调用中获取行数

  • 如果未插入行,则不要调用
    getGeneratedKeys()

尽管如此,实际上,使用
值的单个
INSERT
语句总是只插入一行,因此完全不需要检查行数。如果未插入该行,则会引发异常,因此您的代码可能会缩减为:

stmt.executeUpdate(query, new String[] { "flight_id" });
try (ResultSet result = stmt.getGeneratedKeys()) {
    result.next();
    int autoIncKey = result.getInt(1);
    svr.setGeneratedKey(autoIncKey);
    obj.setGeneratedKey(autoIncKey);
}
svr.setRows(1);
svr.setSuccess(true);

表的定义是什么?什么列是AUTO_INCREMENT?我在原始帖子中添加了Flights表定义。“我没有使用任何准备好的语句”你真的应该这样做,因为插入的数据来自用户,否则你很容易受到SQL注入攻击和SQL语法错误。我同意关于准备好的语句的评论。然而,代码最初是在MySQL支持预处理语句之前编写的。需要进行一些重要的重写才能将它们添加进去。这是将来需要更改的,但现在我只需要修复此错误消息。java.sqlv8中没有stmt.executeUpdate(stringsql,stringcol\u name)。但是,有一个stmt.executeUpdate(字符串sql,字符串[]col\u name)。我用字符串[]{“flight_id”}尝试了一下,得到了相同的错误消息。发现带有我所做更改的war文件将要转到另一个测试服务器。一旦这个问题得到解决,这些变化就开始起作用了。谢谢你的帮助。
rows = stmt.executeUpdate(query, new String[] { "flight_id" });
int autoIncKey = -1;
if (rows > 0) {
    result = stmt.getGeneratedKeys();
    if (result.next()) {
        autoIncKey = result.getInt(1);
    }
}
svr.setGeneratedKey(autoIncKey);
obj.setGeneratedKey(autoIncKey);
svr.setRows(rows); //Insert/Update/Delete
svr.setSuccess(rows > 0);
stmt.executeUpdate(query, new String[] { "flight_id" });
try (ResultSet result = stmt.getGeneratedKeys()) {
    result.next();
    int autoIncKey = result.getInt(1);
    svr.setGeneratedKey(autoIncKey);
    obj.setGeneratedKey(autoIncKey);
}
svr.setRows(1);
svr.setSuccess(true);