不同类型数据的兼容保存--反射

最近在工作中遇到了这种的需求
在一个视频页面,要通过websocket实时保存很多数据,但是数据的字段类型不一致(如果订单号是String,客户id是Long,客户下单的时间是Date),
1、前端每修改一个数据(每次只会传过来一个数据),就会发送信令通知到后端,保存进数据库。
2、最后还要在关闭页面时,发送所有数据到后端,再统一做一次保存。
对于这样的场景,就无法通过固定类型去接收参数,于是采用了反射的方式来处理,下面上代码
思路:
1、首先,我把所有前端会传过来的值,全部写在一个dto中,并和前端约定好,传过来数据的key,和我dto中的属性名保存一致。
2、前端传值时,因为我们不知道他这次传的是单个值,还是所有值,所以我们要先遍历整个dto,拿到所有value不为空的属性值,装入map
3、再判断他是订单类的数据,还是客户类的数据,装进相应的dto,保存数据库。

//service层代码
public void saveInfo(SaveInfoReq req){
	//处理前端传过来的数据,装入map
	Map<String,Object> paramMap = dealParam(req);
	//待保存的数据
	Order order = new order();
	Customer cus = new Customer();
	
	Set<String> keySet = param.keySet();
	for(String key : keySet){
		switch(key){
			case "orderNo":case "type":case "createTime":
				setMethod(order,key,paramMap.get(key));
			case "id":case "sex":case "name":
				setMethod(cus,key,paramMap.get(key));
		}
	}
}

private Map<String,Object> dealParam(SaveInfoReq req){
	Map<String,Object> paramMap = new HashMap<>();
	Field[] fields = req.getClass().getDeclaredFields();
	for(Field field : fields){
		String name = field.getName();//获取属性名
		String type = field.getType().toString();//获取属性类型
		Object valueObject = getValue(name,req);//获取属性值
		String value = String.valueOf(valueObject);
		if(null != valueObject){//如果valueObject 不为空,则装入map
			log.info("name:{},type:{},value:{}",name,type,value);
			paramMap.put(name,valueObject)
		}
	}
	return paramMap;
}

//name是该属性的名字
private Object getValue(String name,SaveInfoReq req){
	String getter = "get" + name.substring(0,1).toUpperCase() + name.substring(1);
	try{
		//获取name属性的get方法
		Method getMethod = req.getClass().getMethod(getter ,new Class[]{name.getClass()});
		Object value = getMethod.invoke(req,new Object[]{});
		return value;
	} catch (Exception e){
		log.error("{}属性获取value值失败",name)
		e.printStachTrace();
	}
}

//target是存入数据库的dto,name是该属性的名字,source是前端传过来的值(由于要兼容传过来的不同类,所以用object)
private void setMethod(Object target,String name,Object source){
	String setter = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
	try{
		//获取name属性的set方法
		Method setMethod = target.getClass().getMethod(setter,new Class[]{name.getClass()});
		if(target instanceof Order){
			//这个值是订单类,保存到订单表
			Order order = (Order)target;
			setMethod.invoke(order,source);
			orderMapper.insert(order);
		} else(target instanceof Order){
			//这个值是客户类的,保存到客户表
			Customer customer = (Customer)target;
			setMethod.invoke(customer,source);
			customerMapper.insert(customer);
		}
	} catch (Exception e){
		e.printStachTrace();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值