【问题标题】:Java PreparedStatement retrieving last inserted ID [duplicate]Java PreparedStatement 检索最后插入的 ID [重复]
【发布时间】:2011-07-27 15:47:06
【问题描述】:

以这种方式完成的这个问题的答案似乎很难在互联网上找到。基本上,我使用 PreparedStatement 将值插入 MySQL 数据库。我使用 PreparedStatement 转义数据以防止 SQL 注入攻击。问题是,现在有办法恢复这些密钥。

String query="Insert INTO Table_A(name, age) (?, ?)";
//String query="Insert INTO Table_A(name, age) ('abc','123' )";//Doesn't escape
PreparedStatement prest;
prest = con.prepareStatement(query);
prest.setString(1,"abc");
prest.setInt(2,123);
prest.executeUpdate();
//prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error
//prest.executeQuery(); Throws an error

那么如何在 Java 中转义输入并使用 PreparedStatements?

【问题讨论】:

  • 将RETURN_GENERATED_KEYS 传递给prepareStatement() 调用并使用executeUpdate() 执行插入。如果这不起作用,请提供例外情况。
  • @BalusC 引用了正确的方法。
  • @BalusC,这正是我想要的。糟糕的是它不是一个答案!
  • 我刚刚投票赞成关闭作为重复。

标签: java mysql jdbc prepared-statement


【解决方案1】:

将Statement.RETURN_GENERATED_KEYS 与您的查询一起传递到prepareStatement()。然后使用PreparedStatement 的getGeneratedKeys() 来获取包含您插入的auto_incremented_id 的ResultSet。

String query="Insert INTO Table_A(name, age) (?, ?)";
                //String query="Insert INTO Table_A(name, age) ('abc','123' )";//Doesn't escape
                PreparedStatement prest;
                prest = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
                prest.setString(1,"abc");
                prest.setInt(2,123);
                prest.executeUpdate();
                //prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error
                //prest.executeQuery(); Throws an error
                ResultSet rs = prest.getGeneratedKeys();
                if(rs.next())
                {
                    int last_inserted_id = rs.getInt(1);
                }

【讨论】:

  • 我想在我的插入语句之前添加这个查询,以允许在我的表中使用表情符号 -> SET NAMES utf8mb4;但现在我无法从准备好的语句中的插入查询中获取最后一个插入 ID。我该怎么办
【解决方案2】:

【讨论】:

    【解决方案3】:

    如果不能使用RETURN_GENERATED_KEYS,就用另外一条语句(这次是查询)来做

    SELECT last_insert_id()
    

    确保您在该表中肯定有一个自动递增的主键列。

    【讨论】:

    • 这是否也适用于您试图为其中一个插入获取 id 的同一个表有多个插入的情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2023-03-29
    • 2015-09-30
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多