пакетное обновление для обновления нескольких записей в spring mvc с помощью mysql

У меня есть проблема, которая предполагает, что у меня изначально было 100 записей, и я показал их в пользовательском интерфейсе в виде списка пользователей. Теперь я дал возможность деактивировать числовых пользователей, нажав кнопку «деактивировать», которая размещена напротив каждой отдельной записи, затем я собираю всех «деактивированных» пользователей в список и отправляю его на уровень DAO. [логика деактивации пользователя просто установить для флага «isDeleted» значение true, т.е. мягкое удаление. Так что это так же хорошо, как я обновляю несколько записей, идентификаторы которых я поместил в список]. список-> и для каждой записи запускайте запрос на обновление флага isDeleted до true, но это неосуществимое решение, если у меня есть, скажем, 5000 записей, которые нужно удалить одновременно. Я слышал и реализовал концепцию пакетного обновления для "вставки" нескольких записей одновременно, но я не понимаю, как я могу использовать пакетное обновление для обновления нескольких записей только за один вызов БД. Пожалуйста, помогите, Пакетное обновление код для вставки следующий,

 private static final String INSERT_USER_PERMISSION =
            "INSERT INTO permission_transaction(permissionId,userId,isDeleted) "
          + "VALUES(?,?,?)";

 @Transactional
    public void addPermission(final UserVO userVo, final List<PermissionVO> permissionVoList)
            throws Exception {
        logger.info("Adding user permission, for userId: "+userVo.getUserId());

        try {
            jdbc.batchUpdate(INSERT_USER_PERMISSION, new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {

                    PermissionVO permissionVo = permissionVoList.get(i);
                    ps.setInt(1, permissionVo.getPermissionId());
                    ps.setInt(2, userVo.getUserId());
                    ps.setBoolean(3, false);
                }
                @Override
                public int getBatchSize() {
                    return permissionVoList.size();
                }
            });
            logger.info("Exiting addPermission, for userId: "+userVo.getUserId());
        }catch (Exception e) {
            logger.error("Error in adding user permission: " + e.getMessage(), e);
            throw e;
        }

    }

person Vish    schedule 11.06.2016    source источник


Ответы (1)


Эй, я нашел решение, вот что я сделал,

  private static final String UPDATE_CLIENT_OWNER = 
            "UPDATE clientowner SET "
          + "clientOwnerName=?,"
          + "clientOwnerPhone=?,"
          + "clientOwnerEmail=?,"
          + "lastUpdatedOn=NOW() "
          + "WHERE clientOwnerId=?";
 @Transactional
    public void updateClientOwner(int clientId, List<ClientOwnerVO> clientOwnerVoList) throws Exception {
        logger.info("Updating client Owner(s)");
        try{
           int[] count = jdbc.batchUpdate(UPDATE_CLIENT_OWNER, new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {

                    ClientOwnerVO clientOwnerVO = clientOwnerVoList.get(i);
                    ps.setString(1, clientOwnerVO.getClientOwnerName());
                    ps.setString(2, VariableEncryption.encrypt(clientOwnerVO.getClientOwnerPhone(), clientOwnerVO.getCreatedOn()));
                    ps.setString(3, VariableEncryption.encrypt(clientOwnerVO.getClientOwnerEmail(), clientOwnerVO.getCreatedOn()));
                    ps.setInt(4, clientOwnerVO.getClientOwnerID());

                }
                @Override
                public int getBatchSize() {
                    return clientOwnerVoList.size();
                }
            });
           logger.info("Exiting After successfully updating "+count.toString()+" client owners");


        }catch (Exception e) {
            logger.error("Error in updating client owners: " + e.getMessage(), e);
            throw e;
        }
person Vish    schedule 13.06.2016