MapStruct最详细的使用教程,别在用BeanUtils.copyProperties ()
项目背景
之前查看网上别人写的文章,很多都提到了BeanUtils(org.springframework.beans) 利用反射性能比较差。大家都推荐使用 MapStruct。因为这个组件使用 Java 原生的 setXxx方法,会自动生成相关代码。
代码使用
引入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</dependency>
这里使用的是 1.4.1.Final
版本,1.3.1 idea会提示包找不到
编写Mapper,告诉 MapStruct 转换前后的类型
import org.mapstruct.factory.Mappers;
import org.mapstruct.Mapper;
import java.util.List;
@Mapper
public interface xxxConvert{
xxxConvert INSTANCE = Mappers.getMapper(xxxConvert.class);
/**
* 将req转换为entity
*/
Entity convert2Entity(Req req);
/**
* 将entity列表转换为resp列表
*/
List<Resp> convertPageList(List<Entity> list);
/**
* 将entity转换为dto
*/
Dto convert2Dto(Entity entity);
}
注意 @Mapper 是用 MapStruct 依赖(org.mapstruct.Mapper)的,不要和 MyBatis 的弄混。
点击编译后,MapStruct 就会在 target 目录下生成 实现类
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2024-02-01T15:17:25+0800",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_351 (Oracle Corporation)"
)
public class XxxConvertImpl implements XxxConvert {
@Override
public Entity convert2Entity(Req req) {
if ( req == null ) {
return null;
}
Entity entity = new Entity();
entity.setId( req.getId() );
entity.setBaseErpCode( req.getBaseErpCode() );
//设置相关字段...
return partBase;
}
@Override
public List<Resp> convertPageList(List<Entity> list) {
if ( list == null ) {
return null;
}
List<Resp> list1 = new ArrayList<Resp>( list.size() );
for ( Entity partBase : list ) {
list1.add( partBaseToPartBasePageResp( entity ) );
}
return list1;
}
@Override
public Dto convert2Dto(Entity entity) {
if ( base == null ) {
return null;
}
//具体参考上面代码
return partBaseDto;
}
protected Resp partBaseToPartBasePageResp(Entity entity) {
if ( entity == null ) {
return null;
}
//具体参考上面代码
return partBasePageResp;
}
}
结论
通过使用 MapStruct 工具,减少使用反射的次数,同时极大提升代码可读性。