我的源代码具有以下结构:
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?
帮助我找出为什么这段代码对我不起作用。 万分感谢。
答案 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);