我正在使用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;
}
答案 0 :(得分:1)
Connection
和PreparedStatement
(和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规范。