开发者社区> 问答> 正文

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

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

提前致谢!

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

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 14:56:26 617 0
1 条回答
写回答
取消 提交回答
  • 由于您使用的是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);
    }
    

    回答来源:Stack Overflow

    2020-03-23 14:57:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载