#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:
Я бы использовал 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
}
Ссылка:
- Учебные пособия по Java: JDBC — использование подготовленных инструкций (Вы также можете прочитать полное руководство по JDBC)
- Ссылка на Java API для
PreparedStatement
класса
Ответ №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, где это возможно
Взгляните на использование подготовленных инструкций для получения более подробной информации