结论:推荐使用spring自带的copy工具,不能copy的手动set

1、springboot自带的BeanUtils.copyProperties

package com.admin;

import cn.hutool.core.collection.CollectionUtil;
import org.springframework.beans.BeanUtils; import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* @Description :
* @Date : 2022/12/26
* @Author :
*/
public class Test {
public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("2009");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes); List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2= new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p); TestDO testDO = new TestDO();
BeanUtils.copyProperties(testDTO, testDO); }
}



总结

  • 字段名不一致,属性无法复制
  • 类型不一致,属性无法复制,但是注意,如果类型为基本类型以及基本类型的包装类,这种可以转化
  • 嵌套对象字段,将会与源对象使用同一对象,即使用浅拷贝

2、hutool工具包的BeanUtil.copyProperties

package com.admin;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* @Description :
* @Date : 2022/12/26
* @Author :
*/
public class Test {
public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("2009");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes); List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2 = new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p); TestDO testDO = new TestDO();
BeanUtil.copyProperties(testDTO, testDO);
System.out.println("");
}
}

package com.admin;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* @Description :
* @Date : 2022/12/26
* @Author :
*/
public class Test {
public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("Fri May 19 15:59:09 CST 2023");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes); List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2 = new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p); TestDO testDO = new TestDO();
BeanUtil.copyProperties(testDTO, testDO);
System.out.println("");
}
}



总结

  • hutool 可以copy不同类型的字段,只要字段的名称相同,对于字符串copy为date需要特定的格式
  • copy对象也是浅拷贝

3、MapStruct

导入依赖

        <!-- mapStruct 对象转换 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</dependency>

编写 MapStruct 转换接口

package com.admin.service;

import com.admin.TestDO;
import com.admin.TestDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping; /**
* @Description :
* @Date : 2023/5/19
* @Author :
*/
@Mapper(componentModel = "spring")
public interface DTo2Do {
@Mapping(source = "no",target = "number")
TestDO dtoToDo(TestDTO testDTO);
}

测试需要启动容器

package com.admin;

import cn.hutool.core.collection.CollectionUtil;
import com.admin.service.DTo2Do;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList;
import java.util.Date;
import java.util.List; @SpringBootTest
class VueadminJavaApplicationTests { @Autowired
private DTo2Do dTo2Do;
@Test
void contextLoads() {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("Fri May 19 15:59:09 CST 2023");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes); List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2 = new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p); TestDO testDO = dTo2Do.dtoToDo(testDTO);
System.out.println("");
} }



将日期注释掉



总结

  • 部分类型不一致可以自动转换
  • 深拷贝
  • 对字符串转日期格式不支持

Springboot多种字段copy工具比较的更多相关文章

  1. fieldmeta 基于springboot的字段元数据管理,通用代码生成,快速开发引擎

    fieldmeta: 基于springboot的字段元数据管理 version:Alpha 0.0.1 ,码云地址:https://gitee.com/klguang/fieldmeta 元数据(Me ...

  2. [下载]Oracle LOB字段编辑工具

    OraLobEditor 是Oracle LOB (CLOB, BLOB) 字段编辑工具. 查看.编辑LOB (CLOB, BLOB)字段(plain text, RTF, image, hex, h ...

  3. springboot封装JsonUtil,CookieUtil工具类

    springboot封装JsonUtil,CookieUtil工具类 yls 2019-9-23 JsonUtil public class JsonUtil { private static Obj ...

  4. SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式

    SpringBoot系列(八) 分分钟学会SpringBoot多种跨域解决方式 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 s ...

  5. cglib、orika、spring等bean copy工具性能测试和原理分析

    简介 在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO.DTO.Entity.DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护.通常情况下,这 ...

  6. SpringBoot集成Mybatis-PageHelper分页工具类,实现3步完成分页

    在Mybatis中,如果想实现分页是比较麻烦的,首先需要先查询出总的条数,然后再修改mapper.xml,为sql添加limit指令. 幸运的是现在已经不需要这么麻烦了,刘大牛实现了一个超牛的分页工具 ...

  7. Spring-Boot ☞ ShapeFile文件读写工具类+接口调用

    一.项目目录结构树 二.项目启动 三.往指定的shp文件里写内容 (1) json数据[Post] { "name":"test", "path&qu ...

  8. springboot工程自动生成工具

    1 springboot工程自动生成网址 http://start.spring.io/ 2 工具 Spring Boot CLI

  9. SpringBoot 项目在静态工具类中注入 RedisTemplate

    静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...

  10. springboot 整合redis redis工具类

    一步 : pom中引入相关依赖 <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boo ...

随机推荐

  1. 在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题

    一.简介 Net Core跨平台项目开发多了,总会遇到各种各样的问题,我就遇到了一个这样的问题,不能访问 Cannot access a disposed object 错误,经过自己多方努力,查阅资 ...

  2. 【python基础】复杂数据类型-列表类型(元组)

    1.初识元组 列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的. 然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求 python将不能修改的值称为不可变的,而不可变的 ...

  3. Electron桌面应用开发基础

    Electron桌面应用开发 Electron技术架构 地址:快速入门 | Electron Chromium 支持最新特性的浏览器 Node.js Javascript运行时,可实现文件读写 Nat ...

  4. Jenkins部署前后端不分离springboot项目

    背景 写这篇博客的时候我还是大学生,学校期末课程设计时要求使用Jenkins部署项目,所以使用windows,但是企业中都是使用linux,往往还会搭建一个gitlab.下面我介绍的是在window环 ...

  5. MVC 模式和三层架构

    1. MVC 模式 ‍ MVC 模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好. ‍ MVC 是一种分层开发的模式,其中: M:Model,业务模型,处理 ...

  6. 【后端面经-Java】AQS详解

    目录 1. AQS是什么? 2. AQS核心思想 2.1 基本框架 2.1.1 资源state 2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析 3.1 acquire(int) 3.1 ...

  7. 使用 JCommander 解析命令行参数

    前言 如果你想构建一个支持命令行参数的程序,那么 jcommander 非常适合你,jcommander 是一个只有几十 kb 的 Java 命令行参数解析工具,可以通过注解的方式快速实现命令行参数解 ...

  8. 搭建Vue脚手架(vue-cli)

    windows下环境安装前置环境 node.js安装 https://nodejs.org/en/download/ 安装成功后打开cmd 输入如下,如果能看到node和npm的版本号了,说明已经安装 ...

  9. Java_Day17_作业

    1:需求:递归删除带内容的目录 假设删除当前项目下的目录:demo,demo中可以有文件夹自己给出 2:需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台. 3:下 ...

  10. MAUI+MASA Blazor 兼容性测试报告及分析

    目录 1. 背景 2. 目的 3. 测试目标 4. 预期结果 5. 测试策略及范围 6. 测试结果与分析 7. 附加内容 8. 结尾 1. 背景 MASA Blazor组件是一款基于Material ...