2016-12-06 51 views
0
不工作

SPEC:MYSQL 16年5月7日,JDK1.7,TOMCAT 8,MySQL的連接器的Java-6.0.4.jar,WINDOWS 10JDBC批次的PreparedStatement在MySQL

下面的代碼不更新批量方法爲db

Preparestatement pst = null; 
String[] sqlx = { 
"insert to abc('col1','col2')values('first', 'data')" 
"insert to abc('col1','col2')values('second','data')" 
"insert to abc('col1','col2')values('third', 'data')" 
}; 

for(String sqIn : sqlx){ 
    pst = <jdbcConn>.preparestatement(sqIn); 
    pst.addBatch(); 
} 
int[] chkSql = pst.executeBatch(); 
//check if chkSql consists of 0..rollback else commit for > 0 

在代碼的調試模式,chkSql總是具有 '1' ..this是暈? 只有1行插入成功,其他插入不成功。

這是MYSQLDB或JAR的錯誤嗎?

+1

我想你應該'pst.executeBatch()'內'for' –

+0

您String數組,甚至不進行編譯。在每個字符串後面都缺少'','' – XtremeBaumer

+0

對executeBatch進行了很好的檢查,儘管還有更多的你應該檢查:if(chkSql [x] == Statement.EXECUTE_FAILED)throw Exception();'雖然它會被實現依賴。仍然有問題與自己的MySQL,所以不能確定。 – Adam

回答

1
Statement stmt = null; 
String[] sqlx = { 
    "insert into abc(col1,col2) values('first', 'data')", 
    "insert into abc(col1,col2) values('second','data')", 
    "insert into abc(col1,col2) values('third', 'data')" 
}; 
for(String sqIn : sqlx){ 
    stmt.addBatch(sqIn); 
} 
int[] chkSql = stmt.executeBatch(); 

嘗試運行這段代碼。連接是您的Connection對象。如果您不想在運行時設置值,也不要使用預準備語句。

看一看這類查詢here的,

,並準備語句here

我希望這可以幫助你瞭解什麼時候使用它看起來什麼

0

不知道關於JDBC/Java,但您的發佈INSERT聲明是明顯錯誤的。你不應該引用列名,否則它將被視爲字符串字面而不是列。它應該是

insert to abc(col1,col2)values('first', 'data') 

如您發佈的代碼,它應該看起來像

String[] sqlx = { 
"insert into abc(col1,col2)values('first', 'data')", 
"insert into abc(col1,col2)values('second','data')", 
"insert into abc(col1,col2)values('third', 'data')" 
}; 
+0

你的SQL也不起作用。其插入到不插入到 – XtremeBaumer

+0

@XtremeBaumer,啊!傻我。感謝您指出它。 – Rahul

2

就像你正在創建一個新的PreparedStatement在每次迭代中,所以executeBatch()將只應用於最後一個PreparedStatement對象。

此外,當您使用?佔位符系統時,PreparedStatement用於避免SQL注入,並且它會處理值轉義。

addBatch()方法使用的是指具有可變參數的工作:

空隙addBatch() 拋出的SQLException

將一組參數添加到此PreparedStatement對象的批處理 命令。

,不能與原始查詢,如你試圖做的(對於這一點,你會用addBatch(java.lang.String query)

無效addBatch(字符串SQL) 拋出的SQLException

將給定的SQL命令到當前的 Statement對象的命令列表,這個列表中的命令可以通過調用executeBatch方法以批處理 的方式執行。

下面的例子應該做你想要什麼:

String[][] data = { { "first", "data" }, { "second", "data" }, { "third", "data" } }; 

String sql = "insert into abc(col1,col2) values (?, ?)";// use placeholders 

PreparedStatement pst = connection.prepareStatement(sql);// create a single statement 

for (String[] row : data) { 

     // set parameters 
     pst.setString(1, row[0]); 
     pst.setString(2, row[1]); 

     pst.addBatch();// validate the set 
} 

int[] chkSql = pst.executeBatch(); // execute the batch of commands 
//check if chkSql consists of 0..rollback else commit for > 0 
相關問題