如何在JDBC中获取生成的插入ID?

时间:2013-09-19 09:44:26

标签: java jsp servlets jdbc

我的源代码具有以下结构:

SourceFolder
  AddProduct.jsp
源包
- 的控制器(适用的Servlet)
  SaveProduct.java
- 型号(Db操作)
  ProductDbOperations.java

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

要在 product_collection 表中插入条目,我需要从产品表中获取生成的ID。之后,新的条目将插入 product_collection 表中。

此外,我没有使用任何框架,而且正在使用 Netbeans 7.3。

问题:

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

IN: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?

帮助我找出为什么这段代码对我不起作用。 万分感谢。

3 个答案:

答案 0 :(得分:6)

并非所有驱动程序都支持getGeneratedKeys()的版本,如链接的答案中所示。但是在准备语句时,您还可以传递应该返回的列的列表而不是“flag”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"}

答案 1 :(得分:2)

您使用的方式不是使用预备陈述的正确方法

使用以下方式

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

答案 2 :(得分:0)

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

e.g:

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