Springboot多种字段copy工具比较
结论:推荐使用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工具比较的更多相关文章
- fieldmeta 基于springboot的字段元数据管理,通用代码生成,快速开发引擎
fieldmeta: 基于springboot的字段元数据管理 version:Alpha 0.0.1 ,码云地址:https://gitee.com/klguang/fieldmeta 元数据(Me ...
- [下载]Oracle LOB字段编辑工具
OraLobEditor 是Oracle LOB (CLOB, BLOB) 字段编辑工具. 查看.编辑LOB (CLOB, BLOB)字段(plain text, RTF, image, hex, h ...
- springboot封装JsonUtil,CookieUtil工具类
springboot封装JsonUtil,CookieUtil工具类 yls 2019-9-23 JsonUtil public class JsonUtil { private static Obj ...
- SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式
SpringBoot系列(八) 分分钟学会SpringBoot多种跨域解决方式 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 s ...
- cglib、orika、spring等bean copy工具性能测试和原理分析
简介 在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO.DTO.Entity.DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护.通常情况下,这 ...
- SpringBoot集成Mybatis-PageHelper分页工具类,实现3步完成分页
在Mybatis中,如果想实现分页是比较麻烦的,首先需要先查询出总的条数,然后再修改mapper.xml,为sql添加limit指令. 幸运的是现在已经不需要这么麻烦了,刘大牛实现了一个超牛的分页工具 ...
- Spring-Boot ☞ ShapeFile文件读写工具类+接口调用
一.项目目录结构树 二.项目启动 三.往指定的shp文件里写内容 (1) json数据[Post] { "name":"test", "path&qu ...
- springboot工程自动生成工具
1 springboot工程自动生成网址 http://start.spring.io/ 2 工具 Spring Boot CLI
- SpringBoot 项目在静态工具类中注入 RedisTemplate
静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...
- springboot 整合redis redis工具类
一步 : pom中引入相关依赖 <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boo ...
随机推荐
- ODOO13 之九:Odoo 13开发之外部 API – 集成第三方系统
Odoo 13开发之外部 API – 集成第三方系统 Odoo 服务器端带有外部 API,可供网页客户端和其它客户端应用使用.本文中我们将学习如何在我们的客户端程序中使用 Odoo 的外部 API.为 ...
- 「AntV」X6开发实践:踩过的坑与解决方案
长期更新版文档请移步语雀(「AntV」X6开发实践:踩过的坑与解决方案 (yuque.com)) ️ | 如何自定义拖拽源? 相信你们在开发中更多的需求是需要自定义拖拽源,毕竟自定义的功能扩展性高一些 ...
- CANoe学习笔记(三):CANoe的诊断功能和cdd文件
内容: UDS诊断学习 CDD文件配置 诊断功能 一.UDS诊断学习: ①.UDS请求命令4种构成方式: SIDSID+SF(Sub-function)SID+DID(Data Identifier) ...
- JIRA安装
JIRA安装 操作系统: 阿里云centos6.8 域名: yan.jzhsc.com 1.安装与配置JAVA sudo -u root -H bash # 在oracle官网下载JDK,安装并配置环 ...
- celery笔记七之周期/定时任务及crontab定义
本文首发于公众号:Hunter后端 原文链接:celery笔记七之周期/定时任务及crontab定义 periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或 ...
- Redis数据类型之Stream系列一
一:Stream简介 Redis Stream是5.0版本之后新增的一种数据结构,其结构类似于'仅追加日志'.但也实现了多种操作来克服'仅追加日志'的一些限制,如读取策略(xread,xrange ...
- vue3+ts使用v-for出现unknown问题
最近在写项目时遇到了一个问题,当我从父组件向子组件传数据并且需要将子组件对传入的数据进行v-for循环渲染时,在此出遇到了一个ts报错 报错为循环出的data类型为unknown 具体代码如下 : 子 ...
- 即构SDK10月迭代:新增多款语音音效、外部采集码流控制及Android SDK 最低支持操作系统版本调整
即构SDK10月迭代内容来喽~~~ 本月调整了Android SDK 最低支持的操作系统版本,新增了流删除回调原因, 4种变音效果和外部采集码流控制,同时还对登录房间.媒体播放器以及第三方库进行了优化 ...
- elasticSearch初步学习反思
转自自己的qq空间 2022年11月29日 每次找到新技术就会发癫 把业务整理完了 看着elasticSearch开始发癫 TM的把所有的一切都塞给它 反正全标记索引要啥拿啥 狠狠地获取就完了 思来想 ...
- RDB初步了解
RDB概念 快照文件是.rdb结尾 redis6.2以前和之后(包括6.2)在什么条件下会保存rdb文件有所不同 以前 15min&&1个key(改变)调用保存 5min&&a ...