OrikaMapper VS BeanUtils.copyProperties

复制bean的几种方法
1.事前准备
两个基础类

@Data
class Person implements Serializable {
    private static final long serialVersionUID = 4305013886991449314L;
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private int age;
    private String name; //对应User的nickname
    
}
@Data
class User implements Serializable {
    private static final long serialVersionUID = 8843535271490853414L;
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    private int age;
    private int nickName;//不同名称对应得用People的name
  
}

2实践
2.1BeanUtils使用

/**
 * @describe: 复制bean的集中方法比较
 * 1.beanUtil.copyProperties(source,target)
 * 2.orika
 * @author:zqm
 */
public class CopyBeanController {
    public static void main(String[] args) {
        User user=new User();
        user.setId(1);
        user.setSex("man");
        user.setUsername("Tison");
        user.setAddress("address");
        user.setBirthday(new Date());
        user.setAge("1");
        user.setNickName(1111);
        Person p=new Person();
        Person target=new Person();
        BeanUtils.copyProperties(user,target);
        System.out.println(user.toString());
        System.out.println(target.toString());
    }
}

结果:
结论:BeanUtils.copyProperties()只能复制相同属性名且属性类型必须相同。否则复制不成功。
2.2 使用Orika
2.2.1 添加依赖

 //gradel
// https://mvnrepository.com/artifact/ma.glasnost.orika/orika-core
    compile group: 'ma.glasnost.orika', name: 'orika-core', version: '1.5.4'
//maven
<!-- https://mvnrepository.com/artifact/ma.glasnost.orika/orika-core -->
<dependency>
    <groupId>ma.glasnost.orika</groupId>
    <artifactId>orika-core</artifactId>
    <version>1.5.4</version>
</dependency>

2.2.2 配置orika

package com.zqm.utils;
import com.google.common.collect.Lists;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import org.apache.commons.beanutils.converters.BigIntegerConverter;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.List;
/**
 * @describe:
 * @author:zqm
 */
@Component
public class OrikaMapper {
    private MapperFacade mapperFacade = null;
    private MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    
    //自定义自己的mapperFactory集合
    @Autowired(required = false)
    private List<OrikaRegist> orikaRegistyList = Lists.newArrayList();
    /**
     * 初始化Orika注册
     */
    @PostConstruct
    private void init() {
        
        //登记到mapperFactory
         if (!StringUtils.isEmpty(orikaRegistyList)) {
            for (OrikaRegist orikaRegist : orikaRegistyList) {
                orikaRegist.register(mapperFactory);
            }
        }
        mapperFacade = mapperFactory.getMapperFacade();
    }
    //复制单个对象
    public  <V, P> P convert(V base, Class<P> target) {
        return mapperFacade.map(base, target);
    }
    //复制list
    public <V, P> List<P> convertList(List<V> baseList, Class<P> target) {
        List<P> list = CollectionUtils.isEmpty(baseList) ? Collections.<P>emptyList() : mapperFacade.mapAsList(baseList, target);
        return list;
    }
}

结果:
针对不同的属性名称还可以指定属性名对应的关系。如:nickname对应name;
添加配置自定义的mapperFactory:
接口类:

public interface OrikaRegist {
    void register(MapperFactory factory);
}
具体实现:
@Component
public class PersonRegist implements OrikaRegist {
    @Override
    public void register(MapperFactory factory) {
        factory.classMap(com.zqm.vo.User.class,Person.class )
                .field("nickName", "name")
                .byDefault()
                .register();
    }
}

结论:只要名称一致即可。还可以定制化指定属性的对应关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值