1. 依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>
2. 父接口定义
package com.xin.demo.mapstruct;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.MapperConfig;
import java.util.List;
@MapperConfig
public interface BaseMapping<SOURCE, TARGET> {
TARGET sourceToTarget(SOURCE source);
@InheritInverseConfiguration(name = "sourceToTarget")
SOURCE targetToSource(TARGET target);
@InheritConfiguration(name = "sourceToTarget")
List<TARGET> sourceToTarget(List<SOURCE> sourceList);
@InheritConfiguration(name = "targetToSource")
List<SOURCE> targetToSource(List<TARGET> targetList);
}
2. 实际使用接口定义
package com.ruoyi.common.mapstruct;
import com.ruoyi.common.pojo.Person;
import com.ruoyi.common.pojo.PersonDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring")
public interface PersonDTOPersonConverter extends BaseMapping<PersonDTO, Person> {
@Override
@Mapping(source = "nameAlias", target = "name")
Person sourceToTarget(PersonDTO personDTO);
}
3. pojo
package com.ruoyi.common.pojo;
import lombok.Data;
@Data
public class Person {
private String name;
private Integer age;
}
package com.ruoyi.common.pojo;
import lombok.Data;
@Data
public class PersonDTO {
private String nameAlias;
private Integer age;
}
4. mvn clean install; 编译生成实现类
也就是说mapstruct是在编译阶段,不同于BeanUtil.copyProperties()是在运行阶段靠反射,mapstruct在编译阶段就能感知错误,并且实现就是set赋值,比反射实现更轻量级
package com.ruoyi.common.mapstruct;
import com.ruoyi.common.pojo.Person;
import com.ruoyi.common.pojo.PersonDTO;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-04-24T23:48:09+0800",
comments = "version: 1.5.3.Final, compiler: javac, environment: Java 1.8.0_271 (Oracle Corporation)"
)
@Component
public class PersonDTOPersonConverterImpl implements PersonDTOPersonConverter {
@Override
public PersonDTO targetToSource(Person target) {
if ( target == null ) {
return null;
}
PersonDTO personDTO = new PersonDTO();
personDTO.setNameAlias( target.getName() );
personDTO.setAge( target.getAge() );
return personDTO;
}
@Override
public List<Person> sourceToTarget(List<PersonDTO> sourceList) {
if ( sourceList == null ) {
return null;
}
List<Person> list = new ArrayList<Person>( sourceList.size() );
for ( PersonDTO personDTO : sourceList ) {
list.add( sourceToTarget( personDTO ) );
}
return list;
}
@Override
public List<PersonDTO> targetToSource(List<Person> targetList) {
if ( targetList == null ) {
return null;
}
List<PersonDTO> list = new ArrayList<PersonDTO>( targetList.size() );
for ( Person person : targetList ) {
list.add( targetToSource( person ) );
}
return list;
}
@Override
public Person sourceToTarget(PersonDTO personDTO) {
if ( personDTO == null ) {
return null;
}
Person person = new Person();
person.setName( personDTO.getNameAlias() );
person.setAge( personDTO.getAge() );
return person;
}
}
- 具体使用
@Autowired
private PersonDTOPersonConverter personDTOPersonConverter;
/**
* 查询定时任务列表
*/
@PreAuthorize("@ss.hasPermi('monitor:job:list')")
@GetMapping("/list")
public TableDataInfo list(SysJob sysJob)
{
startPage();
PersonDTO personDTO = new PersonDTO();
personDTO.setNameAlias("xiaohua");
personDTO.setAge(3);
Person person = personDTOPersonConverter.sourceToTarget(personDTO);
System.out.println(person.getName());
List<SysJob> list = jobService.selectJobList(sysJob);
return getDataTable(list);
}