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

来源:互联网 发布:php的laravel框架 编辑:程序博客网 时间:2024/06/06 03:51

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

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

前期准备

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

所需jar包

这里写图片描述

下载地址

链接: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<User> 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<CopyUser> 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<User> userList;    public List<User> getUserList() {        return userList;    }    public void setUserList(List<User> 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<CopyUser> userList;    public List<CopyUser> getUserList() {        return userList;    }    public void setUserList(List<CopyUser> 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<User> 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);

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

原创粉丝点击