Java PreparedStatement 检索最后插入的ID

39

在互联网上似乎很难找到以这种方式完成此问题的答案。基本上,我正在使用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呢?


1
RETURN_GENERATED_KEYS 传递给 prepareStatement() 调用,并使用 executeUpdate() 执行插入操作。如果不起作用,请提供异常信息。 - ZeissS
@BalusC提供了一种正确的方法来实现这个。 - Dave G
@BalusC,这正是我在寻找的。可惜这不是一个答案! - Devin Dixon
我刚刚投票关闭为重复。 - BalusC
3个回答

74

prepareStatement()中传递Statement.RETURN_GENERATED_KEYS和你的查询语句。然后使用PreparedStatementgetGeneratedKeys()获取包含插入的自增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。我该怎么办? - Onkar Musale

4

0

如果无法使用 RETURN_GENERATED_KEYS,请使用另一个语句(这次是查询)来执行。

SELECT last_insert_id()

确保在该表中有一个自增的主键列。


这个方法也适用于同一张表中有多个插入操作,而你正在尝试获取其中一个插入操作的ID吗? - user917099

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接