数据库动态存储动态实体类实例

时间:2022-02-07 07:26:42

 “小安,这个表中缺少一个字段,用来保存地区码”,业务经理指着原型图,指责的看着我。

“我知道了,我马上去加”,等我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.