java - JSP:多个查询和生成键的问题

标签 java mysql jsp tomcat netbeans

我有这个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 关系).

所以:

  1. 这是执行多个查询的正确方法吗?
  2. 我是否遗漏了返回键的内容?因为如果我只运行 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;
  1. Try-with-resources 会自动关闭,也会在异常和返回时关闭。
  2. 您有两个准备好的陈述要结束。
  3. 带SQL的executeUpdate是针对父类Statement的,不尊重参数设置。您为生成的 key 参数选择了它,但它进入了 Connection.prepareStatement。
  4. (SQL) 不应列出/准插入生成的键。
  5. 是否应该在此处捕获 SQLException 是值得商榷的。 throws SQLException 对我有用。

关于java - JSP:多个查询和生成键的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47201045/

相关文章:

Java Windows 8 全屏?

javascript - 谷歌 API 折线图

javascript - 如何仅使用 JSP 和 javascript 显示浏览文件夹窗口(不浏览文件)?

java - 与 RequestDispatcher 混淆,说浏览器地址栏没有改变

java - 构建路径 : Invalid ZIP archive

java - Animation 方法中出现 NullPointerException 问题

mysql - 在数据库中存储日志数据的更好策略是什么?

html - 在 HTML/JSP 中引用 gzip 压缩的 CSS 和 JS

java - Spring 3.x 无法加载 applicationContext

php - 我如何知道 insert .. select 是否确实插入了任何行?