簡體   English   中英

使用JDBC將Java INSERT轉換為SQL數據庫

[英]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進行查詢的自定義類,或者使用某種Mapstatic鍵,它們可以是數據庫中列的直接名稱,也可以映射到數據庫中的列, 例如...

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插入到具有不同數據類型要求(例如DateTimeStamp和/或數字)的列中。 相反,您應該盡可能嘗試使用正確的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
}

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM