2016-12-06 55 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 
相关问题