复制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();
}
}
结论:只要名称一致即可。还可以定制化指定属性的对应关系。