【三层架构实体类转换-mapstruct】

本文介绍了如何使用MapStruct进行实体类之间的高效转换,避免手动编写大量的set()、get()方法。MapStruct是一个代码生成库,能自动生成转换器,提高开发效率。通过引入依赖、创建测试实体类和转换接口,演示了从Dish到DishQuery的转换过程,并展示了不同属性和类型映射的用法。此外,还解决了在IDEA中遇到的编译问题及错误处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三层架构实体类转换-mapstruct

说到实体类的转换,大家肯定不陌生,不就是一堆的**set()、get()么,但如果实体类的字段有一百多个,那不就是写死了么。
而后出现了
BeanUtils.copyProperties(dog1,dog2 )**的对象转换类。
这个还是比较方便的,但是它的效率没有mapstruct高
下面我们来详细讲讲mapstruct的使用
mapstruct

首先,引入依赖

 <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.3.1.Final</version>
        </dependency>
        
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.3.1.Final</version>
        </dependency>

测试的实体类,记着加@Data注解

@Data
public class DishQuery {

    private Long id;

    private String name;

    private Long categoryId;

    private BigDecimal price;

    private String code;

    private String image;

    private String description;

    private Integer status;

    private Integer sort;

    private String createTime;

    private String updateTime;

    private Long createUser;

    private Long updateUser;
}
--------------------------------------------------------------------
@Data
public class Dish implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;

    //菜品名称
    private String name;

    //菜品分类id
    private Long categoryId;

    //菜品价格
    private BigDecimal price;

    //商品码
    private String code;

    //图片
    private String image;

    //描述信息
    private String description;

    //0 停售 1 起售
    private Integer status;

    //顺序
    private Integer sort;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}

编写接口

@Mapper(imports =  DateUtil.class )
public interface DishConverter {
DishConverter mapper=Mappers.getMapper(DishConverter.class);

    DishQuery entity2Query(Dish dish);
    List<DishQuery>  entity2Query(List<Dish> dishes);


//    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd")
    @Mapping(target = "createTime", expression = "java(DateUtil.parse(dishQuery.getCreateTime()))")
    Dish query2Entity(DishQuery dishQuery);

}

测试,简单粗暴

  @Test
    void contextLoads() throws InterruptedException {
       DishQuery dish=new DishQuery();
       dish.setCode("123");
       dish.setCreateTime("2022-01-01");
        //只需要这一句就行了
        Dish dish1 = DishConverter.mapper.query2Entity(dish);
        System.out.println(dish1);
    }

这就好了,下面是一些扩展

不同属性之间的映射:
@Mapping(source = "name", target = "userName"),
不同类型之间的映射:
@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd")
@Mapping(target = "expireTime", expression = "java(LocalDateTimeUtil.getDateTimeOfDate(tradeOrderLS.getExpireTime()))"),

注意事项:
dateFormat和expression不能同时存在
转换的实体类都要有get()、set()
如果需要用到其他类,需要在类上通过@Mapper(imports = DateUtil.class ) 申明

如果出现这个错误!

java: Internal error in the mapping processor: java.lang.NullPointerExceptio

在使用MapStruct,idea2020.3版本在build项目的时候出现错误:java: Internal error in the mapping processor: java.lang.NullPointerException
解决:
1、Setting -->Build,Execution,Deployment -->Compiler -->User-local build加上参数:
-Djps.track.ap.dependencies=false
在这里插入图片描述
2、在pom.xml里面修改mapstruct-processor的版本,升级至1.4.1.Final或者更高版本

无法生成实现类:

Cannot find implementation for com.shanjupay.transaction.convert.PlatformChannelConvert

我碰到这个错误,是因为我的父工程中引入了依赖。而子工程没有引入。
**解决:**在子工程引入下就好了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值