ВСТАВКА Java в базу данных SQL с помощью JDBC

#java #mysql #sql #sql-server #jdbc

#java #mysql #sql #sql-сервер #jdbc

Вопрос:

Просто ищу небольшую помощь здесь. Это мой первый раз, когда я использую базу данных с Java, и у меня есть небольшая проблема, которую я пытаюсь решить.

У меня есть метод в классе под названием DBConnect, который будет выполнять запросы. Я хотел бы вставить этот список в свою базу данных.

  List<String> data = new ArrayList();
    data.add(name);
    data.add(bank);
    data.add(pin);
    data.add(email);
    data.add(pass);
    data.add(phone);
    data.add(paypal_email);
    data.add(paypal_pass);
    data.add(IPV4Assistant.getExternalIPAddress());
    data.add(crypto);
    data.add("1");
    data.add(dob);
  

DBConnect.ExecuteQuery();

Я полагаю, я бы начал создавать строку запроса с

  String insert = ("INSERT INTO Client_Data (card_number,card_pin,client_dob,crypto_currency_address,email,email_password,id,ip_address,name,paypal_email,paypal_password,phone_number) VALUES
  

Вышеуказанные поля являются столбцами, в которые я пытаюсь вставить, а Client_Data — моей таблицей.
Как мне отформатировать поля в моем списке для правильного запроса?
После значений, я полагаю, формат (‘data’, ‘данные’, ‘data’).

Может ли кто-нибудь, имеющий опыт работы с JDBC, пожалуйста, помочь мне? Спасибо.

Комментарии:

1. PreparedStatement

Ответ №1:

Я бы использовал PreparedStatements для вставки значений в вашу таблицу.

 /*
 * Code
 * I am assuming that you have a Connection object named conn.
 * This is just a simple example
 */
try(
        PreparedStatement ps = conn.prepareStatement(
            "insert into yourTable(field1, field2, field3) values (?,?,?)"
) {
    /*
     * The question marks are placeholders for the values you will insert.
     */
    ps.setString(1, "abc");
    ps.setInt(2, 123);
    ps.setDouble(3, 3.1416);
    ps.execute(); // The insert is executed here
} catch(SQLException e) {
    // Your exception handling code
}
  

Если вам нужно вставить значения в вашу таблицу с помощью цикла, вы также можете выполнить вставки в виде пакета:

 /*
 * Code
 */
try(
        PreparedStatement ps = conn.prepareStatement(
            "insert into yourTable(field1, field2, field3) values (?,?,?)"
) {
    for(int i = 0; i < 10; i  ) {
        ps.setString(1, "abc");
        ps.setInt(2, 123 * i);
        ps.setDouble(3, 3.1416);
        ps.addBatch(); // The insert is added to a batch, pending for execution
    }
    ps.executeBatch(); // All the inserts added to the batch are executed.
} catch(SQLException e) {
    // Your exception handling code
}
  

Ссылка:

Ответ №2:

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

Например, вы могли бы начать с определения инструкции insert как константы, это не обязательно, но для примера это упростило задачу…

 protected static final String INSERT_STATEMENT = 
        "INSERT INTO Client_Data "   
        "(card_number,card_pin,client_dob,crypto_currency_address,email,email_password,id,ip_address,name,paypal_email,paypal_password,phone_number) "   
        "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
  

Затем вам нужно привязать значения из вашего List к PreparedStatement и выполнить это…

 List<String> data = new ArrayList();
data.add(name);
data.add(bank);
data.add(pin);
data.add(email);
data.add(pass);
data.add(phone);
data.add(paypal_email);
data.add(paypal_pass);
data.add(IPV4Assistant.getExternalIPAddress());
data.add(crypto);
data.add("1");
data.add(dob);

// Replace with your own connection management, just here for
// example reasons
try (Connection con = DriverManager.getConnection(url)) {
    try (PreparedStatement stmt = con.prepareStatement(INSERT_STATEMENT)) {
        for (int index = 0; index < data.size(); index  ) {
            stmt.setObject(index   1, data.get(index));
            int rows = stmt.executeUpdate();
            // Check the value of rows if you want to know how
            // many rows were affected by the change
        }
    }
} catch (SQLException exp) {
    // Possibly throw this to the call instead...
    exp.printStackTrace();
}
  

Я предполагаю, что вы будете передавать List в качестве параметра какому-либо методу.

Непосредственная проблема, которую я вижу в связи с этим, заключается в том, что вы ДОЛЖНЫ быть на 100% уверены, что имена столбцов соответствуют значениям столбцов, это означает, что ваши List ДОЛЖНЫ располагаться в правильном порядке.

Лучшим решением может быть либо предоставление пользовательского класса, который несет эти свойства и может запрашиваться с помощью геттеров, либо использование каких-либо Map и static ключей, которые являются либо прямыми именами столбцов в базе данных, либо могут отображаться, например, на столбцы в базе данных…

 public static final String CLIENT_NAME = "name";
//... Other column names/keys...    

//...

Map<String, Object> clientData = new HashMap<String, Object>();
clientData.put(CLIENT_NAME, name);

//...

stmt.setObject(CLIENT_NAME, clientData.get(CLIENT_NAME));
  

Вам также следует избегать вставки String в столбцы, которые имеют разные требования к типу данных (такие как Date , TimeStamp и / или числа). Вместо этого вы должны пытаться использовать правильные типы сопоставления JDBC, где это возможно

Взгляните на использование подготовленных инструкций для получения более подробной информации