MapStruct使用教程
BeanUtils.copyProperties ()
只能转换类中字段名字一样且类型一样的字段。
采用反射技术,重复调用时效率是比较低下。
1、依赖包POM.xml
<!--mapStruct依赖 高性能对象映射-->
<!--mapstruct核心-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!--mapstruct编译-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!--Lombok依赖:(版本最好在1.16.16以上,否则会出现问题)通常是和lombok一起使用-->
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<version>${lombok.version}</version>
// 版本号 1.18.12
</dependency>
2、定义转换器
@Mapper(componentModel = "spring")
public interface BeanConverter {
FavoriteInfoBo favoriteInfoPoToBo(FavoriteInfoPo po);
UserProfileInfoBo userProfileInfoPoToBo(UserProfileInfoPo userProfileInfoPo);
}
自动生成转换类
package com.goodwe.sems.user.converter;
import com.goodwe.sems.user.model.bo.FavoriteInfoBo;
import com.goodwe.sems.user.repository.po.AppPageConfigPo;
import com.goodwe.sems.user.repository.po.AppPageTemplatePo;
import com.goodwe.sems.user.repository.po.FavoriteInfoPo;
import com.goodwe.sems.user.repository.po.UserProfileInfoPo;
import com.goodwe.sems.user.service.bo.AppPageConfigBo;
import com.goodwe.sems.user.service.bo.AppPageTemplateBo;
import com.goodwe.sems.user.service.bo.UserProfileInfoBo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.processing.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-12-25T16:53:44+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 19.0.2 (Oracle Corporation)"
)
@Component
public class BeanConverterImpl implements BeanConverter {
@Override
public FavoriteInfoBo favoriteInfoPoToBo(FavoriteInfoPo po) {
if ( po == null ) {
return null;
}
FavoriteInfoBo favoriteInfoBo = new FavoriteInfoBo();
favoriteInfoBo.setId( po.getId() );
favoriteInfoBo.setBizType( po.getBizType() );
favoriteInfoBo.setBizId( po.getBizId() );
favoriteInfoBo.setUserId( po.getUserId() );
favoriteInfoBo.setCreator( po.getCreator() );
favoriteInfoBo.setUpdater( po.getUpdater() );
favoriteInfoBo.setCreateTime( po.getCreateTime() );
favoriteInfoBo.setUpdateTime( po.getUpdateTime() );
return favoriteInfoBo;
}
@Override
public UserProfileInfoBo userProfileInfoPoToBo(UserProfileInfoPo userProfileInfoPo) {
if ( userProfileInfoPo == null ) {
return null;
}
UserProfileInfoBo userProfileInfoBo = new UserProfileInfoBo();
userProfileInfoBo.setId( userProfileInfoPo.getId() );
userProfileInfoBo.setUserId( userProfileInfoPo.getUserId() );
if ( userProfileInfoPo.getTimeSpan() != null ) {
userProfileInfoBo.setTimeSpan( new BigDecimal( userProfileInfoPo.getTimeSpan() ) );
}
`````
userProfileInfoBo.setUpdater( userProfileInfoPo.getUpdater() );
if ( userProfileInfoPo.getUpdaterId() != null ) {
userProfileInfoBo.setUpdaterId( Long.parseLong( userProfileInfoPo.getUpdaterId() ) );
}
userProfileInfoBo.setUpdateTime( userProfileInfoPo.getUpdateTime() );
return userProfileInfoBo;
}
}
3、Service实现层
@Slf4j
@Service
@RequiredArgsConstructor
public class UserProfileInfoServiceImpl implements UserProfileInfoService {
private final UserProfileInfoMapper userProfileInfoMapper;
@Override
public UserProfileInfoBo queryByUserId(Long userId) {
UserProfileInfoPo userProfileInfoPo = userProfileInfoMapper
.selectOne(Wrappers.lambdaQuery(UserProfileInfoPo.class).eq(UserProfileInfoPo::getUserId, userId));
// BeanConverter.INSTANCE.userProfileInfoPoToBo()
return BeanConverter.INSTANCE.userProfileInfoPoToBo(userProfileInfoPo);
}
}
属性名称注解映射
// mapper : 创建映射器
@Mapper
public interface PersonMapper {
PersonMapper INSTANCT = Mappers.getMapper(PersonMapper.class);
@Mapping(target = "name", source = "personName")
@Mapping(target = "id", ignore = true) // 忽略id,不进行映射
PersonDTO conver(Person person);
}