Обновите базу данных с помощью JDB C, имеющей некоторые значения, которые следует игнорировать - PullRequest
0 голосов
/ 16 марта 2020

У меня проблемы с использованием JDB C для обновления столбца таблицы. Если у меня есть таблица, например, User(name,address,hobby,...), представьте себе около 15 полей. Затем я получаю через интерфейс Object из формы, где пользователь может вводить все записи, которые должны быть изменены. Теперь мне нужно сохранить изменения в базе данных, но не все поля были изменены, поэтому в моем DAO есть null значения. Например, name и address должны быть изменены, другие записи в таблице не должны. Есть какой-нибудь умный способ поместить это в JDB C PreparedStatement? Или вы знаете другие решения? Я стараюсь избегать множества value != null заявлений.

Заранее спасибо!

(я использую Spring в качестве моего бэкэнда и angular во внешнем интерфейсе)

1 Ответ

2 голосов
/ 16 марта 2020

Поскольку вы используете Spring, вы можете использовать NamedParameterJdbcTemplate, но реальная хитрость - это использование COALESCE для использования запасного значения, когда задано значение NULL:

@Autowired
private DataSource dataSource;

public void updateUser(int id, String name, String address, String hobby) {
    NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    String sql = "UPDATE User" +
                   " SET Name = COALESCE(:name, Name)" +
                      ", Address = COALESCE(:address, Address)" +
                      ", Hobby = COALESCE(:hobby, Hobby)" +
                 " WHERE Id = :id";
    MapSqlParameterSource paramMap = new MapSqlParameterSource();
    paramMap.addValue("id"     , id     , Types.INTEGER);
    paramMap.addValue("name"   , name   , Types.VARCHAR);
    paramMap.addValue("address", address, Types.VARCHAR);
    paramMap.addValue("hobby"  , hobby  , Types.VARCHAR);
    if (jdbcTemplate.update(sql, paramMap) == 0)
        throw new EmptyResultDataAccessException("User not found: " + id, 1);
}

Или, если вы используете POJO с данными пользователя:

public class User {
    private int id;
    private String name;
    private String address;
    private String hobby;

    // Getters and setters here
}
public void updateUser(User user) {
    NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    String sql = "UPDATE User" +
                   " SET Name = COALESCE(:name, Name)" +
                      ", Address = COALESCE(:address, Address)" +
                      ", Hobby = COALESCE(:hobby, Hobby)" +
                 " WHERE Id = :id";
    BeanPropertySqlParameterSource paramMap = new BeanPropertySqlParameterSource(user);
    if (jdbcTemplate.update(sql, paramMap) == 0)
        throw new EmptyResultDataAccessException("User not found: " + id, 1);
}
...