java关于使用Orika的mapperFactory进行对象拷贝以及集合拷贝

在实际开发中,会出现我从dao层拿到的domain对象需要将里面的数据进行取出并赋值到另一个对象中,尤其在领域驱动中,基本会经常出现这种对象数据拷贝到另一个对象中的情况,一般如果手动set还是比较费时费力的,今天就来介绍一款工具类来简化这种set操作。下面有请我们的Orika闪亮登场。

Orika的过多介绍就不多说了。效率上因为Orika 的设计思路是预先通过javaassist 把Java Bean 之间的映射关系一次性生成目标拷贝方法代码。 这样就可以避免在Bean 映射环节一次次的读取映射规则。 从而实现效率上的提高。好了,废话不多说,直接上代码。

前期准备

为了方便理解,我们不基于任何框架以及其他项目管理工具等,直接使用最基本的Test测试以及jar包手动导入的方式来。

所需jar包

java关于使用Orika的mapperFactory进行对象拷贝以及集合拷贝_第1张图片

下载地址

链接:http://pan.baidu.com/s/1min3iuk 密码:8t9t

Demo1(对象拷贝 属性名相同)

需求:将User对象中的内容拷贝到CopyUserBase中(两个类的属性名相同)

User

package com.beyondli.base.domain;

import java.io.Serializable;

/**
 * Created by beyondLi on 2017/6/7.
 */

public class User implements Serializable{
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

CopyUserBase

package com.beyondli.base.domain;

/**
 * Created by beyondLi on 2017/7/12.
 */
public class CopyUserBase {
    private String name;
    private Integer age;

    public CopyUserBase() {
    }

    public CopyUserBase(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "CopyUserBase{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Test

        //对象复制
        //1.获取mapperFactory对象
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        User user = new User("beyondLi", 18);
        //复制对象(属性名相同) 方法1
        //CopyUserBase copyUserBase1 = mapperFactory.getMapperFacade(User.class, CopyUserBase.class).map(user);
        //复制对象(属性名相同) 方法2
        CopyUserBase copyUserBase2 = mapperFactory.getMapperFacade().map(user, CopyUserBase.class);
        System.out.println(copyUserBase2);

结果如下,拷贝成功
这里写图片描述

Demo2(对象拷贝 属性名不同)

需求:需求:将User对象中的内容拷贝到CopyUser中(两个类的属性名不相同)

User

同上

CopyUser

package com.beyondli.base.domain;

/**
 * Created by beyondLi on 2017/7/12.
 */
public class CopyUser {
    private String name;
    private Integer copyAge;

    public CopyUser() {
    }

    public CopyUser(String name, Integer copyAge) {
        this.name = name;
        this.copyAge = copyAge;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getCopyAge() {
        return copyAge;
    }

    public void setCopyAge(Integer copyAge) {
        this.copyAge = copyAge;
    }

    @Override
    public String toString() {
        return "CopyUser{" +
                "name='" + name + '\'' +
                ", copyAge=" + copyAge +
                '}';
    }
}

Test

        //对象复制
        //1.获取mapperFactory对象
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        User user = new User("beyondLi", 18);
        //复制对象(属性名不同) 方法
        //首先使用classMap将两个类的字节码存好,使用field将双方名字对应,若有多个不同可连续使用field,使用byDefault将其余相同名字的自动拷贝(如果不使用则只会拷贝被field配置的属性),最后使用register使其生效
        mapperFactory.classMap(User.class,CopyUser.class).field("age", "copyAge").byDefault().register();
        CopyUser copyUser = mapperFactory.getMapperFacade().map(user, CopyUser.class);
        System.out.println(copyUser);

运行结果
这里写图片描述

Demo3(集合拷贝 属性名不同)

需求 :将User集合拷贝到CopyUser集合中

User与CopyUser分别同上
Test

        //复制集合
        //1.获取mapperFactory对象
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        //创建集合
        List userList = new ArrayList<>();
        //向集合中添加
        userList.add(new User("beyondLi", 22));
        userList.add(new User("lby", 23));
        userList.add(new User("Li", 24));
        //进行集合复制(不同属性名)
        //进行属性名匹配
        mapperFactory.classMap(User.class, CopyUser.class).field("age", "copyAge").byDefault().register();
        //进行集合复制
        List copyUsers = mapperFactory.getMapperFacade().mapAsList(userList, CopyUser.class);
        //输出
        System.out.println(copyUsers);

结果如下
这里写图片描述

Demo4(对象中包含集合,但集合中的对象中属性名称不同的对象拷贝)

感谢一楼提出的疑问,本人也对这种情况下的对象拷贝写了一个demo,希望可以帮助到一楼,并且希望有更多的同学可以多多提问,一起学习。好了,上代码。

Customer

package com.beyondli.base.domain;

import java.util.List;

/**
 * Created by beyondLi on 2017/7/29.
 */
public class Customer {

    private List userList;

    public List getUserList() {
        return userList;
    }

    public void setUserList(List userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "userList=" + userList +
                '}';
    }
}

CustomerCopy

package com.beyondli.base.domain;


import java.util.List;

/**
 * Created by beyondLi on 2017/7/29.
 */
public class CustomerCopy {
    private List userList;

    public List getUserList() {
        return userList;
    }

    public void setUserList(List userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "CustomerCopy{" +
                "userList=" + userList +
                '}';
    }
}

User与CopyUser同上(age与copyAge属性名称不同)
测试代码

       //获取mapperFactory
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        //创建对象
        User user = new User();
        user.setName("beyondLi");
        user.setAge(22);
        //创建集合
        List list = new ArrayList<>();
        list.add(user);
        Customer customer = new Customer();
        customer.setUserList(list);
        System.out.println(customer);
        //将customer拷贝到customerCopy中但是其中对象有一个属性名称不一样
        //首先设置对应集合中的对象的不同属性对应的名称
        mapperFactory.classMap(User.class, CopyUser.class).field("age","copyAge").byDefault().register();
        //之后进行拷贝
        CustomerCopy customerCopy = mapperFactory.getMapperFacade().map(customer, CustomerCopy.class);
        System.out.println(customerCopy);

最终结果
这里写图片描述
以上结论均属本人理解,如有问题或不足,望指出,共同成长。

你可能感兴趣的:(JavaSE)