-1

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

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

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

要将条目插入到product_collection表中,我需要从产品表中获取生成的 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 异常

如何在 JDBC 中获取插入 ID?

所以帮我找出为什么这段代码对我不起作用。太感谢了。

4

3 回答 3

8

并非所有驱动程序都支持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"}

于 2013-09-19T09:56:32.307 回答
2

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

使用以下方式

    pst = cn.prepareStatement("INSERT INTO product values(?,?,?)");
pst.setString(1,name);
pst.setInt(2,quantity);
pst.setInt(3,price);
pst.executeUpdate();
于 2013-09-19T09:50:34.287 回答
0

是的,有一种方法可以检索 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);
于 2013-09-19T09:59:14.673 回答