Java PreparedStatement 检索最后插入的 ID [重复]

Posted

技术标签:

【中文标题】Java PreparedStatement 检索最后插入的 ID [重复]【英文标题】:Java PreparedStatement retrieving last inserted ID [duplicate] 【发布时间】: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,这正是我想要的。糟糕的是它不是一个答案! 我刚刚投票赞成关闭作为重复。 【参考方案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】:

使用 java.sql.ResultSet java.sql.Statement.getGeneratedKeys() 检索您生成的密钥。

【讨论】:

【参考方案3】:

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

SELECT last_insert_id()

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

【讨论】:

这是否也适用于您试图为其中一个插入获取 id 的同一个表有多个插入的情况?

以上是关于Java PreparedStatement 检索最后插入的 ID [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID

java:在 H2 中的 executeBatch() 之后检索键

Java -- JDBC 学习--PreparedStatement

java中的PreparedStatement.addBatch有啥限制吗?

线程中的 PreparedStatement (java)

Java中PreparedStatement和Statement的用法区别