无法使用INSERT查询为SELECT发出executeUpdate()

时间:2016-02-02 04:12:53

标签: java mysql

我正在使用PreparedStatement而不是MySQL准备一个简单的INSERT查询。我理解 execute(),int executeUpdate和ResultSet executeQuery()方法之间的用法和区别。 我在我的INSERT查询中使用了executeUpdate(),执行时,应该返回受影响的行数,如下所示:

public boolean registerStudent()throws SQLException{
    int i = 0;
    boolean flag = false;
    try{
        String query = "INSERT INTO userinfo (`name`,`email`,`qualification`,`password`,`centre`,`registrationTime`,`registrationNumber`) VALUES (?,?,?,?,?,now(),?)";
         pstmt = cn.prepareStatement(query);
         pstmt.setString(1,getStudentname());
         pstmt.setString(2,getEmail());
         pstmt.setString(3,getQualification());
         pstmt.setString(4,getPassword());
         pstmt.setString(5,getCentre());
         pstmt.setInt(6, getRegistrationCount());
         i = pstmt.executeUpdate();
         if(i==1){
             flag = true;
             return flag;
         }
    }
    catch(Exception e){
        e.printStackTrace();
    }
    return flag;
}

但是,我得到了这个SQLException:

java.sql.SQLException: Can not issue executeUpdate() for SELECTs

即使我没有使用任何SELECT查询而是使用INSERT!

我还有其他错误吗?因为我的程序似乎运行正常。

这是我在单独的java类中编写的jdbc连接代码:

public class DBConnection {
static Connection cn;
public static Connection getConnection()throws SQLException, IOException{
    try{
        Class.forName("com.mysql.jdbc.Driver");
        cn = DriverManager.getConnection("jdbc:mysql://localhost/sampleapp", "root", "");
    }
    catch(Exception e){
        e.printStackTrace();
    }
    return cn;
}

2 个答案:

答案 0 :(得分:1)

ConnectionPreparedStatement(和ResultSet)变量都应该是本地变量,而不是静态变量或实例类成员。你遇到了一个线程安全问题。

答案 1 :(得分:-1)

无法在PreparedStatement或CallableStatement上调用executeUpdate方法。

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

编辑:我错过了你使用不带参数的执行更新(),这应该可以工作,但请注意,并非每个JDBC驱动程序都符合Java JDBC规范。