Java 使用JDBC更新数据库,其中包含一些应忽略的值

Java 使用JDBC更新数据库,其中包含一些应忽略的值,java,database,jdbc,spring-jdbc,Java,Database,Jdbc,Spring Jdbc,我在使用JDBC更新表列时遇到了一些问题。如果我有一个表,例如User(姓名、地址、爱好等)想象一下大约15个字段。然后我通过前端从表单中获取一个对象,用户可以在其中键入所有应该更改的条目。现在我需要将更改保存到数据库中,但并非所有字段都已更改,因此我的DAO有一些null值。例如,应更改名称和地址,表中的其他条目不应更改。有什么聪明的方法可以将其放入JDBCPreparedStatement?或者你知道其他的解决方案吗?我试图避免大量的值!=空语句 提前谢谢 (我使用spring作为后端,在前

我在使用JDBC更新表列时遇到了一些问题。如果我有一个表,例如
User(姓名、地址、爱好等)
想象一下大约15个字段。然后我通过前端从表单中获取一个对象,用户可以在其中键入所有应该更改的条目。现在我需要将更改保存到数据库中,但并非所有字段都已更改,因此我的DAO有一些
null
值。例如,应更改
名称
地址
,表中的其他条目不应更改。有什么聪明的方法可以将其放入JDBC
PreparedStatement
?或者你知道其他的解决方案吗?我试图避免大量的
值!=空
语句

提前谢谢


(我使用spring作为后端,在前端使用angular)

既然您使用spring,您可以使用
名称参数jdbcTemplate
,但真正的技巧是使用
合并
在给定值为
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
}

因为您使用的是Spring,所以可以使用
NamedParameterJdbcTemplate
,但真正的技巧是在给定值为
NULL
时使用
COALESCE

@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
}

可以使用的简单解决方案是使用SimpleJdbcInsert并使用GeneratedKeyColumns(“ID”)添加

@Autowired
私有数据源;
@凌驾
公共责任插入(实体obj){
SimpleJDBCCINSERT SimpleJDBCCINSERT=新的SimpleJDBCCINSERT(jdbcTemplate.getDataSource());
simpleJdbcInsert.withTableName(TABLE_APP_REPO)。使用GeneratedKeyColumns(“ID”);
BeanPropertySqlParameterSource paramSource=新的BeanPropertySqlParameterSource(obj);
试一试{
simpleJdbcInsert.execute(paramSource);
}捕获(例外e){
返回ResponseEntity.badRequest().build();
}
返回ResponseEntity.ok().build();
}

您可以使用的简单解决方案是使用SimpleJdbcInsert并使用GeneratedKeyColumns(“ID”)添加

@Autowired
私有数据源;
@凌驾
公共责任插入(实体obj){
SimpleJDBCCINSERT SimpleJDBCCINSERT=新的SimpleJDBCCINSERT(jdbcTemplate.getDataSource());
simpleJdbcInsert.withTableName(TABLE_APP_REPO)。使用GeneratedKeyColumns(“ID”);
BeanPropertySqlParameterSource paramSource=新的BeanPropertySqlParameterSource(obj);
试一试{
simpleJdbcInsert.execute(paramSource);
}捕获(例外e){
返回ResponseEntity.badRequest().build();
}
返回ResponseEntity.ok().build();
}

没有任何代码,很难帮助您。在我看来,您应该首先从数据库中检索实际值,然后让用户修改这些值。那么你就不会有任何空值。没有任何代码就很难帮助你。在我看来,您应该首先从数据库中检索实际值,然后让用户修改这些值。那么你就不会有任何空值了。