2013-06-20 4 views
-4

Привет, у меня есть код java swing, чтобы вставить 2 строки в таблицы sql и я вставляю в таблицу 2 jtextfields, которые я установил во фрейме Так что я не хочу вставлять строку, если я устанавливаю тот же текст в JTextFieldsвставка повторяется при выполнении программы

это код:

Connection conn = null; 
    Statement stmt = null; 
    try{ 
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+db, "root", "123456"); 
stmt = conn.createStatement(); 
stmt.executeUpdate("INSERT INTO router(hostname,address,version)VALUES('Edge 01','"+jTextField1.getText()+"','2700')") ; 
stmt.executeUpdate("INSERT INTO router(hostname,address,version) VALUES('Edge 02','"+jTextField2.getText()+"','2700)") ; 
stmt.close(); 
conn.close(); 

    } 
     catch(SQLException ek){ 
     } 

Спасибо

+2

у вас есть инъекции SQL уязвимость. – SLaks

+1

Вы ищете чудеса оператора 'if'. (с опрыскиванием сравнения строк) – SLaks

+2

Другими словами, что вы пробовали? Какая у вас проблема? – SLaks

ответ

1

есть два возможных варианта:

  1. Попробуйте извлечь запись, используя инструкцию select, и вставьте только тогда, когда выберите результаты в записи ZERO.
  2. Создайте уникальный ключ/индекс в столбцах таблицы базы данных и включите триггер insert. Вставка будет неудачной в случае дубликатов, но вам необходимо обработать исключения (дублировать/уникально).

Если возможно, примените оба шага вместе, в противном случае выберите один из шагов, более подходящих для других бизнес-сценариев.

0

Я хотел бы предложить, что вы никогда не , никогда, строить запросы на String с. Используйте PreparedStatement.

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

Переместите эту логику в отдельный метод для ясности. И всегда закрывайте ресурсы в блоке finally, иначе вы получите утечку памяти, если есть Exception. Я использовал конструкцию try-with-resources Java 7.

public boolean insertIfNotPresent(final Connection con, final String value) throws SQLException { 
    final String checkQuery = "SELECT COUNT(*) FROM router where hostname='Edge 01' and version=2700 and address=?"; 
    try (final PreparedStatement statement = con.prepareStatement(checkQuery)) { 
     statement.setString(1, value); 
     try (final ResultSet resultSet = statement.executeQuery()) { 
      if (resultSet.next() && resultSet.getInt(1) > 0) { 
       return false; 
      } 
     } 
    } 
    final String insertQuery = "INSERT INTO router SET hostname='Edge 01', version=2700, address=?"; 
    try (final PreparedStatement statement = con.prepareStatement(insertQuery)) { 
     statement.setString(1, value); 
     statement.executeUpdate(); 
    } 
    return true; 
} 

Таким образом, первый запрос, SELECT COUNT(*) ..., подсчитывает строки, соответствующие критериям. Если в базе уже есть что-то, мы возвращаем false.

Второй запрос содержит вставку, если мы не вернули false из первой части. В этом случае метод возвращает true.

В качестве примера в приведенном выше коде, что-то вроде следующего будет работать

try(final Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+db, "root", "123456")) { 
    insertIfNotPresent(conn, jTextField1.getText()); 
    insertIfNotPresent(conn, jTextField2.getText()); 
} 
+0

im работает в netbeans swing, как я могу вставить этот код в код кнопки –

+0

Я добавил простой пример. Если вы не знаете, как использовать методы, я предлагаю вам прочитать [this] (http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html). –

+0

да им чтение и тестирование, но у меня есть некоторые ошибки –