2014-06-25 63 views
0

我有一個集合,我想將Nodes的值寫入到一個mysql表中。現在我連接到數據庫,創建一個聲明,然後集合中的每個節點我跑更有效地將值插入到mysql表中

// open the connection then 
Statement statement = connect.createStatement(); 
for (Node n : vertices) { 
    statement.execute("INSERT INTO " + table + " (name, department) values ('" + n.getName() + "', '" + n.getOrgId() + "')"); 
} 
// then I close the connection 

我想知道是否有處理這類任務的更有效的方法。

+1

您可以使用[批處理](http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeBatch())另請嘗試使用[preparedstatement]( http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html) – SpringLearner

+1

將每個查詢添加到批處理語句([Statement#addBatch](http://docs.oracle)。 com/javase/7/docs/api/java/sql/Statement.html#addBatch(java.lang.String)))並在for循環之後執行批處理 – BackSlash

+1

您容易受到[SQL注入攻擊](http:/ /bobby-tables.com) –

回答

6

使用預處理語句:

String query = "insert into " + table + " (name, department) values (?,?)"; 
try(PreparedStatement ps = connection.prepareStatement(query)) { 
    for(Node n : vertices) { 
     ps.setString(1, n.getName()); 
     ps.setInt(2, n.getOrgId()); 
     ps.addBatch(); 
    } 
    ps.executeBatch(); 
} catch(SQLException e) { 
    // Exception handling 
} 

通知的,因爲你的查詢是建立它的方式,仍然容易受到SQL注入attacs(因爲你正在構建的字符串以變量table)。我建議您刪除table變量或採取措施確保該程序的任何用戶都不會看到該變量。

1

嘗試準備查詢的多重插入,然後在一次執行:

String query = "INSERT INTO " + table + " (name, department) values"; 
for (Node n : vertices) { 
    query += " ('" + n.getName() + "', '" + n.getOrgId() + "')"); 
} 

statement.execute(query); 
+0

缺少一個逗號來分隔插入的值:'insert into tbl(field1,field2)values(v11,v12),(v21,v22),...,(vn1,vn2) ;'而且,您的查詢不能幫助解決SQL注入攻擊風險。 – Barranka

1

您可以同時插入多行。

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 

Check this Link