“小安,这个表中缺少一个字段,用来保存地区码”,业务经理指着原型图,指责的看着我。
“我知道了,我马上去加”,等我alter table add column 之后,对应的java bo,vo ,entity 实体,xml 等 修改测试之后,一个小时过去了·······
“小安,你过来一下,原型图需要改动,需要加一个用户的邮箱”,业务经理客气的给我说道,并且 巴拉巴拉了十五分钟。
“好,我改”,等我alter table add column 之后,对应的java bo,vo ,实体,xml 对应修改测试之后,又一个小时过去了·······
“小安,你在过来一下····”,“你直接说需要加那个字段好了”,没等业务经理说完,我直接截断他的话,心里很崩溃。一次次这样改,你不累死,我也累死了。
好吧,为了不累死,要想想办法,改怎么处理这些一大堆一大堆的“废”字段。
“废”,不是真的无用,开发中只是作为信息存储,不作为查询的关键字。
首先想到的的在库表中,加入一个datas字段,长度暂定2000,json 格式存储所有的这些废字段。
那怎么接收前端的参数,怎么返回前端的参数,以及如何在服务中处理这个json 呢?
首先bo 作为接收参数的服务,要能够接收接收所有能够自定义的key。
@Data @ApiModel(description = "机构部门表Bo") public class SystemOrganBo implements Serializable { @ApiModelProperty("部门id") private Integer organid ; @ApiModelProperty("父部门id") private Integer parentid ; @ApiModelProperty("部门名称") private String organname ; @ApiModelProperty("层次") private String seqno ; @ApiModelProperty("部门类型") private Byte organtype ; @ApiModelProperty("地址") private String address ; @ApiModelProperty("联系人名称") private String relationuser ; @ApiModelProperty("联系人手机") private String relationtel ; @ApiModelProperty("创建时间") private Date createtime ; @ApiModelProperty("更新时间") private Date updatetime ; @ApiModelProperty("使用标志 0 未使用,1 使用") private Byte useflag ; @ApiModelProperty("创建用户id") private Integer createuserid ; @ApiModelProperty("有效截止期") private Date invalidtime ; @ApiModelProperty("删除标志") private Byte deletflag; private Byte organKind; @ApiModelProperty("JSON存储明细数据") private String datas; private Map properties=new HashMap() ; @JsonAnySetter public void set(String key ,Object object){ properties.put(key,object); datas=new JSONObject(properties).toJSONString(); } }
在这段代码中,使 @JsonAnySetter 注解,所有的定义属性之外的,都保存到properties 的map中,并同时转成jsonString,放到datas.
剩下的就是service ,entity 相应改动,把这个json串丢到数据库中。
查询的时候,怎么把这个json 串重新处理为对象属性呢?
/** * 机构部门表VO * @since jdk1.8 */ @Data @ApiModel(description = "机构部门表VO") public class SystemOrganVo { @ApiModelProperty("部门id") private Integer organid ; @ApiModelProperty("父部门id") private Integer parentid ; @ApiModelProperty("部门名称") private String organname ; @ApiModelProperty("层次") private String seqno ; @ApiModelProperty("部门类型") private Byte organtype ; @ApiModelProperty("地址") private String address ; @ApiModelProperty("联系人名称") private String relationuser ; @ApiModelProperty("联系人手机") private String relationtel ; @ApiModelProperty("创建时间") private Date createtime ; @ApiModelProperty("更新时间") private Date updatetime ; @ApiModelProperty("使用标志 0 未使用,1 使用") private Byte useflag ; @ApiModelProperty("创建用户id") private Integer createuserid ; @ApiModelProperty("子节点") private List<SystemOrganVo> children; @ApiModelProperty("json 数据") private String datas ; @ApiModelProperty("有效截止期") private Date invalidtime ; @ApiModelProperty("删除标志") private Byte deletflag; @ApiModelProperty("是否实体机构") private Byte organKind; @JsonAnyGetter public Map<String ,String> jsonSerialize(){ Map map =new HashMap(); map = (Map)JSON.parse(datas); return map; } }
使用 @JsonAnyGetter 把所有的data 中主键给平铺序列化到对象中。
到此已经OK了,任前端怎么添加字段,我后台坚如磐石,慨然不动,业务经理可以不用理会了····
=======================
效果虽好,缺点却不能不说,一个明显的缺点,持续加入key只有,json字段会越来越长,而且,该字段不能作为查询的条件使用,如果有可能还是使用其他的数据库存储,例如es,mongo.