MapStruct最详细的使用教程,别在用BeanUtils.copyProperties ()
mapstruct使用和详解
项目背景
之前查看网上别人写的文章,很多都提到了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 {@Overridepublic Entity convert2Entity(Req req) {if ( req == null ) {return null;}Entity entity = new Entity();entity.setId( req.getId() );entity.setBaseErpCode( req.getBaseErpCode() );//设置相关字段...return partBase;}@Overridepublic 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;}@Overridepublic Dto convert2Dto(Entity entity) {if ( base == null ) {return null;}//具体参考上面代码return partBaseDto;}protected Resp partBaseToPartBasePageResp(Entity entity) {if ( entity == null ) {return null;}//具体参考上面代码return partBasePageResp;}
}
结论
通过使用 MapStruct 工具,减少使用反射的次数,同时极大提升代码可读性。