批处理的单一准备语句

时间:2013-07-23 05:55:54

标签: java jdbc prepared-statement batch-processing

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

首先我将AutoCommit(false)设置为连接obj。

然后dmlPreparedStatement = dbConnection.prepareStatement(Insertquery);

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

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

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

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

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

代码块中的代码

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;

2 个答案:

答案 0 :(得分:2)

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

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

执行更新批处理时,您需要使用connection.commit();提交事务,或者在出现故障时将其回滚。

example

中的详细信息

答案 1 :(得分:0)

PreparedStatement对象,用于多次执行相同的SQL语句而不是多个SQL   多次发表声明。 加入Docs

  

SQL语句已预编译并存储在PreparedStatement对象中,因此您可以使用输入参数的更改多次执行相同的预编译SQL语句,从而提高性能。

这里你没有改变输入参数,你正在改变PreparedStatement对象 通过声明dmlPreparedStatement = dbConnection.prepareStatement(Updatequery);
然后你在newley创建的Object上调用executeBatch()方法 这意味着您将执行最后一个预编译查询并加入上一个查询。