【精品】基于 MapStruct实现 JavaBean克隆及属性拷贝

List user2UserBO(List user);

}

测试代码

public class MapStructTest {

@Test

public void fun1() {

User user = DataUtil.build(User.class);

System.out.println(user);

UserBO userBO = UserMapper.MAPPER.user2UserBO(user);

System.out.println(userBO);

}

@Test

public void fun2() {

List list = new ArrayList<>();

list.add(DataUtil.build(User.class));

list.add(DataUtil.build(User.class));

list.add(DataUtil.build(User.class));

list.forEach(System.out::println);

List res = UserMapper.MAPPER.user2UserBO(list);

res.forEach(System.out::println);

}

}

:UserMapper只是一个接口,它只所以能够直接使用,是因为系统自动生成了UserMapper的实现类,具体代码如下所示:

public class UserMapperImpl implements UserMapper {

public UserMapperImpl() {

}

public UserBO user2UserBO(User user) {

if (user == null) {

return null;

} else {

UserBOBuilder userBO = UserBO.builder();

userBO.id(user.getId());

userBO.nickname(user.getNickname());

userBO.avatar(user.getAvatar());

userBO.email(user.getEmail());

userBO.wechat(user.getWechat());

userBO.status(user.getStatus());

return userBO.build();

}

}

public List user2UserBO(List user) {

if (user == null) {

return null;

} else {

List list = new ArrayList(user.size());

Iterator var3 = user.iterator();

while(var3.hasNext()) {

User user1 = (User)var3.next();

list.add(this.user2UserBO(user1));

}

return list;

}

}

}

进阶一:属性名不同


待转换的类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class User implements Serializable {

private static final long serialVersionUID = 6357528845064191241L;

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 大头相

*/

private String img;

/**

  • 邮箱

*/

private String email;

/**

  • 微信

*/

private String wechat;

/**

  • 更新时间

*/

private Date updateTime;

}

目标类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class UserBO implements Serializable {

private static final long serialVersionUID = 7257164843346458694L;

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 大头相

*/

private String img;

/**

  • 邮编

*/

private String email;

/**

  • 微信

*/

private String wexin;

/**

  • 更新时间

*/

private Date updateTime22;

}

转换接口

@Mapper

public interface UserMapper {

UserMapper MAPPER = Mappers.getMapper(UserMapper.class);

@Mappings({

@Mapping(source = “avatar”, target = “img”),

@Mapping(source = “wechat”, target = “wexin”),

@Mapping(source = “updateTime”, target = “updateTime22”)

})

UserBO user2UserBO(User user);

}

测试类

public class MapStructTest {

@Test

public void fun() {

User user = DataUtil.build(User.class);

System.out.println(user);

UserBO userBO = UserMapper.MAPPER.user2UserBO(user);

System.out.println(userBO);

}

}

进阶二:数据类型不一样


待转换的类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class User {

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 创建时间

*/

private LocalDateTime createTime;

}

目标类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class UserBO {

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 创建时间

*/

private String createTime;

}

转换工具类

public class DateTransUtil {

public static LocalDateTime str2LocalDateTime(String str){

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);

return LocalDateTime.parse(str,dtf);

}

public static String localDateTime2Str(LocalDateTime localDateTime){

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);

return dtf.format(localDateTime);

}

}

转换接口

@Mapper

public interface UserMapper {

UserMapper MAPPER = Mappers.getMapper(UserMapper.class);

@Mapping(target = “createTime”, expression = “java(com.hc.util.DateTransUtil.localDateTime2Str(user.getCreateTime()))”)

UserBO user2UserBO(User user);

}

测试类

public class MapStructTest {

@Test

public void fun() {

User user = DataUtil.build(User.class);

System.out.println(user);

UserBO userBO = UserMapper.MAPPER.user2UserBO(user);

System.out.println(userBO);

}

}

进阶三:将多个对象转换成一个对象


待合并的类

  • UserBO

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class UserBO {

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

}

  • AddressBO

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class AddressBO {

private String addr;

}

目标类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class User {

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 地址

*/

private String addr;

}

转换接口

@Mapper

public interface UserMapper {

UserMapper MAPPER = Mappers.getMapper(UserMapper.class);

@Mappings({

@Mapping(source = “userBO.id”, target = “id”), //可以省略

@Mapping(source = “userBO.nickname”, target = “nickname”), //可以省略

@Mapping(source = “addressBO.addr”, target = “addr”), //可以省略

})

User user2UserBO(UserBO userBO, AddressBO addressBO);

}

说明:

  • 当多个对象中, 有其中一个为 null, 则会直接返回 null

  • 当多个原对象中,有相同名字的属性时,需要通过 @Mapping 注解来具体的指定, 以免出现歧义(不指定会报错)

测试类

public class MapStructTest {

@Test

public void fun() {

UserBO userBO = DataUtil.build(UserBO.class);

System.out.println(userBO);

AddressBO addressBO = DataUtil.build(AddressBO.class);

System.out.println(addressBO);

User user = UserMapper.MAPPER.user2UserBO(userBO,addressBO);

System.out.println(user);

}

}

进阶二:转换非基础类型的属性


待转换的类

目标类

转换接口

测试类

进阶二:更新Bean对象–基于泛型的转换(★★★★★)


待转换的实体类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class User implements Serializable {

private static final long serialVersionUID = 6357528845064191241L;

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 大头相

*/

private String avatar;

/**

  • 登录名

*/

private String account;

/**

  • 密码

*/

private String password;

/**

  • 性别 1男 2女 3未知

*/

private Byte gender;

/**

  • 电话

*/

private String tel;

/**

  • 邮编

*/

private String email;

/**

  • QQ

*/

private String qq;

/**

  • 微信

*/

private String wechat;

/**

  • 盐值

*/

private String salt;

/**

  • 备注

*/

private String info;

/**

  • 状态

*/

private Byte status;

/**

  • 注册时间

*/

private Date createTime;

/**

  • 更新时间

*/

private Date updateTime;

}

目标实体类

@Getter

@Setter

@ToString

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class UserBO implements Serializable {

private static final long serialVersionUID = 7257164843346458694L;

/**

  • 编号

*/

private Long id;

/**

  • 昵称

*/

private String nickname;

/**

  • 大头相

*/

private String avatar;

/**

  • 邮编

*/

private String email;

/**

  • 微信

*/

private String wechat;

}

泛型类

@Getter

@Setter

@ToString

@NoArgsConstructor

@AllArgsConstructor

public class PageBean {

/**

  • 每页显示的条数

*/

private Integer pageSize = 10;

/**

  • 当前的页码

*/

private Integer pageNum;

/**

  • 一共有多少条记录

*/

private Long total;

/**

  • 一共有多少页

*/

private Integer pages;

/**

  • 每一页所显示的数据

*/

private List result;

/**

  • 分页请求路径

*/

private String url;

}

转换接口

@Mapper

public interface UserMapper {

UserMapper MAPPER = Mappers.getMapper(UserMapper.class);

//方法一

PageBean user2UserBO(PageBean user);

//方法二

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
@Setter

@ToString

@NoArgsConstructor

@AllArgsConstructor

public class PageBean {

/**

  • 每页显示的条数

*/

private Integer pageSize = 10;

/**

  • 当前的页码

*/

private Integer pageNum;

/**

  • 一共有多少条记录

*/

private Long total;

/**

  • 一共有多少页

*/

private Integer pages;

/**

  • 每一页所显示的数据

*/

private List result;

/**

  • 分页请求路径

*/

private String url;

}

转换接口

@Mapper

public interface UserMapper {

UserMapper MAPPER = Mappers.getMapper(UserMapper.class);

//方法一

PageBean user2UserBO(PageBean user);

//方法二

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-qeGbIrJU-1715233207403)]

[外链图片转存中…(img-eXi8zDeN-1715233207404)]

[外链图片转存中…(img-DYW7OVIq-1715233207404)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值