结论:推荐使用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. ODOO13 之九:Odoo 13开发之外部 API – 集成第三方系统

    Odoo 13开发之外部 API – 集成第三方系统 Odoo 服务器端带有外部 API,可供网页客户端和其它客户端应用使用.本文中我们将学习如何在我们的客户端程序中使用 Odoo 的外部 API.为 ...

  2. 「AntV」X6开发实践:踩过的坑与解决方案

    长期更新版文档请移步语雀(「AntV」X6开发实践:踩过的坑与解决方案 (yuque.com)) ️ | 如何自定义拖拽源? 相信你们在开发中更多的需求是需要自定义拖拽源,毕竟自定义的功能扩展性高一些 ...

  3. CANoe学习笔记(三):CANoe的诊断功能和cdd文件

    内容: UDS诊断学习 CDD文件配置 诊断功能 一.UDS诊断学习: ①.UDS请求命令4种构成方式: SIDSID+SF(Sub-function)SID+DID(Data Identifier) ...

  4. JIRA安装

    JIRA安装 操作系统: 阿里云centos6.8 域名: yan.jzhsc.com 1.安装与配置JAVA sudo -u root -H bash # 在oracle官网下载JDK,安装并配置环 ...

  5. celery笔记七之周期/定时任务及crontab定义

    本文首发于公众号:Hunter后端 原文链接:celery笔记七之周期/定时任务及crontab定义 periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或 ...

  6. Redis数据类型之Stream系列一

    一:Stream简介 ​ Redis Stream是5.0版本之后新增的一种数据结构,其结构类似于'仅追加日志'.但也实现了多种操作来克服'仅追加日志'的一些限制,如读取策略(xread,xrange ...

  7. vue3+ts使用v-for出现unknown问题

    最近在写项目时遇到了一个问题,当我从父组件向子组件传数据并且需要将子组件对传入的数据进行v-for循环渲染时,在此出遇到了一个ts报错 报错为循环出的data类型为unknown 具体代码如下 : 子 ...

  8. 即构SDK10月迭代:新增多款语音音效、外部采集码流控制及Android SDK 最低支持操作系统版本调整

    即构SDK10月迭代内容来喽~~~ 本月调整了Android SDK 最低支持的操作系统版本,新增了流删除回调原因, 4种变音效果和外部采集码流控制,同时还对登录房间.媒体播放器以及第三方库进行了优化 ...

  9. elasticSearch初步学习反思

    转自自己的qq空间 2022年11月29日 每次找到新技术就会发癫 把业务整理完了 看着elasticSearch开始发癫 TM的把所有的一切都塞给它 反正全标记索引要啥拿啥 狠狠地获取就完了 思来想 ...

  10. RDB初步了解

    RDB概念 快照文件是.rdb结尾 redis6.2以前和之后(包括6.2)在什么条件下会保存rdb文件有所不同 以前 15min&&1个key(改变)调用保存 5min&&a ...