java list 结构体_MapStruct实体转换及List转换的方法讲解

开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址: http://mapstruct.org/

引入依赖

org.mapstruct

mapstruct-jdk8

1.1.0.Final

需求

我们假设有学生student 类 需要转换成 用户 user 类,将学生信息存入用户信息库

此时Student 类内容如下:

public class Student {

private Integer id;

private String name;

private Integer age;

private String sex;

//setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦

}

此时User 类内容如下:

public class User {

private Integer id;

private String name;

private Integer age;

private String sex;

//setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦

}

转换model

此时 Student 和 User 的属性名字都相同那么转换接口就是

import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")

public interface UserMapping {

/**

* Student 转化为 User

* @param Student

* @return

*/

User studentToUser(Student student);

}

程序运行前要先编译 mvn clean compile , 从而mapstruct框架生成UserMappingImpl 实现类。

转换model 属性不匹配

如果 User 和 Student 的属性名不对应例如:

此时Student 类内容如下:

public class Student {

private Integer id;

private String sname;

private Integer age;

private String sex;

//setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦

}

此时User 类内容如下:

public class User {

private Integer id;

private String uname;

private Integer age;

private String sex;

//setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦

}

那么转换接口为

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Mappings;

@Mapper(componentModel = "spring")

public interface UserMapping {

/**

* Student 转化为 User

* @param Student

* @return

*/

@Mappings({

@Mapping(target = "uname", source = "sname")

// 多个属性不对应可以用 "," 隔开编写多个@Mapping

// ,@Mapping(target = "uname", source = "sname")

})

User studentToUser(Student student);

}

转换model 属性类型不匹配

比如说user 类的sex字段类型改为boolean

此时User 类内容如下:

public class User {

private Integer id;

private String uname;

private Integer age;

private boolean sex;

//setters, getters, toString() 方法此处省略不写,但是实际开发需要写的哦

}

这个转换需求有点变态,所以 需要我门自己写个转换类

public class UserTransform {

public String booleanToString(boolean value){

if(value){

return "男";

}

return "女";

}

public boolean strToBoolean(String str){

if ("男".equals(str)) {

return true;

}

return false;

}

}

那么转换接口为(使用 UserTransform.class 类)

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Mappings;

@Mapper(componentModel = "spring",uses = UserTransform.class)

public interface UserMapping {

/**

* Student 转化为 User

* @param Student

* @return

*/

@Mappings({

@Mapping(target = "uname", source = "sname")

// 多个属性不对应可以用 "," 隔开编写多个@Mapping

// ,@Mapping(target = "uname", source = "sname")

})

User studentToUser(Student student);

}

转换list

当user 和 student 都是集合形式list 时应当如下转换

转化 List<> 集合时必须有 实体转化,因为在实现中,List 转换是 for循环调用 实体转化的。所以当属性名不对应时,应该在 实体转化进行 @Mappings 的属性名映射配置,然后list的转换也会继承这和属性的映射。

例如 属性名相同

import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")

public interface UserMapping {

/**

* Student 转化为 User

* @param Student

* @return

*/

User studentToUser(Student student);

/**

* Students 转化为 Users

* @param Students

* @return

*/

List studentsToUsers(List students);

属性名不同:

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Mappings;

@Mapper(componentModel = "spring")

public interface UserMapping {

/**

* Student 转化为 User

* @param Student

* @return

*/

@Mappings({

@Mapping(target = "uname", source = "sname")

// 多个属性不对应可以用 "," 隔开编写多个@Mapping

// ,@Mapping(target = "uname", source = "sname")

})

User studentToUser(Student student);

/**

* 此时 studentsToUsers 的实现为循环调用 studentToUser 并继承了 studentToUser 的属性映射

* Students 转化为 Users

* @param Students

* @return

*/

List studentsToUsers(List students);

}

展示自动生成的 UserMappingImpl 实现(此类为 执行 mvn clean compile 后自动生成)

@Component

public class UserMappingImpl implements UserMapping {

@Override

public User studentToUser(student student) {

if ( student == null ) {

return null;

}

User user = new User();

User.setId(student.getId() );

User.setName(student.getName() );

// 如果配置了属性映射则为

//User.setUname(student.getSname() );

User.setSex(student.getSex() );

User.setAge(student.getAge() );

return user;

}

@Override

public List studentsToUsers(List students) {

if ( students == null ) {

return null;

}

List list = new ArrayList();

for ( student student : students ) {

list.add( studentToUser( student ) );

}

return list;

}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值