Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用preparedstatemtnt获取JDBC中最新插入行的id_Java_Mysql_Jsp_Jdbc - Fatal编程技术网

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

Java 使用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

我在项目中遵循了DAO模式,并为处理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
我在其他帖子/问题中找到了答案,但他们使用了 声明和我使用了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类标记为红色。