MapStruct的使用方法

MapStruct使用方法

MapStruct 是一个 Java注释处理器,用于生成类型安全的 bean 映射类。

我们所要做的就是定义一个映射器接口,该接口声明任何所需的映射方法。在编译期间,MapStruct 将生成该接口的实现。这个实现使用普通的Java 方法调用来映射源对象和目标对象,即没有反射或类似的。

1.使用实例

使用Mapstruct需要依赖的包如下,mapstruct、mapstruct-processor、lombok,可以去仓库中查看最新版本。

		<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

简单的属性拷贝:

当两个对象的属性类型和名称完全相同时,Mapstruct会自动拷贝;假设我们现在需要把UserPo的属性值拷贝到UserEntity中,我们需要做下面几件事情:

  1. 定义UserPo和UserEntity
  2. 定义转换接口
  3. 编写测试main方法
@Data
public class UserPo {
    private Long id;
    private String name;
    private Date createTime;
    private String userNick;
}


@Data
public class UserEntity {
    private Long id;
    private String name;
    private Date createTime;
    private String userNick1;
}

定义转换接口:

定义mapstruct接口,在接口上打上@Mapper注解。

注意@Mapper是Mapstruct的注解,不要引错了。

package mapstruct;

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

//加上componentModel=spring,生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入,也可以通过可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
@Mapper(componentModel ="spring")
public interface IPersonMapper {
    //实例化对象
    //IPersonMapper INSTANCT = Mappers.getMapper(IPersonMapper.class);
        
    UserEntity po2entity(UserPo userPo);
}

测试结果:

@Autowired
private IPersonMapper personMapper;

public class MapStructTest {
     UserPo userPo = UserPo.builder()
                .id(1L)
                .name("tt")
                .createTime(new Date())
                .userNick("测试mapstruct")
                .build();
    
    UserEntity user=personMapper.po2entity(userPo);
   System.out.println("输出转换后的对象:"+user);
}

//userNick1等于null 因为UserPro中的属性userNick与之不匹配
输出结果:UserEntity(id=1L,name=tt,createTime=2022-09-02,userNick1=null

属性类型相同名称不同:

对于属性名称不同的属性进行处理时,需要使用@Mapping,比如修改UserEntity中的userNick为userNick1,然后进行转换。

@Mapping(target = “userNick1”, source = “userNick”),此处的意思就是在转化的过程中,将UserPo的userNick属性值赋值给UserEntity的userNick1属性。

@Mapper(componentModel ="spring")
public interface IPersonMapper {
    
    @Mapping(target = "userNick1", source = "userNick")
    UserEntity po2entity(UserPo userPo);
}

输出:UserEntity(id=1L,name=tt,createTime=2022-09-02,userNick1=测试mapstruct)

看IPersonMapper接口的class文件:

看实现类,可以看到,Mapstruct帮我们做了处理,把po的userNick属性赋值给了entity的userNick1。
在这里插入图片描述

String转日期&String转数字&忽略某个字端&给默认值等

//给日期设置格式
@Mapping(target = "createTime", source = "createTime", dateFormat = "yyyy-MM-dd")
//字符串转数字,做处理
@Mapping(target = "age", source = "age", numberFormat = "#0.00")
//字段赋值没有了
@Mapping(target = "id", ignore = true)
//userVerified:如果为null赋值默认值
@Mapping(target = "userVerified", defaultValue = "defaultValue-2")

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值