[英]Java INSERT to SQL Database with 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是我的表。 如何格式化列表中的字段以正確查詢? 在Values之后,我相信格式是('data','data','data')。
有JDBC經驗的人可以幫助我嗎? 謝謝。
基本上,您應該嘗試使用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
必須以正確的順序排列。
更好的解決方案可能是提供一個帶有這些屬性並可以通過getter進行查詢的自定義類,或者使用某種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映射類型。
查看使用預備語句以了解更多詳細信息
我將使用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
}
參考:
PreparedStatement
類的Java API參考
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.