getgeneratedkeys在executebatch之后返回空结果集

xoefb8l8  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(304)

我正在尝试使用preparedstatement对几个记录进行批插入。然而,每当我调用resultset的next时,我总是得到false

public ResultSet insert_into_batch(ArrayList<Movie> values) throws SQLException
{
    conn.setAutoCommit(false);
    ArrayList<String> added = new ArrayList<String>();
    String stmt = "INSERT INTO movies (id,title,year,director) VALUES (?,?,?,?)";
    PreparedStatement psInsertRecord = conn.prepareStatement(stmt, Statement.RETURN_GENERATED_KEYS);
    for (Movie movie : values)
    {
        if (!added.contains(movie.getId())) {
            added.add(movie.getId());
            psInsertRecord.setString(1, movie.getId());
            psInsertRecord.setString(2, movie.getTitle());
            psInsertRecord.setInt(3, movie.getYear());
            psInsertRecord.setString(4, movie.getDirector());
            psInsertRecord.addBatch();
        }
    }
    psInsertRecord.executeBatch();
    conn.commit();
    conn.setAutoCommit(true);
    return psInsertRecord.getGeneratedKeys();
}
flvlnr44

flvlnr441#

我发现你的代码有三个潜在的问题。
插入具有显式id的记录,因此可能未生成任何键。生成的键用于数据库系统生成标识符,但代码显式生成它(一些数据库系统仍将生成结果集,但不是全部,在本例中不确定mysql)。
您在批处理执行之后直接提交连接,因此由execute创建的生成的keys结果集(如果有)将已经关闭或清除相关信息。尽管我希望驱动程序在调用 getGeneratedKeys() 在那种情况下。
jdbc规范声明它是由实现定义的 getGeneratedKeys 支持批处理执行,因此可能根本不支持它(但是快速查看mysql connector/j的源代码表明它是受支持的)。

相关问题