使用JDBC更新具有一些应忽略的值的数据库

问题描述 投票:0回答:1

使用JDBC更新表列时遇到一些麻烦。如果我有一张表格,例如User(name,address,hobby,...),请想象大约15个字段。然后,我通过前端从表单中获得一个对象,用户可以在其中键入应更改的所有条目。现在,我需要将更改保存到数据库中,但是并非所有字段都已更改,因此我的DAO具有一些null值。例如,应更改nameaddress,而表中的其他条目则不应更改。有什么聪明的方法可以将其放入JDBC PreparedStatement?还是您知道其他解决方案?我试图避免使用很多value != null语句。

提前感谢!

((我使用spring作为后端,前端使用角度)

java database jdbc spring-jdbc
1个回答
0
投票

由于您使用的是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);
}
© www.soinside.com 2019 - 2024. All rights reserved.