后端接收JsonObject 并 转换为实体类对象,以及复杂对象存入数据库的解决思路

1. 问题描述

之前在SpringBoot中,Controller 层一直用实体类去接收Json字符串,这样的好处就是只要实体类的结构与Json的结构一一对应,就可以很方便的接收,不用再进行转换处理。
在这里插入图片描述但是有时候采用这种方式接收的实体类不方便存入数据库,比如说下面这个实体类,含有List和 Map ,存入数据库中很不方便:
实体类: LongtermDispatchPlanConParamDTO

public class LongtermDispatchPlanConParamDTO {
	private String schedulingplanName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date maketime;
    private String userName;
    private List<StationParameter> stationParameterList; 
	private Map<String,List<Constraintltem>> stationConstraintMap;
}

2. 解决思路

我的解决思路是这样的

  1. 在上面类中,前三个属性定义为主键字段,另增一个字段存储从前端传过来的整个Json字符串(这里类型定义为CLOB,以免超出varchar2 的 4000长度)

表 LONGTERM_DISPATCHPLAN_CON:
后端接收JsonObject 并 转换为实体类对象,以及复杂对象存入数据库的解决思路_第1张图片对应实体类:

public class LongtermDispatchplanConEntity implements Serializable {
	private static final long serialVersionUID = 1L;
	
	@Id
	private String schedulingplanName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Id
	private Date maketime;
    @Id
	private String userName;

	private String jsonString;


}
  1. 写好操作上表的增删改查
  2. Controller接收时用 cn.hutool.json.JSONObject 接收,然后将JSONObject 转化为结构一致的实体类对象LongtermDispatchPlanConParamDTO ,构造 LongtermDispatchplanConEntity对象存入数据库
@PostMapping("/insertListbyDTOJson")
     public void insertListbyDTOLongtermDispatchplanCon( @RequestBody JSONObject jsonParam) {
     	
    	 // 将JSONObject 转换为 对应的Bean对象
     	Class<LongtermDispatchPlanConParamDTO> clazzClass = LongtermDispatchPlanConParamDTO.class;
        LongtermDispatchPlanConParamDTO dto = jsonParam.toBean(clazzClass);
        
        //将JSONObject 以LongtermDispatchplanConEntity 中的 jsonString字符串形式存入数据库 
        LongtermDispatchplanConEntity ldpConEntity = new  LongtermDispatchplanConEntity();
        // 复制部分属性
        BeanUtils.copyProperties(dto, ldpConEntity);
        // 赋值 jsonString
        ldpConEntity.setJsonString(jsonParam.toString());
        // 存入数据库
        longtermDispatchplanConDao.save(ldpConEntity);
        log.info("longtermdispatchplancon insertListbyDTOJson success");
     }
     

后端接收JsonObject 并 转换为实体类对象,以及复杂对象存入数据库的解决思路_第2张图片
4. 在返回Json字符串时,前端传过来主键信息,从数据库去取出LongtermDispatchplanConEntity,然后 构造 LongtermDispatchPlanConParamDTO,前端就可以正确接收了。

@PostMapping("/getByIds")
     public LongtermDispatchPlanConParamDTO getByIdsLongtermDispatchplanCon( @RequestBody LongtermDispatchplanConParamsVO2  p) {
    	 LongtermDispatchplanConParamsVO lp = new  LongtermDispatchplanConParamsVO();
         BeanUtils.copyProperties(p, lp);
         // 根据 LongtermDispatchplanConParamsVO 从表中查询LongtermDispatchplanConEntity
         List<LongtermDispatchplanConEntity> ldpConEntitys = longtermDispatchplanConDaoM.findByIds(lp);
         
         if(ldpConEntitys !=null) {
        	 LongtermDispatchplanConEntity ldpConEntity = ldpConEntitys.get(0);
        	 //获得json字符串
        	 String jsonString = ldpConEntity.getJsonString();
        	 //利用 json字符串构造JSONObject对象
        	 JSONObject jsonParam = new JSONObject(jsonString,false);
        	 //转换为 LongtermDispatchPlanConParamDTO对象
        	 Class<LongtermDispatchPlanConParamDTO> clazzClass = LongtermDispatchPlanConParamDTO.class;
             LongtermDispatchPlanConParamDTO dto = jsonParam.toBean(clazzClass);
             return dto;
         }
         else {
        	 throw new DataException(200, p.toString()+"没有信息");
         }
         
     }

上面用的操作Json 的都是来自 Hutool的,真是很好的工具

你可能感兴趣的:(Spring,Boot)