我对 Java 中的准备好的语句有问题 - Mysql 8.0 [重复]

Posted

技术标签:

【中文标题】我对 Java 中的准备好的语句有问题 - Mysql 8.0 [重复]【英文标题】:I have a problem with the prepared statement in Java - Mysql 8.0 [duplicate] 【发布时间】:2019-09-17 13:51:44 【问题描述】:

我正在处理准备好的语句查询,但查询语法有错误(如我的控制台中所示):

java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以了解在 '? 附近使用的正确语法。 , ? , ? )' 在第 1 行

我不知道它有什么问题。 注意:上面的查询在 mysql 上工作(测试),我刚刚更改了 Java 中的 VALUES 。

connection = DataSource.getConnection();

String insertGame = " insert into games (game_name , game_genre , game_year ) values ( ? , ? , ? ) ";
statment = connection.prepareStatement(insertGame);
statment.setString(1, game.getName());
statment.setString(2, game.getGenre());
statment.setInt(3, game.getYear());
statment.executeUpdate(insertGame);

【问题讨论】:

删除尾随; 【参考方案1】:

错误是您使用父类的Statement.executeUpdate(String) 而不是PreparedStatement.executeUpdate()

分号作为语句分隔符不属于提供给 JDBC 的单个语句。

    String insertGame = "insert into games (game_name, game_genre, game_year) "
        + "values (?, ?, ?)";
    try (PreparedStatement statment = connection.prepareStatement(insertGame)) 
        statment.setString(1, game.getName());
        statment.setString(2, game.getGenre());
        statment.setInt(3, game.getYear());
        statment.executeUpdate();
    

对于其余的关闭语句,就像使用资源尝试一样,很重要。 当因重复游戏名称而引发 SQLException 时,上述内容也将关闭 statment

【讨论】:

感谢您的回答。我试过删除分号,但我仍然有同样的错误。对于 try-catch 块,我的代码有它......但我只复制了我的问题中的查询部分。 对不起,我重读了错误,它告诉了我们真相。更正了答案。它传递没有? 替换的SQL 字符串,因此使用Statement.executeUpdate,使用executeUpdate()这实际上是一个常见的错误;糟糕的 API。

以上是关于我对 Java 中的准备好的语句有问题 - Mysql 8.0 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java sql char 准备好的语句

我可以重新定义相同的准备好的语句吗?

在 Java 中将动态 SQL 查询转换为准备好的语句

java.sql.SQLSyntaxErrorException-ORA-01722:无效数字 - 准备好的语句

准备好的语句以及连接池

mysql性能中的PDO