Java 使用语句时出现MySQL错误。返回\u生成的\u键
我继承了一个旧的Servlet/JSP网站,该网站已更新为Java1.8.0\u201和MySQL 5.7.28。最近,在向数据库添加新记录时,我开始出现以下错误: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
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);