有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVAMySQL在JDBC准备的语句中抛出错误?

我有一个数据库和一个Java程序,我想从中(通过JavaFX中的GUI)将记录到数据库中。我多次尝试执行insert into查询,但错误仍然出现-您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在“?,?,?)”附近使用的正确语法在第1行。代码如下:

  Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("*The connection string is deliberetely omitted*");
    System.out.println("Connection established");
    String query  = "INSERT INTO User(Name,Username,PassWord) VALUES(?,?,?)";
    PreparedStatement insertUser = conn.prepareStatement(query);
    insertUser.setString(1,MOLCreate.fieldUsername);
    insertUser.setString(2,MOLCreate.fieldUsername);
    insertUser.setString(3,MOLCreate.fieldPassword);
    //insertUser = conn.prepareStatement(query);
    insertUser.executeUpdate(query);
    conn.close();

我用相应的值替换了参数?,而且数据库行与查询中的行相同。问题出在哪里


共 (2) 个答案

  1. # 1 楼答案

    这里的关键是错误 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 '?,?,?)'

    这意味着对mysql的实际查询包含?,而不是预期的字符串

    问题出在{}

    query作为参数传递给executeUpdate()执行原始查询字符串。根据javadocs,不应该为PreparedStatement调用此方法。执行PreparedStatement的正确方法是使用

    insertUser.executeUpdate();
    

    参考:

    https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String)

    https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#executeUpdate()

    此外,还需要关闭PreparedStatement,因为它们可能会导致内存泄漏

  2. # 2 楼答案

    让我们试试-

            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("*The connection string is 
            deliberetely omitted*");
    
            **conn.setAutoCommit(false);**//Auto commit false
            System.out.println("Connection established");
            String query  = "INSERT INTO User(Name,Username,PassWord) VALUES(?,?,?)";
            PreparedStatement insertUser = conn.prepareStatement(query);
            insertUser.setString(1,MOLCreate.fieldUsername);
            insertUser.setString(2,MOLCreate.fieldUsername);
            insertUser.setString(3,MOLCreate.fieldPassword);
            //insertUser = conn.prepareStatement(query);
            int check=insertUser.executeUpdate(query);
            System.out.println("Check the data  inserted or not ::" + check);
            **conn.commit(); /**/
            conn.close();**strong text**