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