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中,我们需要做下面几件事情:
- 定义UserPo和UserEntity
- 定义转换接口
- 编写测试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")