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

Java 如何在JDBC中获取生成的插入ID?,java,jsp,servlets,jdbc,Java,Jsp,Servlets,Jdbc,我的源代码具有以下结构: 源文件夹 AddProduct.jsp 源程序包 -控制器服务 SaveProduct.java -ModelDb操作 ProductDbOperations.java 我在产品表中插入一个新产品,同时在产品集合表产品id集合id中插入一个条目 要在product_集合表中插入条目,我需要从product表中获取生成的id。之后,一个新条目被插入到product_集合表中 此外,我没有使用任何框架,而是使用Netbeans 7.3 问题: 使用此代码将一个新条目插入到p

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

源文件夹 AddProduct.jsp 源程序包 -控制器服务 SaveProduct.java -ModelDb操作 ProductDbOperations.java

我在产品表中插入一个新产品,同时在产品集合表产品id集合id中插入一个条目

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

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

问题:

使用此代码将一个新条目插入到product表中

在:ProductDbOperations.java中

我还在下面的链接中使用了这个解决方案,但它对我不起作用。 我没有任何SQL异常

所以请帮我找出为什么这个代码对我不起作用。
非常感谢。

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

用下面的方法

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

并非所有驱动程序都支持链接答案中所示的getGeneratedKeys版本。但是在准备语句时,您也可以传递应该返回的列列表,而不是flag语句。根据我的经验,RETURN\u生成的\u键和传递列名更可靠

另外:正如Java初学者正确指出的那样,您使用预先准备好的语句是错误的。您这样做的方式仍然会让您对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,您很可能需要传递新字符串[]{product_id}

是的,有一种方法可以检索SQL插入的密钥。您可以通过以下方式完成: Using Statement.RETURN_在上一次插入中生成的_键,并获取可在下一次插入中使用的键

e、 g:


你怎么知道你没有得到SQLException,你的catch块是空的?你也尝试过getGeneratedKeys方法吗?什么对我不起作用?会发生什么?至少在catch块中打印堆栈跟踪:catch SQLException ex{ex.printStackTrace;}@Kayaman实际上代码非常大,所以让我解释一下。。我使用一个String类型的状态变量获取异常作为String,函数返回一个类似status=ex.toString的字符串;试捕块返回状态后;还包括System.out.println;没有显示任何内容。@javaBegginer我需要从产品表中生成的id。虽然这是一个很好的建议,但它没有涵盖真正的问题:如何获取生成的密钥。您能告诉我为什么使用?,?,?for值适用于插入或更新。@Surinderツ 例如,它可以防止SQL注入和输入错误。请解释为什么使用这个新字符串[]{PRODUCT_ID}字符串数组请告诉我为什么使用System.out.println;不为我工作。知道吗?你是什么意思?只是一个打字错误。。。。。。是的,有一种方法可以检索SQL插入的密钥,您可以通过……我已经编辑了您的答案,请使用实际单词,不要缩写为u you和b be这样的单个字母,这会使您的答案更难阅读。
// 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);
}
String query = "INSERT INTO Table (Col2, Col3) VALUES ('S', 50)";
Statement stmt = con.createStatement();
int count = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);