Обновить несколько полей в одном запросе PUT - PullRequest
0 голосов
/ 14 июля 2020

У меня есть таблица Client в Oracle со следующими полями и их значениями:

+----------+--------------+----------------------+------------------+-----------+----------+
|client_id |  client_name |         url          |  connection_pool | username  | password |
+----------+--------------+----------------------+------------------+-----------+----------+
|  test    |   clientDb   | http://clienturl.com |       QA_DB      |  user     |  admin   |
--------------------------------------------------------------------------------------------

Я создал PUT запрос в моем Java приложении, которое обновляет поля.

@PUT
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
public Boolean updateClient(@PathParam("id") String id, Client client) throws DaoException {
    this.setupController();
    return controller.updateClientDetails(id, client);
} 

ClientsController:

public Boolean updateClientDetails(String id, Client client) throws DaoException {
    Client dbClient = clientDao.getClient(id)); //returns client present in table on basis of client_id
    if (!client.getName().equals(dbClient.getName())) {
        return clientDao.updateClientName(id, client.getName());
    }
    if (!client.getUrl().equals(dbClient.getUrl())) {
        return clientDao.updateClientUrl(id, client.getUrl());
    }
    else {
        LOGGER.info("Unable to update client {}", id);
        return false;
    }
}

ClientDao: Я обновляю client_name и url отдельно, как показано ниже:

public Boolean updateClientName(String id, String name) throws DaoException {
    final String sql = "UPDATE client SET client_name = ? WHERE client_id = ?";
    LOGGER.debug(SQL_STRING.toLogback(sql), name, id);
    try (final Connection connection = dataSource.getConnection();
            final PreparedStatement statement = connection.prepareStatement(sql)) {
        statement.setString(1, name);
        statement.setString(2, id);
        statement.executeUpdate();
        return true;
    } catch (SQLException ex) {
        LOGGER.debug("Exception while updating client {} ", id, ex);
        throw new DaoException(ex);
    }
}

//updateClientUrl(String id, String url) method - similar logic as above for updating url value

При отправке запроса PUT он обновляет поля по одному то есть, если я изменяю / обновляю более одного значения в объекте Client в запросе body обновляет одно поле в первом запросе. Чтобы обновить второй атрибут, мне нужно отправить запрос еще раз.

Мне интересно, есть ли способ обновить более одного значения в одном запросе вместо того, чтобы отправлять больше, чем 1 запрос и наличие нескольких методов обновления для каждого поля?

Решение может быть простым, но меня это не щелкает! Любая помощь приветствуется.

1 Ответ

0 голосов
/ 14 июля 2020

Если я вас правильно понял, вы хотите обновлять одно или несколько полей за раз. Для этого вам нужно построить свой запрос на основе вашего условия того, что вы хотите изменить, какую часть / столбец. Итак, эта ваша часть:

final String sql = "UPDATE client SET client_name = ? ";

нуждается в изменении. Вы должны создать свой запрос sql следующим образом (скажем, у вас есть объект client и его поле -):

String sql = "UPDATE client SET client_name = ?";
if(client.getUrl()!=null && !client.getUrl().isEmpty())
  sql+=", set url=?";
// similar for other fields you want to update
at last, concate your condition:
sql+=" WHERE client_id = ?";

Теперь вы должны предоставить те поля, которые вы установили динамически для своего запрос для обновления:

statement.setString(1, name);
if(client.getUrl()!=null && !client.getUrl().isEmpty())
{
  statement.setString(2, client.getUrl());
  statement.setString(3, id);
}
else
    statement.setString(2, id);

Для индексации в позиции запроса лучше использовать indexVariable, чтобы автоматически отслеживать его значение при условии.
Пожалуйста, жужжите, если это не отвечает вашему вопросу.
...