gpt4 book ai didi

java - 用于批处理的单个准备语句

转载 作者:行者123 更新时间:2023-11-30 04:18:15 27 4
gpt4 key购买 nike

我想在一个表中插入记录,同时我想更新另一个表中的记录。为此,我想使用事务,如果任何一个查询失败,那么所有查询都将回滚。为此,我使用批处理...步骤如下

首先,我将 AutoCommit(false) 设置为连接对象。

然后dmlPreparedStatement = dbConnection.prepareStatement(Insertquery);

  • dmlPreparedStatement 设置参数
  • dmlPreparedStatement.addBatch();

在此之后,我想批量添加UPDATE查询,为此我做了-

  • dmlPreparedStatement = dbConnection.prepareStatement(Updatequery);相同的PreparedStatement对象,但具有新的更新查询
  • dmlPreparedStatement 设置参数
  • dmlPreparedStatement.addBatch();

dmlPreparedStatement.executeBatch();完成时,它只执行更新语句插入操作不完成。

他们是否可以使用相同的PreparedStatement对象来进行多个差异。查询。

TRY block 中的代码

String query="INSERT INTO CANDIDATEANSWER " +
"(CANDIDATEEXAMITEMID,FKCANDIDATEID,FKITEMID,OPTIONID,ATTEMPTEDTIME,ISCORRECT) " +
"VALUES (?,?,?,?,?,?)";
dbConnection = icrudCandidate.getConnection();
dbConnection.setAutoCommit(false);
dmlPreparedStatement = dbConnection.prepareStatement(query);
for (CandidateAnswer candidateAnswer : candidateItemAssociation.getCandidateAnswers()) {
if(candidateAnswer.getOptionID() != 0)
{
dmlPreparedStatement.setLong(1, candidateAnswer.getCandidateExamItemID());
dmlPreparedStatement.setLong(2, candidateAnswer.getFkcandidateID());
dmlPreparedStatement.setLong(3, candidateAnswer.getFkItemID());
dmlPreparedStatement.setLong(4, candidateAnswer.getOptionID());
java.util.Date dt = new java.util.Date();
dmlPreparedStatement.setObject(5, dt,java.sql.Types.TIMESTAMP,java.sql.Types.TIMESTAMP);
String sql = "SELECT ISCORRECT FROM ITEMOPTION IO WHERE IO.OPTIONID="+candidateAnswer.getOptionID();
preparedStatement = dbConnection.prepareStatement(query);
resultSet = preparedStatement.executeQuery(sql);
while(resultSet.next())
{
if(resultSet.getBoolean("ISCORRECT"))
{
dmlPreparedStatement.setBoolean(6, true);
}
else
{
isCorrect=false;
dmlPreparedStatement.setBoolean(6, false);
}
}
resultSet.close();
}
dmlPreparedStatement.addBatch();
}
query="UPDATE CANDIDATEITEMASSOCIATION SET ISCORRECT=?,MARKSOBTAINED=? WHERE CANDIDATEEXAMITEMID="+candidateItemAssociation.getCandidateAnswers().get(0).getCandidateExamItemID();
PreparedStatement dmlPreparedStatement1 = dbConnection.prepareStatement(query);
dmlPreparedStatement1.setBoolean(1, isCorrect);
if(isCorrect)
{
dmlPreparedStatement1.setString(2, String.valueOf(getPerItemMarksByPaperId(paperId)));
}
else
{
dmlPreparedStatement1.setString(2, String.valueOf((getNagetiveMarksPerItemByPaperIdAndEventID(eventID,paperId)*-1)));
}
dmlPreparedStatement1.addBatch();

int[] count = dmlPreparedStatement.executeBatch();
count = dmlPreparedStatement1.executeBatch();
dbConnection.commit();
return true;

最佳答案

批处理和事务是两个不同的东西:使用批处理时,如果中间出现故障,您不会得到回滚。批处理的主要优点是它允许您执行具有多个参数的同一指令

您需要做的是在开始更新之前使用 dmlPreparedStatement.executeBatch(); 执行第一个插入批处理。

执行更新批处理后,您需要使用connection.commit();提交事务,或者在失败时回滚它。

更多信息在此 example

关于java - 用于批处理的单个准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17802415/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com