使用preparedstatemtnt获取JDBC中最新插入行的id

时间:2017-04-30 17:13:25

标签: java mysql jsp jdbc

我已经为我的项目遵循了DAO模式,并为handeling DB连接创建了单独的文件。我在其他帖子/问题中找到了答案,但他们使用了Statemtnt,我使用了PreparedStatemtnt。如何使用PreparedStatement获取最新插入行的id。

private DBConn conn = new DBConn();
private String sql = "";

@Override
public boolean insert(Post t) throws SQLException, ClassNotFoundException {
    conn.openConnection();
    sql = "insert into posts (title,slug,category_id,content) values (?,?,?,?)";

    PreparedStatement stmt = conn.inti(sql);
    stmt.setString(1, t.getTitle());
    stmt.setString(2, t.getSlug());
    stmt.setInt(3, t.getCategoryID());
    stmt.setString(4, t.getContent());

    int result = conn.executeUpdate();
    if (result > 0) {
        return true;
    }
    conn.closeConnection();
    return false;
}

我试过了:

int result = conn.executeUpdate( Statement.RETURN_GENERATED_KEYS);

我被标记为错误陈述:

method executeUpdate in class DBConn cannot be applied to given types

1 个答案:

答案 0 :(得分:1)

  

我在其他帖子/问题中找到了答案,但他们已经使用了   声明和我使用了PreparedStatemtnt。

PreparedStatement界面扩展了Statement界面。

public interface PreparedStatement extends Statement {...

因此,您可以使用中定义的public ResultSet getGeneratedKeys()方法 Statement接口,用于检索生成的id。(

  

如何使用PreparedStatement获取最新插入行的ID。

使用实际代码,您将无法检索最新插入的行,而是检索实际插入行的生成ID 如果应用程序是多线程的,则可以在executeUpdate()返回和检索生成的id的时间之间插入一行。

您还应该使用。创建PreparedStatement实例 PreparedStatement prepareStatement(String sql, String columnNames[])方法,可以检索生成的ID。

根据该方法的Javadoc:

  

创建一个能够返回的默认PreparedStatement对象   由给定数组指定的自动生成的键。这个数组包含   目标表中包含的列的名称   应该返回的自动生成的密钥。司机会忽略   如果SQL语句不是INSERT语句或SQL,则为数组   声明能够返回自动生成的键(这样的列表   语句是供应商特定的。)

你可以这样做:

String[] generatedId = { "ID" };
String  sql = "insert into posts (title,slug,category_id,content) values (?,?,?,?)";

PreparedStatement statement = connection.prepareStatement(sql, generatedId);
 . . . 
int result = statement.executeUpdate();
if (result > 0) {
   ...
   try { ResultSet rs = statement.getGeneratedKeys();
      if (rs.next()) {
         long id = rs.getLong(1);
       }

    }

   ...
}