使用hutool实现entity转map、map转entity,以及entity转entity

前言

在项目开发中,entity的数据结构一般用来传参以及结果响应,但是在某些场景下,map可以实现list无法实现的效果。
比如:实现根据不同等级的用户,可以看到的数据的数量不一样。等级低的用户看到的某些字段是经过加密的,并且不同等级加密哪些字段是可以配置的。

首先,会把数据都查询出来,然后再根据当前用户角色去查询哪些字段需要加密。比如我们知道age要加密,有了字段名age,但是我们怎么让机器也知道呢?这就是问题了。entity结构的数据,除非用反射机制去获取他的字段名,否则根本没法指定他的字段来更改。而这个时候map的好处就体现出来了,一个map存储一个entity,key是字段名,value是字段值。可以直接通过传入的字段名去更改字段值。

对象转对象也是很常用的场景,在开发中,一般入参是比较少的,经过校验之后一般要将入参对象的值转成我们数据库实体类的值,如果一个个set,就太麻烦了,使用工具类就很方便,直接根据两个对象的字段名来匹配,字段名一样,就将源对象的值赋值给目标对象。
注意:只要匹配,哪怕源对象的字段值是null也会把null赋目标对象

hutool项目的BeanUtil就实现了这些功能。展示一下实际用法:(记得导依赖)

bean->map,map->bean,bean->bean

实现展示

package org.jeecg.common.util.security.entity;
import cn.hutool.core.bean.BeanUtil;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/**
 * @ClassName: Test
 * @Author: zengjingchao
 * @Date: 2023/6/16 15:05
 * @Description:
 **/
public class Test {
    private String name;
    private int age;
    private Date birthday;

    public Test() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return age == test.age && Objects.equals(name, test.name) && Objects.equals(birthday, test.birthday);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, birthday);
    }

    @Override
    public String toString() {
        return "Test{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }

    public static void main(String[] args) {
        Test test=new Test();
        test.setAge(18);
        test.setBirthday(new Date());
        test.setName("张三");
        System.out.println(test);
        System.out.println("-----------");
        //bean转map
        Map<String, Object> objectMap = BeanUtil.beanToMap(test);
        Set<Map.Entry<String, Object>> entries = objectMap.entrySet();
        for (Map.Entry<String,Object> entry:entries){
            System.out.println(entry.getKey()+"->"+entry.getValue());
        }
        //map转bean
        Test test1 = BeanUtil.mapToBean(objectMap, Test.class, true);
        System.out.println("----------");
        System.out.println(test1);

        System.out.println("------");
        Test1 test11=new Test1();
        test11.setHigh("180");
        test11.setName("李四");
        System.out.println(test11);
        System.out.println("------------");
        //字段拷贝,根据字段名进行拷贝,匹配的就拷贝,不匹配的就跳过、
       	//如果字段名匹配的话就将test的值拷贝到test11,例子里面只有name是两个对象都有的
        BeanUtil.copyProperties(test,test11);
        System.out.println(test11);
    }
}

Test1类

package org.jeecg.common.util.security;

import java.util.Objects;

/**
 * @ClassName: Test1
 * @Author: zengjingchao
 * @Date: 2023/6/16 15:22
 * @Description:
 **/
public class Test1 {
    private String name;
    private String high;
    public Test1() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHigh() {
        return high;
    }

    public void setHigh(String high) {
        this.high = high;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test1 test1 = (Test1) o;
        return Objects.equals(name, test1.name) && Objects.equals(high, test1.high);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, high);
    }

    @Override
    public String toString() {
        return "Test1{" +
                "name='" + name + '\'' +
                ", high='" + high + '\'' +
                '}';
    }
}

运行结果:
使用hutool实现entity转map、map转entity,以及entity转entity_第1张图片

实现原理

对象之间的转换以及对象转map都是通过反射机制来实现的,通过反射机制获取到类的字段名数组以及字段值,遍历源对象的字段名,如果和目标对象的字段名一样,则把源对象的值赋值给目标对象。最终就实现了根据字段名将源对象的字段值赋值给了目标对象。转map也是类似原理,字段名作为key,字段值作为value,一个字段对应着一个key、value映射,一个map就是一个对象。

你可能感兴趣的:(java,数据库,spring)