具有不同 sql 查询的批处理准备语句
batch preparedstatement with different sql queries
我发现这个问题的现有问题 similar 实际上没有明确的答案。
带有一个 sql 查询的普通批准备语句看起来像这样:
private static void batchInsertRecordsIntoTable() throws SQLException {
Connection dbConnection = null;
PreparedStatement preparedStatement = null;
String insertTableSQL = "INSERT INTO DBUSER"
+ "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES"
+ "(?,?,?,?)";
try {
dbConnection = getDBConnection();
preparedStatement = dbConnection.prepareStatement(insertTableSQL);
dbConnection.setAutoCommit(false);
preparedStatement.setInt(1, 101);
preparedStatement.setString(2, "mkyong101");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
preparedStatement.addBatch();
preparedStatement.setInt(1, 102);
preparedStatement.setString(2, "mkyong102");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
preparedStatement.addBatch();
preparedStatement.setInt(1, 103);
preparedStatement.setString(2, "mkyong103");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
preparedStatement.addBatch();
preparedStatement.executeBatch();
dbConnection.commit();
System.out.println("Record is inserted into DBUSER table!");
} catch (SQLException e) {
System.out.println(e.getMessage());
dbConnection.rollback();
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
}
取自:http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/
但是,我正在寻找一种方法来对 不同的 sql 查询执行批量事务。即 INSERT INTO TABLE A
和 INSERT INTO TABLE B
没有 SQL 注入攻击的风险。我知道 preparedstatements 是避免此类攻击的首选方法,但我不知道在区分 SQL 查询时进行批处理的方法?
对于两 (2) 个不同的 SQL 查询,您将需要两 (2) 个不同的 PreparedStatement
对象,每个对象都有自己的批次,但您可以在需要时简单地执行每个批次将查询发送到服务器:
try (
PreparedStatement thisPs = conn.prepareStatement("INSERT INTO thisTable (thisId, thisText) VALUES (?,?)");
PreparedStatement thatPs = conn.prepareStatement("INSERT INTO thatTable (thatId, thatText) VALUES (?,?)")) {
thisPs.setInt(1, 1);
thisPs.setString(2, "thisText1");
thisPs.addBatch();
thatPs.setInt(1, 1);
thatPs.setString(2, "thatText1");
thatPs.addBatch();
thisPs.setInt(1, 2);
thisPs.setString(2, "thisText2");
thisPs.addBatch();
thatPs.setInt(1, 2);
thatPs.setString(2, "thatText2");
thatPs.addBatch();
thisPs.executeBatch();
thatPs.executeBatch();
}
另外,请注意术语。谈论 "batch transaction" 有点模棱两可:
addBatch
和 executeBatch
是将多个语句作为单个 batch(传输)发送到服务器的机制的一部分.这会影响语句 发送(传输)到 数据库服务器的方式。
数据库事务是一种机制,通过该机制可以将多个语句作为一个完整的组进行处理,即整个 组将被处理 ("committed") 或 整个 组将被丢弃 ("rolled back")。 Connection#setAutoCommit()
、Connection#commit()
和 Connection#rollback()
方法控制此行为。这会影响数据库服务器执行语句的方式。
我发现这个问题的现有问题 similar 实际上没有明确的答案。
带有一个 sql 查询的普通批准备语句看起来像这样:
private static void batchInsertRecordsIntoTable() throws SQLException {
Connection dbConnection = null;
PreparedStatement preparedStatement = null;
String insertTableSQL = "INSERT INTO DBUSER"
+ "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES"
+ "(?,?,?,?)";
try {
dbConnection = getDBConnection();
preparedStatement = dbConnection.prepareStatement(insertTableSQL);
dbConnection.setAutoCommit(false);
preparedStatement.setInt(1, 101);
preparedStatement.setString(2, "mkyong101");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
preparedStatement.addBatch();
preparedStatement.setInt(1, 102);
preparedStatement.setString(2, "mkyong102");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
preparedStatement.addBatch();
preparedStatement.setInt(1, 103);
preparedStatement.setString(2, "mkyong103");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
preparedStatement.addBatch();
preparedStatement.executeBatch();
dbConnection.commit();
System.out.println("Record is inserted into DBUSER table!");
} catch (SQLException e) {
System.out.println(e.getMessage());
dbConnection.rollback();
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
}
取自:http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/
但是,我正在寻找一种方法来对 不同的 sql 查询执行批量事务。即 INSERT INTO TABLE A
和 INSERT INTO TABLE B
没有 SQL 注入攻击的风险。我知道 preparedstatements 是避免此类攻击的首选方法,但我不知道在区分 SQL 查询时进行批处理的方法?
对于两 (2) 个不同的 SQL 查询,您将需要两 (2) 个不同的 PreparedStatement
对象,每个对象都有自己的批次,但您可以在需要时简单地执行每个批次将查询发送到服务器:
try (
PreparedStatement thisPs = conn.prepareStatement("INSERT INTO thisTable (thisId, thisText) VALUES (?,?)");
PreparedStatement thatPs = conn.prepareStatement("INSERT INTO thatTable (thatId, thatText) VALUES (?,?)")) {
thisPs.setInt(1, 1);
thisPs.setString(2, "thisText1");
thisPs.addBatch();
thatPs.setInt(1, 1);
thatPs.setString(2, "thatText1");
thatPs.addBatch();
thisPs.setInt(1, 2);
thisPs.setString(2, "thisText2");
thisPs.addBatch();
thatPs.setInt(1, 2);
thatPs.setString(2, "thatText2");
thatPs.addBatch();
thisPs.executeBatch();
thatPs.executeBatch();
}
另外,请注意术语。谈论 "batch transaction" 有点模棱两可:
addBatch
和executeBatch
是将多个语句作为单个 batch(传输)发送到服务器的机制的一部分.这会影响语句 发送(传输)到 数据库服务器的方式。数据库事务是一种机制,通过该机制可以将多个语句作为一个完整的组进行处理,即整个 组将被处理 ("committed") 或 整个 组将被丢弃 ("rolled back")。
Connection#setAutoCommit()
、Connection#commit()
和Connection#rollback()
方法控制此行为。这会影响数据库服务器执行语句的方式。