使用PreparedStatement的JDBC批处理在MySQL中不起作用

时间:2016-12-06 13:22:08

标签: java mysql jdbc

SPEC:MYSQL 5.7.16,JDK1.7,TOMCAT 8,mysql-connector-java-6.0.4.jar,WINDOWS 10

以下代码不会将批处理方法更新为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'..这是晕吗? 仅成功插入1行,未插入其他行。

这是MYSQLDB还是JAR ????

的错误

3 个答案:

答案 0 :(得分:2)

看起来您在每次迭代时都会创建一个新的PreparedStatement,因此string = "a[0]['c']" 只会应用于最后一个executeBatch()对象。

此外,PreparedStatement用于避免SQL注入,当您使用PreparedStatement占位符系统时,它会处理值转义。

您使用的addBatch()方法适用于可变参数:

  

void addBatch()                 抛出SQLException

     

向此PreparedStatement对象的批处理添加一组参数   命令。

,不是您尝试过的原始查询(为此,您可以使用addBatch(java.lang.String query)

  

void addBatch(String sql)                 抛出SQLException

     

将给定的SQL命令添加到当前的命令列表中   声明对象。此列表中的命令可以批量执行   通过调用executeBatch方法。

以下示例应该执行您想要的操作:

?

答案 1 :(得分: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

我希望这可以帮助您了解何时使用

答案 2 :(得分: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')"
};