1.什么是MapStructjava
简单来讲,MapStruct 能够将某几种类型的对象映射为另一种类型,如将多个 DO(业务实体对象) 对象转换为 DTO(数据传输对象),避免了在业务代码内new DTO对象和不断的进行set方法 spring
2.如何使用MapStructapp
(1)引入Maven依赖ide
<!--mapStruct依赖--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.2.0.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <scope>provided</scope> <version>1.2.0.Final</version> </dependency>
(2)使用spa
此处假设将两个实体对象(StudentInfo,classInfo)转换为一个DTO(StudentInfoDTO)code
@Data public class StudentInfo { /** * 姓名 */ private String siName; /** * 年龄 */ private Integer siAge; /** * 所属班级 */ private String siClassId; }
@Data public class classInfo { /** * 名称 */ private String ciName; /** * 别名 */ private String ciNickName; /** * 楼号 */ private String ciFloor; }
@Data public class StudentInfoDTO { /** * 姓名 */ private String name; /** * 年龄 */ private Integer age; /** * 班级名称 */ private String className; }
建立 Mapper(映射)接口,MapStruct 就会自动实现该接口component
@Mapper public interface StudentInfoStruct { /** * get new mapStruct instance */ StudentInfoStruct INSTANCE = Mappers.getMapper(StudentInfoStruct.class); /** * 转换学生信息实体 * * @return */ @Mappings({ @Mapping(source = "studentInfo.siName", target = "name"), @Mapping(source = "studentInfo.siAge", target = "age"), @Mapping(source = "classInfo.ciName", target = "className"), }) StudentInfoDTO from(ClassInfo classInfo,StudentInfo studentInfo) ; }
业务层调用代码orm
classInfo,studentInfo实体 以经过逻辑实现得到对象
StudentInfoDTO studentInfoDTO = StudentInfoStruct.INSTANCE.from(classInfo,studentInfo);
单个实体对象转换DTO同理blog
(3)当转换过程当中有逻辑实现时,如进行余额变更或传入单个参数过多,则须要定义的转换 抽象类
@Mapper public abstract class UserBalanceRecordStruct { /** * get new mapStruct instance */ public static UserBalanceRecordStruct INSTANCE = Mappers.getMapper(UserBalanceRecordStruct.class); /** * 转换余额变更记录 * * @param balanceId 余额帐户编号 * @param changeBalance 本次余额变更金额 * @param changeTypeId 变更类型 * @param oldBalance 变更以前余额 * @param unifiedOrderNo 统一订单编号 * @return */ public BalanceRecordEntity from(String balanceId, BigDecimal changeBalance, String changeTypeId, BigDecimal oldBalance, String mark, String unifiedOrderNo) { BalanceRecordEntity recordEntity = new BalanceRecordEntity(); recordEntity.setUbrBalanceId(balanceId); recordEntity.setUbrChangeCount(changeBalance); recordEntity.setUbrTypeId(changeTypeId); recordEntity.setUbrChangeBefore(oldBalance); recordEntity.setUbrChangeAfter(oldBalance.add(changeBalance)); recordEntity.setUbrMark(mark); recordEntity.setUbrUnifiedNo(unifiedOrderNo); return recordEntity; } /** * 经过原始的记录请求参数实体转换为最新的分页查询记录的请求参数实体 * * @param param 帐户变更记录查询实体 * @return */ // public abstract BalanceRecordSearchParam from(BalanceRecordListParam param,String logicId); }
3.MapStruct注解