开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址:
http://mapstruct.org/
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.1.0.Final</version>
</dependency>
我们假设有学生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() 方法此处省略不写,但是实际开发需要写的哦
此时 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 实现类。
如果 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);
比如说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);
当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<User> studentsToUsers(List<Student> 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<User> studentsToUsers(List<Student> 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<User> studentsToUsers(List<student> students) {
if ( students == null ) {
return null;
List<User> list = new ArrayList<User>();
for ( student student : students ) {
list.add( studentToUser( student ) );
return list;
参考资料 :https://blog.csdn.net/jiangchao858/article/details/77604469
开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地...
总结:MapStruct的List转换是使用了单个类转换的
public List<ExtranetConfigVO> findAllExtranetConfigs(Long workStationId) {
List<ExtranetConfig> extranetConfigs = extranetConfigService.getBaseMapper().selectList(Wrappers.<ExtranetConfig>lambdaQu
mybatis-plus依赖要用高版本,低版本没有convert方法(测的时候用3.0.5发现没有convert方法)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
在使用MapStruct进行List转换时,需要进行实体转换和属性映射配置。在转换接口中,可以通过@Mappings注解来进行属性映射配置。如果属性名不对应,可以使用@Mapping注解在实体转换时进行属性名映射。当有多个属性不对应时,可以使用逗号隔开多个@Mapping注解。例如,在UserMapping接口中,可以使用@Mappings和@Mapping注解来定义Student转化为User的属性映射。然后可以使用studentToUser方法来进行List转换。
如果List中的实体类型的属性类型不匹配,可以在转换接口中通过定义属性转换方法来进行类型转换。例如,在UserMapping接口中,可以使用@Mapping注解来定义属性的类型转换,将Student的sname属性转换为User的uname属性。
注意,需要在转换接口上加上@Mapper注解,并指定componentModel为"spring",以便在Spring应用中进行注入和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [mapstruct 实体转换及List转换](https://blog.csdn.net/u012373815/article/details/88367456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]