在实际开发中,会出现我从dao层拿到的domain对象需要将里面的数据进行取出并赋值到另一个对象中,尤其在领域驱动中,基本会经常出现这种对象数据拷贝到另一个对象中的情况,一般如果手动set还是比较费时费力的,今天就来介绍一款工具类来简化这种set操作。下面有请我们的Orika闪亮登场。
Orika的过多介绍就不多说了。效率上因为Orika 的设计思路是预先通过javaassist 把Java Bean 之间的映射关系一次性生成目标拷贝方法代码。 这样就可以避免在Bean 映射环节一次次的读取映射规则。 从而实现效率上的提高。好了,废话不多说,直接上代码。
为了方便理解,我们不基于任何框架以及其他项目管理工具等,直接使用最基本的Test测试以及jar包手动导入的方式来。
链接:http://pan.baidu.com/s/1min3iuk 密码:8t9t
需求:将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);
结果如下,拷贝成功
需求:需求:将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);
运行结果
需求 :将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);
结果如下
感谢一楼提出的疑问,本人也对这种情况下的对象拷贝写了一个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);