动态生成实体类属性并赋值

工具类

package com.sunwe.emview.util;

import com.google.common.collect.Maps;
import org.apache.commons.beanutils.PropertyUtilsBean;
import java.beans.PropertyDescriptor;
import java.util.Date;
import java.util.Map;

public class ReflectUtil {


    public static Object getObject(Object dest, Map<String, Object> addProperties) {
        PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
        PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
        Map<String, Class> propertyMap = Maps.newHashMap();
        for (PropertyDescriptor d : descriptors) {
            if (!"class".equalsIgnoreCase(d.getName())) {
                propertyMap.put(d.getName(), d.getPropertyType());
            }
        }
        addProperties.forEach((k, v) -> {
            String sclass = v.getClass().toString();
            if(sclass.equals("class java.util.Date")) {//对日期进行处理
                propertyMap.put(k, Long.class);
            }else {
                propertyMap.put(k, v.getClass());
            }

        });
        DynamincBean dynamicBean = new DynamincBean(dest.getClass(), propertyMap);
        propertyMap.forEach((k, v) -> {
            try {
                if (!addProperties.containsKey(k)) {
                    dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k));
                }
            } catch (Exception e) {

            }
        });
        addProperties.forEach((k, v) -> {
            try {
                String sclass = v.getClass().toString();
                if(sclass.equals("class java.util.Date")) {//动态添加的字段为date类型需要进行处理
                    Date date = (Date) v;
                    dynamicBean.setValue(k, date.getTime());
                }else {
                    dynamicBean.setValue(k, v);
                }
            } catch (Exception e) {

            }
        });
        Object obj = dynamicBean.getTarget();
        return obj;
    }
}


import org.springframework.cglib.beans.BeanGenerator;
import org.springframework.cglib.beans.BeanMap;

import java.util.Map;

public class DynamincBean {

    private Object target;
    private BeanMap beanMap;

    public DynamincBean(Class superclass, Map<String, Class> propertyMap) {
        this.target = generateBean(superclass, propertyMap);
        this.beanMap = BeanMap.create(this.target);
    }

    public void setValue(String property, Object value) {
        beanMap.put(property, value);
    }

    public Object getValue(String property) {
        return beanMap.get(property);
    }

    public Object getTarget() {
        return this.target;
    }
    /**
     * 根据属性生成对象
     *
     */
    private Object generateBean(Class superclass, Map<String, Class> propertyMap) {
        BeanGenerator generator = new BeanGenerator();
        if (null != superclass) {
            generator.setSuperclass(superclass);
        }
        BeanGenerator.addProperties(generator, propertyMap);
        return generator.create();
    }
}

实际应用

public Page<HisAirboxData> findItemModelPageByParamsn(Map<String, Object> params) {
		Object endDate = params.get(SysConstant.END_DATE);
		if (endDate!=null&& StringUtils.isNotBlank(endDate.toString())){
			params.put(SysConstant.END_DATE,endDate.toString().substring(0,10)+ SysConstant.ONE_DAY_LAST_SECONDS)  ;
		}
		long count = getMapper().countHisItemModelDataByParams(params);
		List<HisAirboxData> list = getMapper().findHisItemModelDataByParamsn(params);
		List<Object> listn = new ArrayList<>();
		//[{"name":"冷冻水水温传感器2","value":"23.6℃"},{"name":"热水回水水温传感器1","value":"23.7℃"},{"name":"热水回水水温传感器2","value":"23.8℃"},{"name":"多联机水温传感器1","value":"23.9℃"},{"name":"多联机水温传感器2","value":"24.0℃"},{"name":"蒸发冷凝器进风温度","value":"24.1℃"},{"name":"蒸发冷凝器排风温度","value":"24.2℃"},{"name":"蒸发冷凝器水箱温度","value":"24.3℃"},{"name":"压缩机排气温度","value":"24.4℃"},{"name":"压缩机冷凝压力1","value":"24.5BAR"},{"name":"压缩机冷凝压力2","value":"24.6BAR"},{"name":"加热1输出","value":"24.7%"},{"name":"加热2输出","value":"24.8%"},{"name":"Y3输出","value":"24.9%"},{"name":"Y4输出","value":"25.0%"},{"name":"制冷温度设定","value":"25.1℃"},{"name":"制热温度设定","value":"25.2℃"},{"name":"加湿湿度设定","value":"25.3%"},{"name":"除湿湿度设定","value":"25.4%"}]
		list.forEach(l ->{
			HisAirboxData hisAirboxData = new HisAirboxData();
			
			List<JSONObject> lists = JSONObject.parseArray(l.getExtendData(),JSONObject.class);
			//将List<JSONObject>转为Map
			Map<String, Object> map = lists.stream()
					.filter(Objects::nonNull)
					.collect(Collectors.toMap(item -> item.getString("name"), item -> item.getString("value")));
			//根据字段动态生成类
			Object obj = ReflectUtil.getObject(l, map);
			listn.add(obj);
		});
		return PageHelper.buildPagen(params, count, listn);
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Mybatis实体ID生成策略可以通过在实体类中定义一个ID属性,然后使用Mybatis提供的策略生成器来生成ID值。 1. 使用自增长主键 在实体类中定义一个ID属性,类型为Long,并使用数据库自增长主键来生成ID值。 ```java public class User { private Long id; private String name; private Integer age; // getter/setter 略 } ``` 在Mapper.xml文件中,使用插入语句来插入数据,例如: ```xml <insert id="insertUser" parameterType="User"> insert into user(name, age) values(#{name}, #{age}) </insert> ``` 2. 使用UUID 在实体类中定义一个ID属性,类型为String,并使用Java自带的UUID类来生成ID值。 ```java public class User { private String id; private String name; private Integer age; // getter/setter 略 } ``` 在Mapper.xml文件中,使用插入语句来插入数据,例如: ```xml <insert id="insertUser" parameterType="User"> insert into user(id, name, age) values(#{id}, #{name}, #{age}) </insert> ``` 在插入数据之前,需要先为实体类的ID属性赋值,例如: ```java user.setId(UUID.randomUUID().toString()); ``` 3. 使用雪花算法生成ID 在实体类中定义一个ID属性,类型为Long,并使用雪花算法来生成ID值。 ```java public class User { private Long id; private String name; private Integer age; // getter/setter 略 } ``` 在Mapper.xml文件中,使用插入语句来插入数据,例如: ```xml <insert id="insertUser" parameterType="User"> insert into user(id, name, age) values(#{id}, #{name}, #{age}) </insert> ``` 在插入数据之前,需要先为实体类的ID属性赋值,例如: ```java user.setId(IdWorker.getId()); ``` 其中,IdWorker是一个自定义的工具类,用于生成雪花算法生成的ID值。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值