Как поместить результат оператора for в таблицу?

1

Каков наилучший способ поместить результат for Statement в таблицу PostgreSQL?

Пример:

int size = 5;
try {
    for (int i = 1; i <= size; i++) {
        for (int j = 1; j <= size; j++) {
            ??? x = (i * j); 

            String sql = "INSERT INTO multiplication" +
                         "VALUES (???)";
            ResultSet rs = stmt.executeQuery(sql);
        }
    }
}
  • 0
    Вы создали таблицу в базе данных? Какова его структура (показать оператор CREATE TABLE)?
  • 0
    Оператор CREATE TABLE не для этого кода, но таблица уже создана ... Я также проверил соединение и сделал простой INSERT, такой как "INSERT INTO multiplication VALUES (3, 6, 9, 12, 15)", и это сработало просто хорошо.
Показать ещё 1 комментарий
Теги:
for-loop

2 ответа

3
Лучший ответ

Я рекомендую вам использовать подготовленные заявления:

int size = 5;
String strSQL = "insert into multiplication values (?)"; 
/* 
 * I am assuming your table has only one column.
 * If it has more columns, you need to specify the column where you want 
 * to insert the value:
 *     "insert into multiplication (col1) values (?)"
 *
 * The question mark is a place-holder for the value you are about to insert.
 *
 * I am also assuming that you have a Connection object named "conn".
 */
try(PreparedStatement ps = conn.prepareStatement(strSQL)) {
    for(int i = 1; i <= size; i++) {
        for(int j = 1; j <= size; j++) {
            /*
             * You are multiplying integers, so the result is also an integer
             */
            int x = i * j;
            /*
             * Assign the value to the prepared statement
             */
            ps.setInt(1, x);
            ps.execute(); // The statement is executed HERE
        }
    }
} catch(SQLException e) {
    // Exception handling code
}

Подготовленные заявления имеют некоторые преимущества:

  1. Вы можете написать инструкцию SQL только один раз и использовать ее много раз. Вам просто нужно ввести индекс владельца места (начиная с 1) и присвоить соответствующее значение. Существуют методы setXXX() для большинства типов данных SQL (и setNull() если есть необходимость в них).
  2. Подготовленные утверждения помогают предотвратить SQL-инъекции attacs ((для забавного примера того, каковы риски атак SQL-инъекций, проверьте xkcd: Exploits of a mom).
  3. Если у вас есть большое количество инструкций, вы можете выполнить их в пакете.

Пример партии:

int size = 5;
String strSQL = "insert into multiplication values (?)"; 
try(PreparedStatement ps = conn.prepareStatement(strSQL)) {
     for(int i = 1; i <= size; i++) {
         for(int j = 1; j <= size; j++) {
             int x = i * j;
             ps.setInt(1, x);
             ps.addBatch(); // The statement is added to the batch (but not executed yet)
         }
     }
     ps.executeBatch(); // All the instructions in the batch are executed HERE
 } catch(SQLException e) {
     // Exception handling code
 }

Рекомендации:

  • 1
    В случае, если размер ^ 2 генерирует большое количество операций, например, size = 100, который будет генерировать 10 тыс. Вставок, вы можете вместо этого вставить их в пакет.
  • 0
    @LuiggiMendoza note принятый ... обновление поста для включения этой альтернативы
Показать ещё 2 комментария
0

Вы можете попробовать это.

int size = 5; 
try {
    for (int i = 1; i <= size; i++) {
        for (int j = 1; j <= size; j++) {
            String x = String.valueOf(i * j); 

            String sql = "INSERT INTO multiplication" +
                     "VALUES (" + x + ")";
            ResultSet rs = stmt.executeQuery(sql);
        }
    }
}
  • 0
    Предупреждение! Ваш код уязвим для атак SQL-инъекций
  • 1
    Вы можете попытаться использовать PreparedStatement при отправке параметров на ваши запросы при использовании JDBC.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню