我正在尝试使用PreparedStatement对几个记录进行批量插入。但是,每当我在ResultSet上调用next时
,我就会一直变错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();
}
答案 0 :(得分:0)
我发现您的代码存在三个潜在问题。
您插入带有显式ID的记录,因此可能未生成任何密钥。生成的密钥用于数据库系统生成标识符时,但是您的代码会显式生成它(某些数据库系统仍将生成结果集,但不是全部,在这种情况下不确定MySQL)。
批量执行后直接提交连接,因此执行创建的生成密钥结果集(如果有)将已关闭或相关信息已清除。虽然我希望司机在那种情况下调用getGeneratedKeys()
时抛出异常。
JDBC规范声明它是实现定义的,批处理执行是否支持getGeneratedKeys
,因此可能根本不支持它(但是快速查看MySQL Connector的源代码) / J表示支持)。