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 ...
随机推荐
- http_basic认证(401)爆破
Http Basic认证(401)爆破 hydra,burpsuit 在thm:https://tryhackme.com/room/toolsrus 遇到了这个问题,但这个用的工具是hydra,想起 ...
- Liunx下对php内核的调试
0x01前言 主要是对上一篇文章中php_again这道题的补充. 0x02下载php源码 cd /usr/local wget https://www.php.net/distributions/p ...
- 春秋杯春季联赛&&ciscn2023华北赛区部分题解
前言 复现几个比赛时没做出来的题 1.[CISCN 2023 华北赛区]ez_ruby 查文档可知 ruby内置的open函数,如果第一个字符是管道符|,后面就可以接命令.这可能是考察涉猎的知识范围广 ...
- Java正三角、倒三角
正三角 public static void main(String[] args) { // 正三角 int num = 8; for(int i = 1;i<=num;i++) { for( ...
- python3使用PIL添加中文文本水印背景
环境:Windows10_x64 Python版本 :3.9.2 Pillow版本:9.1.1 写的博客文章被转载且不注明出处的情况时有发生,甚至有部分转载者将文章配图添加自己的水印!为了保护作 ...
- .NET写一个自己的Lambda表达式与表达式树
LambdaExpression继承Expression Expression又继承LambdaExpressio 所以,Expression与 Expression的区别在于:泛型类以静态类型的方法 ...
- 快速实现 CDN 直播
功能简介 ZEGO Express SDK 支持推流到 CDN(Content Delivery Network,内容分发网络),包括转推 CDN 和直推 CDN 两种功能.开发者基于该功能可打通 R ...
- BUUCTF-MISC-LSB(stegsolve的一种妙用)
题目已知是LSB隐写 丢入stegsolve,点 > ,可以看见Red plane 0,Green plane 0,Blue plane 0上边好像有东西 点analyse->data e ...
- Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能.但是通过对 Cilium 不同模式的切换/功能的启用,可以 ...
- #Powerbi 1分钟学会利用AI,为powerbi报表进行高端颜色设计
在BI报表的设计中,配色方案往往成为一大难题,一组切合主题.搭配合理的颜色设计往往能为我们的报表,加分不少. 今天,就介绍一个AI配色的网站,利用AI为pbi报表进行配色设计. 一:网站网址 http ...