我有这个java方法:
public boolean insertAuthor(String userid, String password){
try{
String query1 = "INSERT INTO user (id, firstName, lastName, belonging, country) VALUES(?,?,?,?,?)";
PreparedStatement stmt = this.dbConn.prepareStatement(query1);
stmt.setInt(1,0);
stmt.setString(2,"default"); //Yes, it's correct with "default"
stmt.setString(3,"default");
stmt.setString(4,"default");
stmt.setString(5,"default");
//stmt.executeUpdate();
stmt.executeUpdate(query1, PreparedStatement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
int key=0;
if ( rs.next() ) {
key = rs.getInt(1);
}
String query2 = "INSERT INTO authentication (id, address, password, user_id, login_id) VALUES(?,?,?,?,?)";
stmt = this.dbConn.prepareStatement(query2);
stmt.setInt(1,0);
stmt.setString(2,"default");
stmt.setString(2,password);
stmt.setInt(2,key);
stmt.setString(2,userid);
stmt.executeUpdate();
return true;
}catch(Exception e){
System.err.println(e.getMessage());
}
return false;
}
让我解释一下:我想执行两个查询,第二个需要在第一个查询中生成的键(我需要表“user”的主键,因为用户身份验证是 1:1 关系).
所以:
- 这是执行多个查询的正确方法吗?
- 我是否遗漏了返回键的内容?因为如果我只运行 executeUpdate() 并且我对它下面的每一行进行注释,该方法工作正常,但是当我运行示例中的代码时(第一个 executeUpdate() 被注释)我得到 false(只有 false,没有异常(exception))。我是否必须检查我的数据库中的某些内容?
提前致谢。
编辑: 我找到了解决办法。这是列中的错误,而不是获取生成的 key 本身的方法中的错误。我会选择 Joop Eggen 的回答,因为他向我展示了改进。谢谢!
最佳答案
需要进行一些改进。
String query1 = "INSERT INTO user (firstName, lastName, belonging, country)"
+ " VALUES(?,?,?,?)";
String query2 = "INSERT INTO authentication (address, password, user_id, login_id)"
+ " VALUES(?,?,?,?)";
try (PreparedStatement stmt1 = this.dbConn.prepareStatement(query1,
PreparedStatement.RETURN_GENERATED_KEYS);
stmt2 = this.dbConn.prepareStatement(query2)) {
stmt1.setString(1, "default");
stmt1.setString(2, "default");
stmt1.setString(3, "default");
stmt1.setString(4, "default");
stmt1.executeUpdate();
try (ResultSet rs = stmt1.getGeneratedKeys()) {
if (rs.next()) {
int userid = rs.getInt(1);
stmt2.setString(1, "default");
stmt2.setString(2, password);
stmt2.setInt(3, key);
stmt2.setString(4, userid);
stmt2.executeUpdate();
return true;
}
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}
return false;
- Try-with-resources 会自动关闭,也会在异常和返回时关闭。
- 您有两个准备好的陈述要结束。
- 带SQL的executeUpdate是针对父类Statement的,不尊重参数设置。您为生成的 key 参数选择了它,但它进入了 Connection.prepareStatement。
- (SQL) 不应列出/准插入生成的键。
- 是否应该在此处捕获 SQLException 是值得商榷的。
throws SQLException
对我有用。
关于java - JSP:多个查询和生成键的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47201045/