我已经为我的项目遵循了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
答案 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);
}
}
...
}