繁体   English   中英

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

[英]JDBC batch with PreparedStatement not working in MySQL

规格: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的错误吗?

似乎您在每次迭代时都创建一个新的PreparedStatement ,因此executeBatch()将仅应用于最后一个PreparedStatement对象。

此外,使用PreparedStatement可以避免SQL注入,并且当您使用?时,它可以将值转义? 占位符系统。

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

void addBatch()引发SQLException

将一组参数添加到此PreparedStatement对象的命令批中。

,而不是尝试执行的原始查询(为此,您将使用addBatch(java.lang.String query)

void addBatch(String 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
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对象。 如果您不想在运行时设置值,也不要使用预处理语句。

在这里看看这种查询,

并且, 这里准备了语句

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

不了解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')"
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM