Подтвердить что ты не робот

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();
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

public void insertBatch(final List<Record > 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();
        }
    });
}

Ответ 4

Я думаю, что это будет делать

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();
}

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