JDBC вставить несколько строк

Теперь я использую пакет:

String query = "INSERT INTO table (id, name, value) VALUES (?, ?, ?)"; PreparedStatement ps = connection.prepareStatement(query); for (Record record : records) { ps.setInt(1, record.id); ps.setString(2, record.name); ps.setInt(3, record.value); ps.addBatch(); } ps.executeBatch(); 

Мне просто интересно, соответствует ли приведенный выше код следующему коду. Если нет, что быстрее?

 String query = "INSERT INTO table (id, name, value) VALUES "; for (Record record : records) { query += "(" + record.id + ",'" + record.name + "'," + record.value + "),"; } query = query.substring(1, query.length() - 1); PreparedStatement ps = connection.prepareStatement(query); ps.executeUpdate(); 

Прежде всего, при конкатенации строки запроса вы не только теряете преобразование типа, родное методам PreparedStatement, но также получаете уязвимость для запуска вредоносного кода в базе данных.

Во-вторых, PreparedStatements предварительно кэшируются в самой базе данных, и это уже дает очень хорошее улучшение производительности по сравнению с обычными состояниями.

executeBatch будет иметь улучшенную производительность над executeUpdate если для автоматической фиксации установлено значение false:

 connection.setAutoCommit(false); PreparedStatement ps = connection.prepareStatement(query); for (Record record : records) { // etc. ps.addBatch(); } ps.executeBatch(); connection.commit(); 

Вы можете столкнуться с серьезной проблемой производительности, если количество элементов, которые вы хотите вставить, велико. Поэтому безопаснее определять размер партии и постоянно выполнять запрос, когда размер партии достигнут.

Что-то вроде следующего примера кода должно работать. Для полной информации о том, как эффективно использовать этот код, см. Эту ссылку .

 private static void insertList2DB(List list) { final int batchSize = 1000; //Batch size is important. Connection conn = getConnection(); PreparedStatement ps = null; try { String sql = "INSERT INTO theTable (aColumn) VALUES (?)"; ps = conn.prepareStatement(sql); int insertCount=0; for (String item : list) { ps.setString(1, item); ps.addBatch(); if (++insertCount % batchSize == 0) { ps.executeBatch(); } } ps.executeBatch(); } catch (SQLException e) { e.printStackTrace(); System.exit(1); } finally { try { ps.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 
 public void insertBatch(final List records ) { String query = "INSERT INTO table (id, name, value) VALUES (?, ?, ?)"; GenericDAO.getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { Record record = records .get(i); ps.setInt(1, record.id); ps.setString(2, record.name); ps.setInt(3, record.value); } @Override public int getBatchSize() { return records.size(); } }); } 

я думаю, что это будет

 String query = "INSERT INTO table (id, name, value) VALUES "; for (Record record : records) { query += "(" + record.id + ",'" + record.name + "'," + record.value + "),"; query = query.substring(1, query.length() - 1); PreparedStatement ps = connection.prepareStatement(query); ps.executeUpdate(); } 

потому что вы должны выполнить запрос для каждой записи для вставки в базу данных.