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