对象转换器mapstruct VS BeanUtils
官网:https://mapstruct.org/documentation/stable/reference/html/
对象转换器mapstruct
为啥要是用mapstruct?
mapstruct优于BeanUtils,BeanUtils用的是反射,开支比较大.一些公司是不建议使用BeanUtils的.
注意:mapstruct和lombok的版本不可变,否则会出错
1.导入坐标:
org.mapstruct mapstruct-jdk8 1.2.0.Final org.mapstruct mapstruct-processor 1.2.0.Final org.projectlombok lombok 1.16.20
2.定义一个映射器
注意此处使用的注解全都是org.mapstruct
不要引错。
需要使用@Maping
注解,source
为原参数名称,target
为转换后的类的参数名称。
例如:
@Mapperpublic interface CarMap { //mapping作用就是两个字段的映射关系 //将car中的make中的值复制到CarDTO中的manufacturer @Mapping(source = "make", target = "manufacturer") @Mapping(source = "numberOfSeats", target = "seatCount") CarDTO carToCarDto(Car car); @Mapping(source = "fullname", target = "name") PersonDTO personToPersonDto(Person person);}
整合Spring
设置componentModel = "spring"
,需要使用的地方直接通过@Resource
注入即可
@Mapper(componentModel = "spring")public interface CarMap {...}
集合映射
@Mapperpublic interface CarMapper { Set integerSetToStringSet(Set integers); List carsToCarDtos(List cars); CarDto carToCarDto(Car car);}
映射map
public interface SourceTargetMapper { @MapMapping(valueDateFormat = "dd.MM.yyyy") Map longDateMapToStringStringMap(Map source);}
快速入门:
首先导入坐标:(坐标的版本不要乱动,会出现不兼容问题)
@Datapublic class Student { private int id; private int age; private String name; private String password; private String username;}
@Datapublic class StudentDto { private String password; private String username;}
对象转换类:
@Mapper(componentModel = "spring")//将此功能加到Springpublic interface StudentMap { Student dtoToStudent(StudentDto dto);}
实现:
@RestController@RequestMapping("login")public class StudentController { @Resource StudentMap studentMap; @GetMapping public Student getStudent(@RequestBody StudentDto studentDto){ Student student = studentMap.dtoToStudent(studentDto); System.out.println(student); student.setAge(10); student.setId(10); student.setName("admin"); return student; }}