JAVA Bean对象转换工具


 

在开发中有些规范,比如DTO、DO、VO等等,之间,如果我们需要转换,单纯的我们要一个一个的 set 值,真是一项苦B的活,在我以前接触的项目中发现很多代码是使用get/set来进行转换的,大量的这种冗余代码,看着头都大!!

 BeanUtils

java bean对象的相关转化,这里介绍两个 ,一个是大家都非常熟悉的 BeanUtils,还有一个就是平常在开发中经常使用的 MapStruct。


MapStructBeanUtils 最常用的莫过于对象的的拷贝了 。 不过面对需要深拷贝的对象大家要注意了,这里并不推荐大家使用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包

 <!-- jdk8以下就使用mapstruct -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.2.0.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.2.0.Final</version>
</dependency>

定义两个相同字段的对象


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这么强大的功能,不管是日期格式化、还是表达式解析、还是深拷贝,都能一一搞定。
抛砖引玉!
剩下的就交给聪明的小伙伴了!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个肥鲶鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值