Java 使用preparedstatemtnt获取JDBC中最新插入行的id
我在项目中遵循了DAO模式,并为处理DB连接创建了单独的文件。我在其他帖子/问题中找到了答案,但他们使用了Statemtnt,我也使用了PreparedStatemtnt。如何使用PreparedStatement获取最新插入行的idJava 使用preparedstatemtnt获取JDBC中最新插入行的id,java,mysql,jsp,jdbc,Java,Mysql,Jsp,Jdbc,我在项目中遵循了DAO模式,并为处理DB连接创建了单独的文件。我在其他帖子/问题中找到了答案,但他们使用了Statemtnt,我也使用了PreparedStatemtnt。如何使用PreparedStatement获取最新插入行的id private DBConn conn = new DBConn(); private String sql = ""; @Override public boolean insert(Post t) throws SQLException, ClassNotF
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
我在其他帖子/问题中找到了答案,但他们使用了
声明和我使用了PreparedStateMNT
PreparedStatement
接口扩展了语句
接口。public interface PreparedStatement extends Statement {...
因此,您可以使用中定义的公共结果集getGeneratedKeys()
方法
语句
检索生成id的接口。如何使用PreparedStatement获取最新插入行的id 使用实际代码,您将不会检索最新插入的行,而是检索实际插入行的生成id。
如果应用程序是多线程的,则可以在
executeUpdate()
返回和检索生成的id的时间之间插入一行
您还应该使用
PreparedStatement prepareStatement(字符串sql,字符串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);
}
}
...
}
根据您的建议,我更改了“PreparedStatement stmt=conn.inti(sql,generatedId)”中的代码我在DBConn类中得到了error
方法init。必需:字符串,找到:字符串[]
。DBConn中我的init
方法如下:public PreparedStatement inti(String sql)抛出SQLException{stmt=conn.prepareCall(sql);return stmt;}
更改为:public PreparedStatement inti(String sql,String[]id)抛出SQLException{stmt conn=conn.prepareCall(sql,id);return stmt;}
并将所有DAOImpl类标记为红色。