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

news/2025/3/3 8:20:17/

前言

在项目开发中,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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age, birthday);}@Overridepublic 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转mapMap<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转beanTest 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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, high);}@Overridepublic String toString() {return "Test1{" +"name='" + name + '\'' +", high='" + high + '\'' +'}';}
}

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

实现原理

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

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

相关文章

马上用GPT-4编程,DevChat上线VSCode插件,一切我们都替你搞好了。

// 打不过就加入。与其担心被 GPT-4 取代,不如现在就学习驾驭它。(GPT-3.5 和其他模型都不用怕,它们都不行,谁用谁知道……除了 Claude 我们还在测试中)文末有一键加入方法,国内用户也能无障碍使用——大家好才是真的好👍用 GPT-4 写代码有三大好处一是有利身体健…

tkinter将图标写入py文件

需求&#xff1a;当我们用pyinstaller打包写好的程序为单一执行程序后&#xff0c;图标或相关的图片必须放在同一目录里。如果程序很小&#xff0c;就显得不够简洁。 思路&#xff1a;将图片转换为二进制码&#xff0c;放在我们的py文件里&#xff0c;运行程序时先生成临时的图…

VS code react插件快捷键

VS code react插件快捷键 Basic Methods PrefixMethodimp→import moduleName from moduleimn→import moduleimd→import { destructuredModule } from moduleime→import * as alias from moduleima→import { originalName as aliasName} from moduleexp→export default …

TPC-H和TPC-DS

1、TPC-H商业智能计算测试TPC-H 是美国交易处理效能委员会(TPC,Transaction Processing Performance Council) 组织制定的用来模拟决策支持类应用的一个测试集.目前,在学术界和工业界普遍采用它来评价决策支持技术方面应用的性能. 这种商业测试可以全方位评测系统的整体商业计算…

android代码混淆 GSON完满解决

头疼的问题&#xff0c;json使用了google的gson三方包&#xff0c;可是混淆的时候出了问题 明明已经按照gson的官方文档&#xff0c;把混淆脚本加上去了&#xff0c;却还是出问题。 今天同事找到一篇博客&#xff0c;关于这个问题的&#xff1a; 我们是将json解析以后放到jav…

anroid 使用 Gson 混淆 遇到的bug 总结

使用Gson了的&#xff0c;在发布包时&#xff0c;如果需要对包进行混淆&#xff0c;那么必须加入如下配置 这里有一点比较坑爹&#xff0c;从google android_proguard_example 的proguard.cfg上考下来的文件必须做一定的修改&#xff1a; ##---------------Begin: proguard con…

anroid 使用 Gson 混淆 遇到的bug

http://blog.sina.com.cn/s/blog_4e1e357d0101ednf.html

volley混淆之后报错与gson混淆解决

有个项目的部分请求是volley&#xff0c;混淆之后发现&#xff0c;有返回数据&#xff0c;但是请求失败&#xff0c;后来发现是返回数据gson的解析失败&#xff0c;然后去查了一下gson的混淆&#xff0c;这里分享一下 ##---------------Begin: proguard configuration for Gson…