在开发中有些规范,比如DTO、DO、VO等等,之间,如果我们需要转换,单纯的我们要一个一个的 set 值,真是一项苦B的活,在我以前接触的项目中发现很多代码是使用get/set来进行转换的,大量的这种冗余代码,看着头都大!!
专注于为中小企业提供网站制作、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业泾源免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。BeanUtilsjava bean对象的相关转化,这里介绍两个 ,一个是大家都非常熟悉的 BeanUtils,还有一个就是平常在开发中经常使用的 MapStruct。
MapStruct 和 BeanUtils 最常用的莫过于对象的的拷贝了 。 不过面对需要深拷贝的对象大家要注意了,这里并不推荐大家使用BeanUtils工具去实现
@Test
public void test01() {
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
sysUser.setUserName("张三");
sysUser.setCreateTime(new Date());
User user = new User();
BeanUtils.copyProperties(sysUser,user);
}
MapStruct下面重点说一下 MapStruct 这个转化,相对比的话BeanUtils 就是一个大老粗,只能同属性映射,或者在属性相同的情况下,允许被映射的对象属性少。
但当遇到被映射的属性数据类型被修改或者被映射的字段名被修改,则会导致映射失败。而 mapstruct 就是一个巧媳妇儿了。
她心思细腻,把我们可能会遇到的情况都给考虑到了(要是我也能找一个这样的媳妇儿该多好,内心笑出了猪声)
首先啥都不想果断导入Jar包org.mapstruct mapstruct-jdk81.2.0.Final org.mapstruct mapstruct-processor1.2.0.Final
定义两个相同字段的对象public class SysUser {
private Long userId;
private String account;
忽略get、set....
}
public class User {
private Long userId;
private String account;
忽略get、set....
}
接下来定义一个接口,但是注意不需要实现,他就呢能够帮我们转化很神奇的
//注意Mapper引入路径是:import org.mapstruct.Mapper;
@Mapper
public interface BeanConvert {
BeanConvert COPY_PROPERTIES = Mappers.getMapper(BeanConvert.class);
User sysUserDtoToUser(SysUser sysUser);
}
最后一步:在代码中调用,聪明的小伙伴看下面代码,一下就明白了,就是这么简单,搜易贼@Test
public void test01() {
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
sysUser.setAccount("一个肥鲇鱼");
User user = BeanConvert.COPY_PROPERTIES.sysUserDtoToUser(sysUser);
System.out.println(user); // User{userId=1, account='一个肥鲇鱼'}
}
两个对象字段不相同的情况完全两个类字段相同的情况是很容易的,那么,更加令我们头疼的 有多个字段名字不同但是有对应关系应该怎么搞呢?
小栗子public class SysUser {
private Long userId;
private String account;
忽略get、set....
}
public class User {
private Long userId;
private String userName;
忽略get、set....
}
将SysUser中account字段的值,赋值到User中userName
@Mapper
public interface BeanConvert {
BeanConvert COPY_PROPERTIES = Mappers.getMapper(BeanConvert.class);
@Mapping(source = "account", target = "userName")
User sysUserDtoToUser(SysUser sysUser);
// 多字段情况
// @Mappings({
// @Mapping(source = "userName", target = "account"),
// @Mapping(source = "userId", target = "id"),
// @Mapping(source = "createTime", target = "time")
// })
}
@Test
public void test01() {
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
sysUser.setAccount("一个肥鲇鱼");
User user = BeanConvert.COPY_PROPERTIES.sysUserDtoToUser(sysUser);
System.out.println(user);// User{userId=1, userName='一个肥鲇鱼'}
}
搞定,是不是很丝滑~
但是这么简单的两个小例子可包含不了 MapStruct这么强大的功能,不管是日期格式化、还是表达式解析、还是深拷贝,都能一一搞定。
抛砖引玉!
剩下的就交给聪明的小伙伴了!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧