以下代码尝试执行3次批量插入。第二批第二批声明故意错误(INSERTD)。当我运行该程序时,应执行第1和第3批,并将数据插入数据库。
但它没有插入数据。有人能说出原因吗?如何修复,以便无论其他批次如何都应执行正确的批次。
public class Test {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
ArrayList<String> finalsql1 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN2','WRL')");
ArrayList<String> finalsql2 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERTD INTO M_TEST VALUES('PUJAN2','WRL')");
ArrayList<String> finalsql3 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN2','WRL')");
System.out.println("OP1=" + insertEntity(finalsql1));
System.out.println("OP2=" + insertEntity(finalsql2));
System.out.println("OP3=" + insertEntity(finalsql3));
}
public static boolean insertEntity(ArrayList<String> finalsql) throws SQLException {
Connection conn = null;
Statement ps = null;
boolean result = false;
try {
conn = getConnection();
conn.setAutoCommit(false);
ps = conn.createStatement();
for (String sql : finalsql) {
System.out.println("sql > " + sql);
ps.addBatch(sql);
}
int[] count = ps.executeBatch();
result = true;
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
result = false;
} finally {
conn.commit();
ps.close();
conn.close();
}
return result;
}
}
输出
OP1 =真
OP2 =假
OP3 =真
答案 0 :(得分:1)
只有一批带有任何数据的插入,这包括INSERTD
因此它正在回滚。为什么?这就是原因:
ArrayList<String> finalsql2 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERTD INTO M_TEST VALUES('PUJAN2','WRL')");
您仍在此处向finalsql1
添加条目,因此finalsql2
和finalsql2
为空。
finalsql1
包含所有条目,包括故意的错误,因此整个批次都会回滚。
答案 1 :(得分:1)