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