MapStruct入门使用

网友投稿 689 2022-10-21

MapStruct入门使用

MapStruct入门使用

文章目录

在实际的项目开发中会大量的使用POJO作为数据载体,通常有如下的:

实体名

实体含义

说明

DO

Data Object

与数据库表结构一一对应,通过DAO层向上传输数据源对象

DTO

Data Transfer Object

数据传输对象,Service或Manager向外传输的对象

BO

Business Object

业务对象,由Service层输出的封装业务逻辑的对象

VO

View Object

显示层对象,通常是 Web 向模板渲染引擎层传输的对象

Spring BeanUtilsApache BeanUtilsOrika的MapperFacade和MapperFactoryMapStruct可以选择MapStruct,功能十分强大,而且很灵活,可以满足我们需要的各种需求。

入门案例

Maven项目引入

只需要在pom.xml文件中加入以下依赖即可:

... 1.8 1.3.1.Final ... org.mapstruct mapstruct ${mapstruct.version} ... org.apache.maven.plugins maven-compiler-plugin 3.8.1 ${java.version} ${java.version} org.mapstruct mapstruct-processor ${mapstruct.version}

package com.linfanchen.springboot.lab.mapstruct.domain;public class CarDO { /** * 主键ID */ private Integer id; /** * 名称 */ private String name; /** * 品牌 */ private String brand; /** * 车价 */ private Integer price; /** * 轮胎属性 */ private TyreDO tyreDO; /** * 汽车图片 */ private String images; public String getImages() { return images; } public void setImages(String images) { this.images = images; } public TyreDO getTyreDO() { return tyreDO; } public void setTyreDO(TyreDO tyreDO) { this.tyreDO = tyreDO; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; }}

package com.linfanchen.springboot.lab.mapstruct.domain;/** * 轮胎 */public class TyreDO {     /**     * 主键ID     */    private Integer id;    /**     * 轮胎名称     */    private String name;    /**     * 轮胎尺寸     */    private Integer size;    public  Integer  getId()  {         return id;    }    public  void  setId(Integer id)  {         this.id = id;    }    public  String  getName()  {         return name;    }    public  void  setName(String name)  {         this.name = name;    }    public  Integer  getSize()  {         return

目标对象

package com.linfanchen.springboot.lab.mapstruct.bo;import com.linfanchen.springboot.lab.mapstruct.domain.TyreDO;import java.util.List;/** * 汽车业务对象 */public class CarBO /** * 主键ID */ private Integer id; /** * 名称 */ private String name; /** * 品牌 */ private String brand; /** * 车价 */ private Integer price; /** * 轮胎属性 */ private TyreDO tyreDO; /** * 汽车图片 */ private String images; public Integer getId(){ return id; } public void setId(Integer id){ this.id = id; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getBrand(){ return brand; } public void setBrand(String brand){ this.brand = brand; } public Integer getPrice(){ return price; } public void setPrice(Integer price){ this.price = price; } public TyreDO getTyreDO(){ return tyreDO; } public void setTyreDO(TyreDO tyreDO){ this.tyreDO = tyreDO; } public String getImages(){ return images; } public void setImages(String images){ this.images = images; }}

CarDetailBO

package com.linfanchen.springboot.lab.mapstruct.bo;import com.linfanchen.springboot.lab.mapstruct.domain.TyreDO;import java.util.List;/** * 汽车业务对象 */public class CarDetailBO /** * 主键ID */ private Integer carId; /** * 名称 */ private String carName; /** * 品牌 */ private String carBrand; /** * 车价 */ private Integer price; /** * 轮胎属性 */ private TyreDO tyreDetail; /** * 汽车图片 */ private List images; public Integer getCarId(){ return carId; } public void setCarId(Integer carId){ this.carId = carId; } public String getCarName(){ return carName; } public void setCarName(String carName){ this.carName = carName; } public String getCarBrand(){ return carBrand; } public void setCarBrand(String carBrand){ this.carBrand = carBrand; } public Integer getPrice(){ return price; } public void setPrice(Integer price){ this.price = price; } public TyreDO getTyreDetail(){ return tyreDetail; } public void setTyreDetail(TyreDO tyreDetail){ this.tyreDetail = tyreDetail; } public List getImages() { return images; } public void setImages(List images){ this.images = images; }}

转换器 CarConvert

说明:

INSTANCE 是MapStruct为我们提供的映射工厂,指定接口类型后自动帮我们创建接口的实现,且保证是线程安全的单例,无需自己手动创建。

package com.linfanchen.springboot.lab.mapstruct.convert;import com.linfanchen.springboot.lab.mapstruct.bo.CarBO;import com.linfanchen.springboot.lab.mapstruct.bo.CarDetailBO;import com.linfanchen.springboot.lab.mapstruct.domain.CarDO;import org.apache.commons.lang3.StringUtils;import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;import org.mapstruct.Named;import org.mapstruct.factory.Mappers;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * 转换类 */@Mapperpublic interface CarConvert{ CarConvert INSTANCE = Mappers.getMapper(CarConvert.class); /** * 来源和目标类的直接转换 */ CarBO convert(CarDO carDO); /** * 添加字段处理和映射关系后的转换 */ @Mappings({ @Mapping(source = "id", target = "carId"), @Mapping(source = "name", target = "carName"), @Mapping(source = "brand", target = "carBrand"), @Mapping(source = "tyreDO.id", target = "tyreDetail.id"), @Mapping(source = "tyreDO.name", target = "tyreDetail.name"), @Mapping(source = "tyreDO.size", target = "tyreDetail.size"), @Mapping(source = "images", target = "images", qualifiedByName = "convertImagesStrToList") }) CarDetailBO convertDetail(CarDO carDO); @Named("convertImagesStrToList") default List convertImagesStrToList(String images){ String[] splitArr = org.springframework.util.StringUtils.split(images, ","); return new

使用 CarTest

package com.linfanchen.springboot.lab.mapstruct;import com.linfanchen.springboot.lab.mapstruct.bo.CarBO;import com.linfanchen.springboot.lab.mapstruct.bo.CarDetailBO;import com.linfanchen.springboot.lab.mapstruct.convert.CarConvert;import com.linfanchen.springboot.lab.mapstruct.domain.CarDO;import com.linfanchen.springboot.lab.mapstruct.domain.TyreDO;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;@RunWith(SpringRunner.class)@SpringBootTestpublic class CarTest{ @Test public void test(){ // 创建轮胎对象 TyreDO tyreDO = new TyreDO(); tyreDO.setId(888); tyreDO.setName("米其林245/45R19"); tyreDO.setSize(19); // 汽车图片地址,通过半角逗号分隔的 List imageList = new ArrayList<>(); imageList.add(" imageList.add(" imageList.add(" String imageStr = imageList.stream().map(String::valueOf).collect(Collectors.joining(",")); // 创建汽车对象 CarDO carDO = new CarDO(); carDO.setId(123); carDO.setBrand("BMW"); carDO.setName("宝马530Li行政版"); carDO.setPrice(540000); carDO.setTyreDO(tyreDO); carDO.setImages(imageStr); // 直接的数据拷贝 CarBO carBO = CarConvert.INSTANCE.convert(carDO); System.out.println(carBO.getImages()); System.out.println(carBO.getBrand()); System.out.println(carBO.getName()); System.out.println(carBO.getTyreDO()); // 带数据转换的拷贝

在需要进行对象的转换的时候,我们可以使用MapStruct进行各种灵活的转换,最终得到我们想要的数据。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PocketFlow- 自动化模型压缩框架
下一篇:YYCache - iOS的高性能缓存框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~