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

Sur*_*r ツ -1 java jsp servlets jdbc

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

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

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

要在product_collection表中插入一个条目,我需要从product表中获取生成的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)
{   

}
Run Code Online (Sandbox Code Playgroud)

我也使用以下链接的解决方案,这对我不起作用.我没有任何SQL异常

如何在JDBC中获取插入ID?

所以帮助我找出为什么这段代码不适合我.太感谢了.

a_h*_*ame 7

并非所有驱动程序都支持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);
}
Run Code Online (Sandbox Code Playgroud)

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