Springboot多种字段copy工具比较

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

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);

    }
}

image
总结
image

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

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("");
    }
}

image

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("");
    }
}

image
总结

  • 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("");
    }

}

image
将日期注释掉
image
总结

  • 部分类型不一致可以自动转换
  • 深拷贝
  • 对字符串转日期格式不支持
posted @ 2023-05-19 16:53  spiderMan1-1  阅读(334)  评论(0编辑  收藏  举报