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);
最终结果
以上结论均属本人理解,如有问题或不足,望指出,共同成长。
- java关于使用Orika的mapperFactory进行对象拷贝以及集合拷贝
- 使用Java对两个对象的属性进行拷贝
- 关于集合的拷贝
- Java对象和集合拷贝
- 使用java进行文件夹的拷贝
- java对象的拷贝
- Java对象的拷贝
- 【Java】对象的拷贝
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- java对象的深拷贝浅拷贝
- Java集合的深拷贝
- 通过JAVA的Serialization机制进行对象的拷贝
- java对象克隆以及深拷贝和浅拷贝
- java数组的对象化,序列化以及拷贝
- AS3使用ByteArray进行对象深度拷贝
- splay总结
- Java并发编程:Synchronized及其实现原理
- C++排序算法之归并排序
- QT 支持多客户端网络视频监控的实现
- 计算机视觉目标检测的框架与过程
- java关于使用Orika的mapperFactory进行对象拷贝以及集合拷贝
- TKmybatis的框架介绍和原理分析及Mybatis新特性演示
- SpringMVC日期类型转换问题三大处理方法归纳
- mongoDB 操作
- 广播
- python gevent 示例
- WPF去除DataGrid多余的空白列
- C++教程:指向成员函数的指针
- IGS和Rinex