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

news2025/7/8 12:25:30

前言

在项目开发中,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 + '\'' +
                '}';
    }
}

运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bb1be219df5845bc9aa6548b5c11f3d8.png

实现原理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis入门 - 发布订阅

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 发布订阅 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-pub-sub.html Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收…

基于Java Web的墓地管理系统的设计与实现+第五稿+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于Java Web的墓地管理系统的设计与实现第五稿文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 3.3 角色分析 本系统一共分为…

微信小程序9大方面测试点全方位总结

微信小程序无需下载安装&#xff0c;用户在微信扫一扫或搜索即可使用&#xff0c;小程序版本类型可分为&#xff1a;开发版、体验版、正式版。 开发版、体验版无需审核&#xff0c;只需要给微信号权限&#xff0c;经过扫小程序的二维码就能访问&#xff0c;正式版本需要经过微…

计网期末复习篇

五层协议 协议字段数据单元 PDU 典型协议 (协议字段) 网络连接设备 寻址方式 物理层 比特流 以太网协议 232、485、449、x25、以串口方式、网卡 物理层不寻址 数据链路层 帧 ppp协议 broadcast协议 网桥、网络交换机(特点有题) MAC地址(48bit) 网络层 (重点) 网络分…

Spark SQL 内置函数

文章目录 一、Spark SQL内置函数&#xff08;一&#xff09;内置函数概述1、10类内置函数2、两种使用方式 &#xff08;二&#xff09;内置函数演示1、通过编程方式使用内置函数upper()2、通过SQL语句的方式使用内置函数upper()3、演示其它内置函数的使用 二、自定义函数&#…

离散数学题目收集整理练习(期末过关进度30%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

软件 安全,处理威胁STRIDE模型

微软威胁分析工具&#xff1a; https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling?azure-portaltrue STRIDE 是微软定义的6中威胁 身份假冒&#xff08;Spoofing&#xff09; 身份假冒&#xff0c;即伪装成某对象或某人。例如&#xff0c;我们通过伪…

校园旧物商城系统

一、项目说明 校园旧物回收商城&#xff0c;使用SpringbootVue2.x开发,使用了JWT、MybatisPlus、JWT、ElementUI 项目已经开源在https://github.com/astudent2020/Campus_waste_recycling 文章目录 一、项目说明一、说明书1、用户主页&#xff1a;2、登录注册页面3、后台页面…

在Maya、ZBrush和UE中制作龙香炉

大家好&#xff0c;今天云渲染小编给大家带来的分享是来自印尼的CG艺术家Stephen Herman“龙香炉”道具分解幕后花絮。 介绍 大家好&#xff01;我叫 Stephen Herman&#xff0c;是来自印度尼西亚雅加达的 3D 艺术家。 目前&#xff0c;我在 Bandai Namco Studios Malaysia …

数字电路基础---时序逻辑

时序逻辑 通过前面的组合逻辑的学习&#xff0c;我们知道了组合逻辑电路是没有记忆功能的&#xff0c;也就是说在任何时刻产生的输出信号都仅仅取决于该时刻电路的输入信号&#xff0c;而与它以前的输入信号是无关的。下来我们来学习下什么是时序逻辑。 1、简介 时序电路是有…

C语言实现顺序表

绪论 从本章开始就是开始数据结构的开端&#xff0c;本章将会写出数据结构中的顺序表的代码实现&#xff0c;多会以注释的方法来描述一些细节&#xff08;注释是我们程序员必须常用的工具&#xff09;。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xf…

分析:如何多线程运行测试用例

这是时常被问到的问题&#xff0c;尤其是UI自动化的运行&#xff0c;过程非常耗时&#xff0c;所以&#xff0c;所以多线程不失为一种首先想到的解决方案。 多线程是针对的测试用例&#xff0c;所以和selenium没有直接关系&#xff0c;我们要关心的是单元测试框架。 unittest …

生态伙伴 | 华秋硬创联合湾加速,共同加速企业发展

01 大赛介绍 中国硬件创新创客大赛始于2015年&#xff0c;由深圳华秋电子有限公司主办&#xff0c;至今已经成功举办八届&#xff0c;赛事范围覆盖华南、华东、华北三大地区&#xff0c;超10个省市区域。 大赛影响了超过45万工程师群体&#xff0c;吸引了35000多名硬创先锋报…

云可观测性技术的应用领域及价值有哪些?

随着云计算的迅速发展&#xff0c;云可观测性技术成为了越来越重要的一项技术。它可以帮助企业实时监测、分析和优化其在云环境中运行的应用程序和系统&#xff0c;那云可观测性技术的应用领域及价值有哪些&#xff1f; 一、应用性能监测与优化 云可观测性技术使得企业能够实时…

(字符串) 844. 比较含退格的字符串——【Leetcode每日一题】

❓844. 比较含退格的字符串 难度&#xff1a;简单 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 注意&#xff1a;如果对空文本输入退格字符&#xff0c;文本继续为空。 示例…

【SpringBoot】整合Elasticsearch 快速入门操作索引

官网操作文档&#xff1a;Elasticsearch Clients | Elastic 踩坑太多了。。。这里表明一下Spring Boot2.4以上版本可能会出现问题&#xff0c;所以我降到了2.2.1.RELEASE。对于现在2023年6月而言&#xff0c;Es版本已经到了8.8&#xff0c;而SpringBoot版本已经到了3.x版…

【实战】Python爬虫之代理使用详解

在Python爬虫中&#xff0c;代理的使用非常常见。代理的主要作用是隐藏客户端的真实IP地址&#xff0c;从而实现更高的网络访问速度和更好的访问隐私保护。下面我们将通过Python爬虫的实例&#xff0c;带你详细了解Python爬虫中代理的使用方法。 目录 ## 1. 代理原理和作用 …

多维度员工信息整合查询——红海云员工信息数字化管理实用指南(中)

红海云员工全生命周期数字化管理平台从信息源头开始管控员工数据质量&#xff0c;在员工数据的采集、更新、审核环节采用多种方式保障员工信息的准确性、完整性、时效性和一致性&#xff0c;为企业搭建坚实可靠的人力资源管理数字化基座。但在有了准确可靠的员工数据基础后&…

APP测试应该从哪些方面入手?其实就这几点

前言 还在苦恼怎么去测APP吗&#xff1f; 一定要记住这几个方向&#xff0c;然后流程化的去执行&#xff0c;一来严谨规范&#xff0c;二来不会有遗漏。 1、需求检查&#xff1a; 在需求评审的时候展现你的业务能力啦&#xff01;不过还是得口下留情哟。&#xff08;PM心里瑟…

GitOps指南

GitOps基于CICD和IaC&#xff0c;以一致的方式管理代码和部署&#xff0c;是DevOps最佳实践之一。本文完整介绍了GitOps的理念和实践&#xff0c;并介绍了Weave Cloud的GitOps模型和工具&#xff0c;从整体上提供了实践GitOps的路径和方案。原文&#xff1a;Guide To GitOps[1]…