Java实体类之间的相互转换方式

 更新时间:2023年08月21日 16:12:12   作者:与黑夜为伍  
这篇文章主要介绍了Java实体类之间的相互转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java实体类之间的相互转换

为什么要实体类之间相互转换呢?

1.防止数据的泄露,比如使用Hibernate查询用户表,用户表有用户的账号和密码,我们后端给前端数据的时候并不希望给前端传递密码这个字段。

2.防止数据过大,前端无法接收,hibernate使用的是关联查询,如果关联的表非常多的话前端接收会报错。

3.更好的前后端分离,前端不用考虑后端的业务逻辑。而后端只需要给出返回的结果是否成功的编码和具体提示内容以及其它信息。

在pom.xml配置文件中添加依赖

   <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>23.4-jre</version>
   </dependency>

创建第一个实体类School

public class School {
    private Integer schoolId;
    private String schoolName;
    private String name;
    //省略getter和setter方法
    }

创建第二个实体类

public class SchoolDTO {
    private Integer schoolId;
    private String schoolName;
    //省略getter和setter方法
     //创建转换方法
     public School convertTo() {
        OrderConverter convert = new OrderConverter();
        return convert.convert(this);
    }
    public SchoolDTO convertFrom(School order) {
        OrderConverter convert = new OrderConverter();
        return convert.reverse().convert(order);
    }
    private static class OrderConverter extends Converter<SchoolDTO, School> {
        @Override
        protected School doForward(SchoolDTO schoolDTO) {
            return null;
        }
        //具体的转换内容
        @Override
        protected SchoolDTO doBackward(School school) {
            SchoolDTO dto = new SchoolDTO();
            dto.setSchoolId(school.getSchoolId());
            dto.setSchoolName(school.getSchoolName());
            return dto;
        }
    }
    }

创建测试类(一条数据转换)

public class test {
    public static void main(String[] args) {
        //一条数据转换
        School school = new School();
        school.setSchoolId(1);
        school.setSchoolName("上海理工大学");
        school.setName("李四");
        SchoolDTO dto = new SchoolDTO().convertFrom(school);
        System.out.println(dto);
        //Page类型数据转换
        //schools.map(s -> new SchoolDTO().convertFrom(s));
        //List类型
        /*
        List<SchoolDTO> list = dto.stream().map(address -> {
           return  new SchoolDTO().convertFrom(address);
        }).collect(Collectors.toList());
        */
    }

输入结果:

SchoolDTO{schoolId=1, schoolName='上海理工大学'}

第二种:直接使用this

1、首先创建一个操作数据库的实体类:School,和用来给前端传递内容的实体类SchoolDTO

public class School {
    private Integer id;
    private String schoolName;
    private String address;
    //省略getter和setter方法
    }
public class SchoolDTO {
    private Integer id;
    private String schoolName;
    private String address;
    //省略getter和setter方法
    //省略toString方法
    //转换方法
    public SchoolDTO toSchool(School dto){
    this.setId(dto.getId());
    this.setAddress("转换的结果是:"+dto.getAddress());
    this.setSchoolName("转换的结果是:"+dto.getSchoolName());
    return this;
    }
    }

2、测试方法进行测试

public class TestController {
    public static void main(String[] args) {
        School school = new School();
        school.setId(1);
        school.setSchoolName("北京大学");
        school.setAddress("北京");
        //打印内容
        System.out.println(new SchoolDTO().toSchool(school));
    }
}

3、打印结果

在这里插入图片描述

这种方法比较方便,不用引用jar的依赖

实体类相互转换工具类

场景

不同的实体类之间取相同数据赋值

package com.lrhealth.mappingintegration.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Slf4j
public class BeanHelper {
    public static <T> T copyProperties(Object source, Class<T> target){
        try {
            T t = target.newInstance();
            BeanUtils.copyProperties(source, t);
            return t;
        } catch (Exception e) {
            log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e);
             return null;
        }
    }
    public static <T> List<T> copyWithCollection(List<?> sourceList, Class<T> target){
        try {
            return sourceList.stream().map(s -> copyProperties(s, target)).collect(Collectors.toList());
        } catch (Exception e) {
            log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e);
             return null;
        }
    }
    public static <T> Set<T> copyWithCollection(Set<?> sourceList, Class<T> target){
        try {
            return sourceList.stream().map(s -> copyProperties(s, target)).collect(Collectors.toSet());
        } catch (Exception e) {
            log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e);
            return null;
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅析SpringBoot中的过滤器和拦截器

    浅析SpringBoot中的过滤器和拦截器

    过滤器和拦截器都是为了在请求到达目标处理器(Servlet或Controller)之前或者之后插入自定义的处理逻辑,下面就跟随小编来看看它们二者的区别和具体使用吧
    2024-03-03
  • Java设置Map过期时间的的几种方法举例详解

    Java设置Map过期时间的的几种方法举例详解

    本文详细介绍了Java中使用轻量级缓存组件ExpiringMap以及Guava的LoadingCache缓存机制,ExpiringMap提供了Map自动过期、监听事件等功能,而LoadingCache提供了缓存回收、数据加载等高级功能,两者为Java项目提供了有效的数据管理和缓存解决方案,需要的朋友可以参考下
    2024-10-10
  • 详解Spring-Cloud2.0之Feign调用远程服务指南

    详解Spring-Cloud2.0之Feign调用远程服务指南

    这篇文章主要介绍了详解Spring-Cloud2.0之Feign调用远程服务指南,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 使用Redis incr解决并发问题的操作

    使用Redis incr解决并发问题的操作

    这篇文章主要介绍了使用Redis incr解决并发问题的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Spring中利用IOC实现注入的方式

    Spring中利用IOC实现注入的方式

    Spring IOC(控制反转)实现依赖注入,将对象创建和依赖关系的管理交由Spring容器处理,通过注解或XML配置,实现对象之间的松耦合,提高代码复用性和可维护性
    2023-04-04
  • Spring中的接口重试机制spring-retry之listeners参数解析

    Spring中的接口重试机制spring-retry之listeners参数解析

    这篇文章主要介绍了Spring中的接口重试机制spring-retry之listeners参数解析,注解@Retryable有一个参数listeners没有说明,那么本篇文章我们详细介绍一个这个参数的用,需要的朋友可以参考下
    2024-01-01
  • java 解决Eclipse挂掉问题的方法

    java 解决Eclipse挂掉问题的方法

    本篇文章是对在java中解决Eclipse挂掉问题的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java应用/JVM宕机排查步骤操作

    Java应用/JVM宕机排查步骤操作

    这篇文章主要介绍了Java应用/JVM宕机排查步骤操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • springboot整合EHCache的实践方案

    springboot整合EHCache的实践方案

    EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。这篇文章给大家介绍了springboot整合EHCache的实践方案,需要的朋友参考下
    2018-01-01
  • java实现CSV文件导入与导出功能

    java实现CSV文件导入与导出功能

    这篇文章主要为大家详细介绍了java实现CSV文件导入与导出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论