Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PreparedStatement不在MySQL中工作的JDBC批处理_Java_Mysql_Jdbc - Fatal编程技术网

Java PreparedStatement不在MySQL中工作的JDBC批处理

Java PreparedStatement不在MySQL中工作的JDBC批处理,java,mysql,jdbc,Java,Mysql,Jdbc,规范: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')" "i

规范: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
Preparestatement pst=null;
字符串[]sqlx={
“插入abc('col1','col2')值('first','data')”
“插入abc('col1','col2')值('second','data')”
“插入abc('col1','col2')值('third','data')”
};
for(字符串sqIn:sqlx){
pst=准备陈述(sqIn);
pst.addBatch();
}
int[]chkSql=pst.executeBatch();
//检查chkSql是否包含0..rollback else commit for>0
在代码的调试模式下,chkSql总是有“1”…这让人头晕目眩吗? 只有一行插入成功,其他行未插入


这是MYSQLDB或JAR的一个bug吗???

我不知道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')"
};

我不知道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')"
};
尝试运行此代码。连接是您的
连接
对象。如果不想在运行时设置值,也不要使用准备好的语句

看看这种疑问,

以及准备好的声明

我希望这能帮助你理解什么时候使用什么

尝试运行此代码。连接是您的
连接
对象。如果不想在运行时设置值,也不要使用准备好的语句

看看这种疑问,

以及准备好的声明


我希望这有助于您理解何时使用什么

看起来您在每次迭代中都在创建一个新的,因此
executeBatch()
将只应用于最后一个
PreparedStatement
对象

此外,
PreparedStatement
用于避免SQL注入,在使用
占位符系统时,它负责值转义

您使用的方法用于处理可变参数:

void addBatch() 抛出SQLException

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

,而不是像您尝试的那样使用原始查询(为此,您将使用

void addBatch(字符串sql) 抛出SQLException

将给定的SQL命令添加到此命令的当前命令列表中 语句对象。此列表中的命令可以作为批处理执行 通过调用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

看起来您在每次迭代时都在创建一个新语句,因此
executeBatch()
将只应用于最后一个
PreparedStatement
对象

此外,
PreparedStatement
用于避免SQL注入,在使用
占位符系统时,它负责值转义

您使用的方法用于处理可变参数:

void addBatch() 抛出SQLException

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

,而不是像您尝试的那样使用原始查询(为此,您将使用

void addBatch(字符串sql) 抛出SQLException

将给定的SQL命令添加到此命令的当前命令列表中 语句对象。此列表中的命令可以作为批处理执行 通过调用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

我认为你应该
pst.executeBatch()
中,因为你的字符串数组甚至没有编译。你缺少
在每个字符串之后,对executeBatch进行了良好的检查,尽管还有更多的检查:
如果(chkSql[x]==语句。EXECUTE\u失败)抛出异常()
尽管它将依赖于实现。我自己仍然与mysql有问题,因此无法确定。我认为您应该
pst.executeBatch()
for
中,您的字符串数组甚至没有编译。在每次stringGood检查executeBatch后,您都会丢失
,尽管您应该检查更多内容:
如果(chkSql[x]==语句.EXECUTE\u失败)抛出异常()
尽管它依赖于实现。我自己仍然与mysql有问题,因此无法确定。您的sql也不工作。它的insert into not insert to您的sql也不工作。它的insert into not insert to