尝试执行PreparedStatement时出现MySQLSyntaxErrorException

时间:2013-09-08 04:44:14

标签: java mysql jdbc

我尝试使用JDBC使用以下方法使用PreparedStatement插入userId(int)和userName(String):

public boolean saveUser(int userId, String userName){
    boolean saveStatus = false;
    try {
        connection.setAutoCommit(true);
        String sql = "insert into testtable values(?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, userId);
        statement.setString(2, userName);
        saveStatus  = statement.execute(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{
        Connector.closeConnections();
    }
    return saveStatus;
}

我得到以下stacktrace:

com.mysql.jdbc.exceptions.jdbc4.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 '?,?)' at line 1

我做错了什么?

2 个答案:

答案 0 :(得分:13)

试试这个应该有效:

    try {
        connection.setAutoCommit(true);
        String sql = "insert into testtable values(?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, userId);
        statement.setString(2, userName);
        saveStatus  = statement.execute();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return saveStatus;
}

PreparedStatement是预编译语句。你不必在执行时提供sql字符串。

答案 1 :(得分:5)

您的代码存在根本性错误。

创建PreparedStatement后,我们需要调用preparedStatement.executeUpdate();而不再传递SQL

以下是您问题的完整代码。

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;


public class SampleMysql {

    public static Connection getConnection() throws SQLException {
        Driver drv = new com.mysql.jdbc.Driver();
        DriverManager.registerDriver(drv);
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample","sample", "sample");
        return con;
    }

    public static int saveUser(int userId, String userName){
        int saveStatus = 0;
        Connection connection = null;
        try {
            connection = getConnection();
            connection.setAutoCommit(true);
            String sql = "INSERT INTO testtable VALUES(?,?)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, userId);
            preparedStatement.setString(2, userName);
            saveStatus  = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {

                    e.printStackTrace();
                }
            }
        }
        return saveStatus;
    }

    public static void main(String[] a) {
        System.out.println(saveUser(1, "sample"));
    }
}

表格脚本如下。

CREATE TABLE testtable(user_ID INT(10), user_name VARCHAR(10));