Java PreparedStatement不在MySQL中工作的JDBC批处理
规范:MYSQL 5.7.16、JDK1.7、TOMCAT 8、MYSQL-connector-java-6.0.4.jar、WINDOWS 10 下面的代码不会将批处理方法更新为dbJava 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
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