Java 从准备好的语句自动生成主键ID

Java 从准备好的语句自动生成主键ID,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,我在这里的第一篇帖子,所以请对我放松:) 因此,我使用以下代码创建了一个数据库表。(我使用Oracle10g和OracleJDBC。我让这个servlet代码与我制作的HTML表单通信。) 现在,我的servlet代码如下所示: // Fill Recipes table PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(rec_name,recipe_cat,rec_desc,autho

我在这里的第一篇帖子,所以请对我放松:)

因此,我使用以下代码创建了一个数据库表。(我使用Oracle10g和OracleJDBC。我让这个servlet代码与我制作的HTML表单通信。)

现在,我的servlet代码如下所示:

// Fill Recipes table
        PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(rec_name,recipe_cat,rec_desc,author) VALUES (?,?,?,?)");
        pstmt.clearParameters();

        String opt1 = req.getParameter("RecName"); //parameters from HTML form
        String opt2 = req.getParameter("choice"); //parameters from HTML form
        String opt3 = req.getParameter("CookDesc"); //parameters from HTML form
        String opt4 = req.getParameter("author"); //parameters from HTML form

        pstmt.setString(1,opt1);
        pstmt.setString(2,opt2);
        pstmt.setString(3,opt3);
        pstmt.setString(4,opt4);

        ResultSet rs = pstmt.executeQuery();
我想做的是在GM_Recipes表中插入一行,但要自动生成recipe_Id。(通过HTML表单,出于明显的原因,我不会要求别人输入recipe Id)

我代码的后面部分依赖于将要创建的新配方的配方ID


我尝试了一些从谷歌上找到的生成密钥代码,但我已经研究了几个小时,很好奇是否有人能分享一些有意义的见解:)谢谢,10g&11g自动增量列中没有。您必须创建一个命名序列、一个触发器,并使用nextval表达式为主键设定种子

--create sequence seq_gm_recipes;
--this would work, if your table doesn't have records yet
--otherwise use the below
declare i_start int;
begin
  select max(recipe_id)+1 into i_start from GM_Recipes;
  execute immediate 'create sequence seq_gm_recipes start with ' || i_start;
end;

CREATE OR REPLACE TRIGGER trg_GM_Recipes
BEFORE INSERT ON GM_Recipes
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
  l_Var NUMBER;
BEGIN
   SELECT seq_gm_recipes.NEXTVAL INTO l_Var FROM dual;
   :NEW.recipe_id := l_Var;
END;

这显然是PL/SQL,可以直接在SQL*plus或TOAD中执行。

您应该创建一个序列db端(我们称之为您的_序列),然后使用它生成id:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(recipe_id, rec_name,recipe_cat,rec_desc,author) VALUES (YOUR_SEQUENCE.nextval, ?,?,?,?)";

另外,如果您在该表中已有记录,请注意合适的序列起始值。

谢谢大家的帮助

我用了一种非正统的方法,得到了我想要的东西

stmt22 = con.createStatement();    
ResultSet ChoMax = stmt22.executeQuery("");
ChoMax.next();

int increm = ((Number) ChoMax.getObject(1)).intValue();
if(increm != 0){increm++;}

然后使用increm变量重新插入到我的preparedStatement代码中

我应该提到,在任何代码之前,我已经在表中硬编码/插入了一些数据。(当我编写sql代码时),因此目前我在GM_recipes表中有3个“测试”配方。因此,如果我在表中插入一个新配方,我希望生成一个配方ID为4的配方,等等(随着每个新配方添加到表中而递增)。
stmt22 = con.createStatement();    
ResultSet ChoMax = stmt22.executeQuery("");
ChoMax.next();

int increm = ((Number) ChoMax.getObject(1)).intValue();
if(increm != 0){increm++;}