【问题标题】:JAVA with SQL: the return value of insert command?JAVA with SQL:插入命令的返回值?
【发布时间】:2013-01-09 11:30:02
【问题描述】:

我有一个作者表:authorID、authorName。 authorID 是一个自动递增的 pk。

我想在 java 中编写一个从用户获取名称并将其添加到表中的方法。但是我需要返回作者的 ID。有没有办法用 1 条 sql 语句来做到这一点?

例如,如果我的代码有命令:

stmt.executeUpdate("INSERT INTO authors " + "VALUES (, '"+ string.get(1) +"')");

which string.get(1) 是作者姓名。

现在如果我写:

ResultSet rs =stmt.executeUpdate("INSERT INTO authors " + "VALUES (, '"+ string.get(1) +"')");

它说错误,因为 rs 是结果集,但返回值是 int。这是我插入的行的 pk 吗?

【问题讨论】:

  • 不,它是根据您的查询修改的行数。主键并不总是你知道的单个整数。
  • int 是受影响的行数,意味着如果您执行了一次插入,那么 int 将为 1。
  • string.get(1) 来自哪里?牢记Little Bobby Tables!
  • OKI thx,但我仍然不知道我是否可以插入行并使用 1 个 sql 语句获取它的 pk?
  • 你可以。我在下面发布的代码有效。

标签: java sql jdbc


【解决方案1】:

试试

stmt.executeUpdate("INSERT INTO authors VALUES (, '"+ string.get(1) +"')", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
long pk = rs.getLong(1);

【讨论】:

  • 谢谢!就像一个魅力。唯一不同的是第一个参数应该为空,例如:VALUES (null, '"+ string.get(1) +"')
  • 或者更好的是,OP 应该使用参数化查询
  • 请使用参数化查询。此代码是等待发生的 SQL 注入攻击。
  • 如果stmt.getGeneratedKeys()抛出SQLException,如何删除插入的记录?..
【解决方案2】:

在创建 PreparedStatement conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 时传递 Statement.RETURN_GENERATED_KEYS

和 PreparedStatement#getGeneratedKeys() 在惰性后返回自动生成的密钥。

【讨论】:

【解决方案3】:

为了获得最后插入的 id,请查看以下代码:

PreparedStatement stmnt = Conn.preparedStatement("INSERT INTO authors(col1) VALUES (?)", Statement. RETURN_GENERATED_KEYS );
stmnt.setString(col1val);
stmnt.executeUpdate();
ResultSet rs=stmnt.getGeneratedKeys();
if(rs.next()){
   System.out.println(rs.getInt(1));
}

【讨论】:

    【解决方案4】:

    不知道 JDBC 是否支持这个(好久没用了),但我想你可以试试:

    INSERT INTO TABLE_NAME (FIELD1, FIELD2) VALUES ('foo', 'bar') RETURNING FIELD3
    

    通过 executeQuery() 或者,如果您的 jdbc 驱动程序不支持 RETURNING,则编写一个简单的存储函数。

    您使用的是哪个 RDMBS?

    【讨论】:

      【解决方案5】:

      试试:

      INSERT INTO authors VALUES (...) returning authorID
      

      当您执行它时,请使用executeQuery。你应该返回一个 ResultSet 一行一列 - 这将是 ID。

      【讨论】:

      • ResultSet rs =stmt.executeUpdate("INSERT INTO authors " + "VALUES (, '"+ string.get(1) +"' 返回 authorID)");不工作
      • @jeffranz 使用 executeQuery
      • ... 并将右括号从authorID 之后移动到returning 之前。
      猜你喜欢
      • 2023-04-10
      • 2017-11-02
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多