首页 > 其他分享 >BeanCopier copy

BeanCopier copy

时间:2023-06-09 17:44:24浏览次数:41  
标签:name UserDO Teacher BeanCopier import copy id

参考:  BeanCopier  copy

使用:

org.springframework.cglib.beans.BeanCopier


BeanCopier是用于在两个bean之间进行属性拷贝的。BeanCopier支持两种方式:

1、一种是不使用Converter的方式,仅对两个bean间属性名和类型完全相同的变量进行拷贝;
2、另一种则引入Converter,可以对某些特定属性值进行特殊操作。

Teacher类

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    Integer id;
    public String name;
    private Integer gender;
}

UserDO类
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.Date;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserDO {

    private Integer id;
    protected String name;
    // 余额
    BigDecimal balance;
    Teacher teacher;
    public String pwd;
    public Date createTime;

}

UserDTO类
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {

    // 类中定义,必须为包装类型,这里只是为了演示效果
    private int id;
    protected String name;
    // 余额
    String balance;
    Teacher teacher;
    public String otherMember;
    public String createTime;

}

 

 

测试类

import org.junit.Test;
import org.springframework.cglib.beans.BeanCopier;

import java.math.BigDecimal;
import java.util.Date;

public class SpringBeanCopierTest {

    @Test
    public void test01() {
        UserDO userDO = this.getUserDO();
        System.out.println(userDO);
//        UserDO(id=1, name=zhangsan, balance=10.24, teacher=Teacher(id=1, name=teacher1, gender=1), pwd=111111, createTime=Fri Jun 09 16:57:59 CST 2023)
        // false不使用转换器
        BeanCopier copier = BeanCopier.create(UserDO.class, UserDTO.class, false);
        UserDTO userDTO = new UserDTO();
        copier.copy(userDO, userDTO, null);
        System.out.println(userDTO);
//        UserDTO(id=0, name=zhangsan, balance=null, teacher=Teacher(id=1, name=teacher1, gender=1), otherMember=null, createTime=null)

        userDO.getTeacher().setName("teacher2");

        // BeanCopier也存在浅拷贝问题
        System.out.println(userDO);
        System.out.println(userDTO);
//        UserDO(id=1, name=zhangsan, balance=10.24, teacher=Teacher(id=1, name=teacher2, gender=1), pwd=111111, createTime=Fri Jun 09 16:57:59 CST 2023)
//        UserDTO(id=0, name=zhangsan, balance=null, teacher=Teacher(id=1, name=teacher2, gender=1), otherMember=null, createTime=null)
    }

    @Test
    public void test02() {
        UserDO userDO = this.getUserDO();
        System.out.println(userDO);
//        UserDO(id=1, name=zhangsan, balance=10.24, teacher=Teacher(id=1, name=teacher1, gender=1), pwd=111111, createTime=Fri Jun 09 16:58:47 CST 2023)
        // true使用转换器
        BeanCopier copier = BeanCopier.create(UserDO.class, UserDTO.class, true);
        UserDTO userDTO = new UserDTO();
        copier.copy(userDO, userDTO, new UserDOToDTOConverter());
        System.out.println(userDTO);
//        UserDTO(id=1, name=zhangsan, balance=10.24, teacher=Teacher(id=1, name=teacher1, gender=1), otherMember=null, createTime=2023-06-09 16:58:47)

        userDO.getTeacher().setName("teacher2");

        // BeanCopier也存在浅拷贝问题
        System.out.println(userDO);
        System.out.println(userDTO);
//        UserDO(id=1, name=zhangsan, balance=10.24, teacher=Teacher(id=1, name=teacher2, gender=1), pwd=111111, createTime=Fri Jun 09 16:58:47 CST 2023)
//        UserDTO(id=1, name=zhangsan, balance=10.24, teacher=Teacher(id=1, name=teacher2, gender=1), otherMember=null, createTime=2023-06-09 16:58:47)
    }

    private UserDO getUserDO() {
        Teacher teacher = Teacher.builder().id(1).name("teacher1").gender(1).build();
        BigDecimal balance = BigDecimal.valueOf(10.24);
        UserDO userDO = UserDO.builder().id(1).name("zhangsan").balance(balance).teacher(teacher).pwd("111111").createTime(new Date()).build();
        return userDO;
    }
}

 

 

 

一  test01()不使用Converter

通过结果发现:UserDO的int类型的属性, 无法拷贝到UserDTO的Integer。.

即:BeanCopier 只拷贝名称和类型都相同的属性。

即使源类型是原始类型(int, short和char等),目标类型是其包装类型(Integer, Short和Character等),或反之:都不会被拷贝。

二 test02()使用Converter

1、一旦使用Converter,BeanCopier只使用Converter定义的规则去拷贝属性,所以在convert()方法中要考虑所有的属性;
2、毫无疑问,使用Converter会使对象拷贝速度变慢。

 

三 总结

当源类和目标类的属性名称、类型都相同,拷贝没问题。
当源对象和目标对象的属性名称相同、类型不同,那么名称相同而类型不同的属性不会被拷贝。注意,原始类型(int,short,char)和 他们的包装类型,在这里都被当成了不同类型,因此不会被拷贝。
源类或目标类的setter比getter少,拷贝没问题,此时setter多余,但是不会报错。
源类和目标类有相同的属性(两者的getter都存在),但是目标类的setter不存在,此时会抛出NullPointerException。
加缓存可以提升拷贝速度。

 

标签:name,UserDO,Teacher,BeanCopier,import,copy,id
From: https://www.cnblogs.com/dzpykj/p/17469857.html

相关文章

  • BeanUtils.copyProperties笔记
    阿里开发者手册:【强制】避免用ApacheBeanutils进行属性的copy。说明:ApacheBeanUtils性能较差,可以使用其他方案比如SpringBeanUtils,CglibBeanCopier,注意均是浅拷贝。本笔记使用的是:org.springframework.beans.BeanUtils#copyProperties资料参考: BeanUtils.co......
  • cv2 undefined symbol: g_date_copy (or qt.qpa.plugin: Could not load..)解决
    cv2undefinedsymbol:g_date_copyorqt.qpa.plugin:Couldnotload问题背景:这次就是想用Qt5在Ubuntu上做一个GUI,结果一运行就报这个:QObject::moveToThread:Currentthread(0x7fc0f7435300)isnottheobject’sthread(0x7fc0f9f02cc0).Cannotmovetotargetthread(0x7......
  • JS通过 navigator.clipboard.writeText(textToCopy) 实现文本复制,navigator.clipboard
    问题描述代码:letgeometries=qChart.value.filter((e)=>e.geometry).map((e)=>e?.geometry);navigator.clipboard.writeText(JSON.stringify(geometries)).then(()=>{proxy.$modal.msgSuccess("已复制");}).catch(()=>{......
  • git add 时报错 warning: in the working copy of 'package-lock.json', LF will...
    来源:https://blog.csdn.net/qq_43842093/article/details/128471953问题:执行gitadd.时报错: 原因:换行符的问题, Windows下换行符和Unix下的换行符不一样,git会自动转换。 解决办法: 执行如下命令:gitconfig--globalcore.autocrlffalse问题解决 ......
  • How to use Vim copy line and paste line All In One
    HowtouseVimcopylineandpastelineAllInOne如何使用Vim复制行和粘贴行在可视化模式下visual非编辑模式下i#复制当前行yy#粘贴行pdemos(......
  • Java中的Copy-On-Write容器
    Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,......
  • Python集合 (set) 的增删改查及 copy()方法
    集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:1、去重,把一个列表变成集合,就自动去重了。2、关系测试,测试两组数据之前的交集、差集、并集等关系。一、集合的创建set1=set({1,2......
  • Flex实践—Simple Copy Panel
       上一次介绍了ActionScript函数的简单应用,这一次,来讲点简单的copy功能的实现吧。。。   下面的例子将完成对输入内容的拷贝和剪切。。。。    首先,和第一次介绍的步骤一样,新建一个FlexApplication   然后,拖控件,给必要的控件填写ID名以下的例子中用到的需要命名......
  • java arrays arraycopy 复制数组
    publicstaticvoidmain(Stringargs[]){int[]source={1,2,3,4,5,6,7};int[]target=newint[5];System.arraycopy(source,0,target,0,5);//6,7超出5的长度,被省略了System.out.println(Arrays.toString(target));for(......
  • Robocopy 可以与 refs 文件系统配合使用,以提高数据复制和同步的效率和可靠性
    Robocopy可以与refs文件系统配合使用,以提高数据复制和同步的效率和可靠性。Refs是WindowsServer2012R2引入的一种新型文件系统,具有高可靠性、高速度、高扩展性等特点。与NTFS不同,Refs文件系统具有更高的性能和更好的可靠性,因此在大数据环境中使用Robocopy进行数据......