JSP:多个查询和生成的密钥

时间:2017-11-09 11:46:26

标签: 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())我得到了假(只有假,没有异常)。我是否必须检查数据库中的内容?
  3. 提前致谢。

    修改 我找到了解决方案。这是列中的错误,而不是获取生成的密钥本身的方法。我将选择Joop Eggen的回答来表明他给我的改进。谢谢!

2 个答案:

答案 0 :(得分:1)

需要进行一些改进。

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. 尝试资源自动关闭,也可以在异常和返回时关闭。
  2. 您有两份准备好的陈述要结束。
  3. 带有SQL的executeUpdate用于父类Statement,并且不尊重参数设置。您为生成的密钥参数选择了该参数,但这将进入Connection.prepareStatement。
  4. (SQL)不应列出/准插入生成的密钥。
  5. 在这里是否应该捕获SQLException是有争议的。 throws SQLException对我有用。

答案 1 :(得分:0)

我建议您在username表中添加user字段,以便在插入后只需执行Select id from user Where username...