Java 更新数据时使用多个if语句
它是关于通过web请求更新数据,并且仅当参数数据不为空时才更新数据。我已经检查了常用的重构方法,但似乎想不出更好的方法Java 更新数据时使用多个if语句,java,Java,它是关于通过web请求更新数据,并且仅当参数数据不为空时才更新数据。我已经检查了常用的重构方法,但似乎想不出更好的方法 if (StringUtils.isNotBlank(request.getFieldA()) { dataModel.setFieldA(request.getFieldA()); jpaRepository.save(dataModel); auditChange(request.getFieldA()); } 添加新字段时会出现问题。如果使用类似的构造添加新
if (StringUtils.isNotBlank(request.getFieldA()) {
dataModel.setFieldA(request.getFieldA());
jpaRepository.save(dataModel);
auditChange(request.getFieldA());
}
添加新字段时会出现问题。如果使用类似的构造添加新的If语句,它将更新数据库两次,这似乎是不可取的
if (StringUtils.isNotBlank(request.getFieldB()) {
dataModel.setFieldB(request.getFieldB());
jpaRepository.save(dataModel);
auditChange(request.getFieldB());
}
如果添加了原始的“If语句”检查,它可以避免多次数据库更新,但对于干净的代码和在第三个字段出现时开放扩展来说,这也不是一个很好的方法
if (StringUtils.isNotBlank(request.getFieldA()) || StringUtils.isNotBlank(request.getFieldB()) {
dataModel.setFieldA(StringUtils.isNotBlank(request.getFieldA()) ? request.getFieldA() : dataModel.getFieldA());
dataModel.setFieldB(StringUtils.isNotBlank(request.getFieldB()) ? request.getFieldB() : dataModel.getFieldB());
jpaRepository.save(dataModel);
if (StringUtils.isNotBlank(request.getFieldA())) {
auditChange(request.getFieldA());
}
if (StringUtils.isNotBlank(request.getFieldB())) {
auditChange(request.getFieldB());
}
}
为什么不将
jpaRepository.save()
从if
语句中移出并放在它们下面,这样:
boolean updated = false;
if (StringUtils.isNotBlank(request.getFieldB()) {
dataModel.setFieldB(request.getFieldB());
updated = true;
auditChange(request.getFieldB());
}
if (StringUtils.isNotBlank(request.getFieldA()) {
dataModel.setFieldA(request.getFieldA());
updated = true;
auditChange(request.getFieldA());
}
if (updated)
jpaRepository.save(dataModel);
或者,如果更新数据库后必须进行auditChange
:
boolean updated = false;
if (StringUtils.isNotBlank(request.getFieldB()) {
dataModel.setFieldB(request.getFieldB());
updated = true;
}
if (StringUtils.isNotBlank(request.getFieldA()) {
dataModel.setFieldA(request.getFieldA());
updated = true;
}
if (updated)
jpaRepository.save(dataModel);
if (StringUtils.isNotBlank(request.getFieldB()) {
auditChange(request.getFieldB());
}
if (StringUtils.isNotBlank(request.getFieldA()) {
auditChange(request.getFieldA());
}
您的用例与补丁请求的相似性-仅在请求中定义更改字段。(请注意,在您的实现中,如何故意将字段设置为null?)
查看Spring Boot中json补丁实现的详细信息让JPA/Hibernate处理事务中实体的更新/更改字段。 只需在Hibernate实体pojo上添加注释
@DynamicInsert
@DynamicUpdate
以及@Entity
大概是这样的:
@Entity
@Table(name = "users")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@DynamicInsert
@DynamicUpdate
public class User {
//...
}
@DynamicInsert
注释指出,对于插入,该实体是否应该使用动态sql生成,其中在准备好的sql语句中只引用非空列
@DynamicUpdate
注释指出,为了更新,该实体是否应该使用动态sql生成,其中在准备好的sql语句中只引用更改的列
注意:如果您发现sql
insert
操作运行不正常,可以删除@DynamicInsert
。(有时我也是如此。)强制性的lambda和streams解决方案:
static boolean updateField(String newValue, Consumer<String> setter ) {
if (StringUtils.isNotBlank(newValue)) {
setter.accept(newValue);
auditChange(newValue);
return true;
}
return false;
}
...
if (Stream.of(
updateField(request.getFieldA(), v -> model.setFieldA(v)),
updateField(request.getFieldB(), v -> model.setFieldB(v))
).anyMatch(b -> b))
{
jpaRepository.save(dataModel);
}
静态布尔更新字段(字符串newValue,使用者setter){
if(StringUtils.isNotBlank(newValue)){
setter.accept(newValue);
审核变更(新值);
返回true;
}
返回false;
}
...
如果(流)(
updateField(request.getFieldA(),v->model.setFieldA(v)),
updateField(request.getFieldB(),v->model.setFieldB(v))
).anyMatch(b->b))
{
jpaRepository.save(数据模型);
}
anyMatch
在找到第一个真值时停止,但这没关系,因为我们在创建流时预先做了副作用