天天看点

随记:判断是否更新字段

问题背景:

在封装通用的数据库操作类时,对于“增、删、查”的编码没有太大问题,但是对于“改(更新)”,却出现了一个问题。

在首次存储一条记录时,可以将目标对象的所有字段值原样存入即可,有值则存值,为null则存null。

但在更新的时候,对于为null的字段,如何区分是“不更新该字段”,还是“将该字段更新为null”?

当然,可以先进行一次读取操作,然后在修改DTO对象的字段值,最终完全覆盖写入,但是,这就会多一次读取操作。

目前的解决方案:

对于DTO对象中的每个字段,设定一个无效默认值,用于标记该字段“未被修改过”,例如:

对于大多数整数类型字段,可以设定-99999为一个无效的默认值;

以“年龄(age)”字段为例,在DTO对象中,将age字段默认值设为-99999;

在执行更新操作的时候,判断age是否为-99999,如果是,则表示不更新该字段(该字段未被修改过);

否则,则将age字段更新至数据库,若age为null,则表示将数据库age字段设为null(清除数据)。

胡思乱想:

对于目前的解决方案,总感觉不是很好,平白无故的出现了一些非通用的自定义数值,假设出现某个字段,-99999是其有效值的话,就需要再寻找另一个无效值来替代。

这时候,我想到JavaScript里面有 undefined 和 null 两种表示“空”的值,其中 undefined 正式表示未初始化、未被赋值的概念,而 null 则表示空值的概念。

若Java中也存在 undefined 这一概念,那么,上述问题应该就可以很好的解决了,即出现一种可以区别于null的空值概念,表示未被修改过的概念。

继续阅读