【问题标题】:How to get the Generated insert ID in JDBC?如何在 JDBC 中获取 Generated insert ID?
【发布时间】:2013-09-19 09:44:26
【问题描述】:

我的源代码结构如下:

源文件夹
AddProduct.jsp
源包
-控制器(Servlet)
SaveProduct.java
-模型(数据库运营)
ProductDbOperations.java

我正在向产品表中插入一个新产品,同时我正在向 product_collection 表 (product_id | collection_id) 中插入一个条目。

要将条目插入到 product_collection 表中,我需要从 product 表中获取生成的 id。之后,一个新条目被插入到 product_collection 表中。

另外,我没有使用任何框架,而是使用 Netbeans 7.3。

问题:

使用这段代码将一个新条目插入到产品表中

输入:ProductDbOperations.java

try
{
    this.initConnection(); // Db connection 
    pst = cn.prepareStatement("INSERT INTO product values('"+name+"', "+quantity+", "+price+")");
    rs = pst.executeUpdate();
}
catch(SQLException ex)
{   

}

我还在以下链接中使用了对我不起作用的解决方案。 我没有遇到任何 SQL 异常

How to get the insert ID in JDBC?

所以请帮我找出为什么这段代码不适合我。 谢谢一百万。

【问题讨论】:

  • 你怎么知道你没有得到 SQLException,你的 catch 块是空的?你也尝试过 getGeneratedKeys() 方法吗?
  • “不适合我”是什么意思?怎么了?至少在你的 catch 块中打印堆栈跟踪:catch (SQLException ex) { ex.printStackTrace(); }
  • @Kayaman 实际上代码非常大,所以让我解释一下.. 我使用 String 类型的状态变量来获取异常作为字符串和函数返回一个字符串,如 status = ex.toString(); try catch 块后返回状态;
  • 还有 System.out.println();没有显示任何内容。

标签: java jsp servlets jdbc


【解决方案1】:

并非所有驱动程序都支持getGeneratedKeys() 的版本,如链接答案所示。但是在准备语句时,您还可以传递应该返回的列列表,而不是“标志”Statement.RETURN_GENERATED_KEYS(根据我的经验,传递列名更可靠)

另外:正如 javaBeginner 正确指出的那样,您对准备好的语句的使用是错误的。你这样做的方式仍然会让你对 SQL 注入敞开心扉。

// run the INSERT
String sql = "INSERT INTO product values(?,?,?)";
pst = cn.prepareStatement(sql, new String[] {"PRODUCT_ID"} );
pst.setString(1, name);
pst.setInt(2, quantity);
pst.setInt(3, price);
pst.executeUpdate();

// now get the ID:
ResultSet rs = pst.getGeneratedKeys();
if (rs.next()) {
   long productId = rs.getLong(1);
}

请注意,传递给调用的列名区分大小写。对于 Oracle,列名通常是大写的。如果您正在使用例如Postgres 你很可能需要通过new String[] {"product_id"}

【讨论】:

  • 请解释一下为什么使用这个新的 String[] {"PRODUCT_ID"} 字符串数组
  • 请告诉我为什么 System.out.println();不为我工作。有什么想法吗?
【解决方案2】:

你使用的方式不是使用preparedstatement的正确方式

使用以下方式

    pst = cn.prepareStatement("INSERT INTO product values(?,?,?)");
pst.setString(1,name);
pst.setInt(2,quantity);
pst.setInt(3,price);
pst.executeUpdate();

【讨论】:

  • @javaBegginer 我需要产品表中生成的 id。
  • 虽然这是一个很好的建议,但它并没有涵盖真正的问题:如何获取生成的密钥。
  • 你能告诉我为什么使用 (?,?,?) 作为值有利于插入或更新。
  • @Surinderツ 例如,它可以防止 SQL 注入和拼写错误。
【解决方案3】:

是的,有一种方法可以检索 SQL 插入的密钥。你可以这样做: 在之前的插入中使用Statement.RETURN_GENERATED_KEYS 并获取可用于进一步插入的密钥

例如:

String query = "INSERT INTO Table (Col2, Col3) VALUES ('S', 50)";
Statement stmt = con.createStatement();
int count = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

【讨论】:

  • “SQL u”是什么意思?
  • 只是一个拼写错误......是的,有一种方法可以检索 SQL 插入的密钥,你可以通过......
  • 我已经编辑了你的答案,请使用真实的单词,不要缩写为 u (you) 和 b (be) 等单个字母,这会使你的答案更难阅读。
猜你喜欢
  • 2012-12-14
  • 2018-08-01
  • 1970-01-01
  • 2012-11-04
相关资源
最近更新 更多