MapStruct简介:
- mapstruct是一种 实体类 映射框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,在编译过程中,mapstruct会自动生成该接口的实现类,实现将源对象映射到目标对象的效果。总结来说就是能将一个实体类的各种值安全的赋给另一个实体类,在开发中,使用它可以省去很多不需要的代码!
下面给出阿里巴巴java开发规范里对POJO的相关定义:
1. POJO ( Plain Ordinary Java Object ): 在本规约中,POJO 专指只有 setter/getter/toString 的 简单类,包括 DO/DTO/BO/VO 等。2. DO ( Data Object ):阿里巴巴专指数据库表一一对应的 POJO 类。此对象与数据库表结构一 一对应,通过 DAO 层向上传输数据源对象。3. DTO ( Data Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象。4. BO ( Business Object ):业务对象,可以由 Service 层输出的封装业务逻辑的对象。5. Query :数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。6. VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。7. AO ( Application Object ): 阿里巴巴专指 Application Object,即在 Service 层上,极为贴近 业务的复用代码。
相信真正有过按照一定开发规范开发项目的人对这些一定不陌生,我们需要进行繁琐的实体类的转换,而MapStruct的左右就是简化这一操作的,省去重复的无用代码。
MapStruct使用:
接下来用一个小示例来说明MapStruct基本的使用:
1.导入依赖:
这里我把lombok的依赖也写出来,就是给大家避免踩坑,因为mapstruct会跟lombok产生版本冲突甚至致使项目无法正常运行,建议大家直接采用示例代码进行操作。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
2.编写相关POJO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Brand {
@TableId(type = IdType.AUTO)
private long id;
private String brandName;
private String companyName;
private long ordered;
private String description;
private long status;
}
编写DTO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BrandDTO {
private String brandName;
private String companyName;
private String description;
private long status;
}
编写VO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BrandVO {
private String brandName;
private String companyName;
private String description;
private String status;
}
3.编写转换接口
请注意!!!这里的@Mapper和@Mappings、@Named注解都是org.mapstruct包下的。
@Mapping注解可以映射不同字段,其中source设置待转换的字段名,target设置转换的目标字段名。
@Named注解可以设置不同类型对象的具体转换规则,例如这里在DTO中获取的是long类型,而VO显示为字符串类型,这里就是用了@Named注解绑定方法进行转换,搭配@Mapping注解中的qulifiedByName属性使用,就可以完成转换规则设置了。
可以直接设置对应集合类型的转换,MapStruct会同时调用单类型的转换方法完成转换(强中强)!
@Mapper
public interface BrandConvert {
BrandConvert mapper = Mappers.getMapper(BrandConvert.class);
@Mappings({
@Mapping(source = "brandName",target = "brandName"),
@Mapping(source = "companyName",target = "companyName"),
@Mapping(source = "description",target = "description"),
@Mapping(source = "status",target = "status",qualifiedByName = "convertstatus")
})
BrandVO dto2vo(BrandDTO brandDTO);
@Mappings({
@Mapping(source = "brandName",target = "brandName"),
@Mapping(source = "companyName",target = "companyName"),
@Mapping(source = "description",target = "description"),
@Mapping(source = "status",target = "status")
})
BrandDTO entity2dto(Brand brand);
List<BrandVO> list2vo(List<BrandDTO> list);
List<BrandDTO> list2dto(List<Brand> list);
@Named("convertstatus")
default String convertStatus(long status){
if (status==1)
return BrandStatusEnum.SAFE.getDescription();
else return BrandStatusEnum.IN_DANGER.getDescription();
}
}
4.Service实现类:
@Slf4j
@Service
public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements BrandService {
@Override
public BrandDTO getBrandById(Integer id) {
QueryWrapper<Brand> wrapper = new QueryWrapper<>();
wrapper.eq("id", id);
Brand brand = getOne(wrapper);
BrandDTO brandDTO = BrandConvert.mapper.entity2dto(brand);
log.info("查询了id为" + id + "的商标信息:商标为" + brandDTO.getBrandName() + "所属公司为" + brandDTO.getCompanyName());
return brandDTO;
}
@Override
public List<BrandDTO> getAllBrands() {
List<Brand> brands = list();
List<BrandDTO> brandDTOS = BrandConvert.mapper.list2dto(brands);
log.info("查询了当前全商标的信息");
return brandDTOS;
}
}
5.Controller:
@CrossOrigin
@RestController
@RequestMapping("/brand")
public class BrandQueryController {
@Autowired
private BrandService brandService;
@GetMapping("/getbyid")
public BrandVO getBrandByID(@RequestParam("id")int id){
BrandDTO brandById = brandService.getBrandById(id);
return BrandConvert.mapper.dto2vo(brandById);
}
@GetMapping("/getallbrands")
public List<BrandVO> getAllBrands(){
List<BrandDTO> allBrands = brandService.getAllBrands();
ArrayList<BrandVO> brandVOS = new ArrayList<>();
return BrandConvert.mapper.list2vo(allBrands);
}
}
6.代码运行测试:
我这里是直接IDEA的插件测试的接口,是可以正常运行并且直接转换成功的。