MapStruct

参考文章

pom依赖:

<dependency>
   <groupId>org.mapstruct</groupId>
   <artifactId>mapstruct</artifactId>
   <version>1.3.1.Final</version>
</dependency>

<dependency>
   <groupId>org.mapstruct</groupId>
   <artifactId>mapstruct-processor</artifactId>
   <version>1.3.1.Final</version>
</dependency>

Mapper接口:

@Mapper(componentModel = &quot;spring&quot;)
public interface UserRoleMapper {

 @Mappings({
 @Mapping(source = &quot;id&quot;, target = &quot;userId&quot;),
@Mapping(source = &quot;username&quot;, target = &quot;name&quot;),
@Mapping(source = &quot;role.roleName&quot;, target = &quot;roleName&quot;)
 })
 UserRoleDto toUserRoleDto(User user);
}

@Mapper:

修饰接口,表明该接口为映射处理类。被修饰的类会自动生成实现类。实现类自行查看编译后文件。

componentModel:

指定组件模型,只能有特定的值。具体取值查看该属性注释。SpringBoot项目一般设置为@Mapper(componentModel = "spring"),个人更喜欢使用默认方式。

默认方式:
@Mapper

public interface UserRoleMapper {

UserRoleMapper instance = Mappers.getMapper(UserRoleMapper.class);

 @Mappings({
 @Mapping(source = &quot;id&quot;, target = &quot;userId&quot;),
 @Mapping(source = &quot;username&quot;, target = &quot;name&quot;),
 @Mapping(source = &quot;role.roleName&quot;, target = &quot;roleName&quot;)
 })
 UserRoleDto toUserRoleDto(User user);
}

外部调用:UserRoleMapper userMapper = UserRoleMapper.instance;

Spring模式:
@Mapper(componentModel = &quot;spring&quot;)
public interface UserRoleMapper {

@Mappings({
 @Mapping(source = &quot;id&quot;, target = &quot;userId&quot;),
 @Mapping(source = &quot;username&quot;, target = &quot;name&quot;),
 @Mapping(source = &quot;role.roleName&quot;, target = &quot;roleName&quot;)
 })
 UserRoleDto toUserRoleDto(User user);
}

外部调用:

@Autowire

Private UserRolemapper userRoleMapper;

@Mappings:

修饰方法,包含多个@Mapping注解,指定参数映射规则。

@Mapping:

Source:

源对象属性。

defaultValue :

使用默认值设置目标对象属性。

@Mapping(defaultValue = "CNY", target = "currencyCode")

Target:

目标对象属性。

ignore :

忽略目标属性映射。

@Mapping(target = "email", ignore = true)

dateFormat :

如果目标对象为日期,可以通过该属性指定日期转换格式。

@Mapping(source = "customer.birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss")

单个对象-》单个对象:

@Mapper(componentModel = "spring")
public interface UserRoleMapper {
   @Mappings({
         @Mapping(source = "id", target = "userId"),
         @Mapping(source = "username", target = "name"),
         @Mapping(source = "role.roleName", target = "roleName")
   })
   UserRoleDto toUserRoleDto(User user);
}

多个对象-》单个对象:

@Mappings({
      // 把user中的id绑定到目标对象的userId属性中
      @Mapping(source = "user.id", target = "userId"),
      // 把user中的username绑定到目标对象的name属性中
      @Mapping(source = "user.username", target = "name"),
      // 把role对象的roleName属性值绑定到目标对象的roleName中
      @Mapping(source = "role.roleName", target = "roleName")
})
UserRoleDto toUserRoleDto(User user, Role role);

参数-》实体:

@Mappings({
      // 把user中的id绑定到目标对象的userId属性中
      @Mapping(source = "user.id", target = "userId"),
      // 把user中的username绑定到目标对象的name属性中
      @Mapping(source = "user.username", target = "name"),
      // 把role对象的roleName属性值绑定到目标对象的roleName中
      @Mapping(source = "myRoleName", target = "roleName")
})
UserRoleDto useParameter(User user, String myRoleName);

更新:

@Mappings({
      @Mapping(source = "userId", target = "id"),
      @Mapping(source = "name", target = "username"),
      @Mapping(source = "roleName", target = "role.roleName")
})
void updateDto(UserRoleDto userRoleDto, @MappingTarget User user);

自定义转换器:

@Component
public class BooleanStrFormat {
   public String toStr(Boolean isDisable) {
      if (isDisable) {
         return "Y";
      } else {
         return "N";
      }
   }
   public Boolean toBoolean(String str) {
      if (str.equals("Y")) {
         return true;
      } else {
         return false;
      }
   }
}

@Mapper(componentModel = "spring", uses = { BooleanStrFormat.class})
public interface CustomerListMapper {

   @Mappings({
         @Mapping(source = "name", target = "customerName"),
         @Mapping(source = "isDisable", target = "disable")
   })
   CustomerDto customersToCustomerDto(Customer customer);
}

List映射:

@Mapper
public interface CustomerListMapper {

   @Mappings({
         @Mapping(source = "name", target = "customerName"),
         @Mapping(source = "isDisable", target = "disable")
   })
   CustomerDto customersToCustomerDto(Customer customer);
}
### MapStruct 使用教程 #### 添加依赖 为了使用MapStruct,在项目的`pom.xml`或`build.gradle`文件中需添加相应依赖。对于Maven项目,应加入如下片段来引入MapStruct版本1.5.0.Final的支持[^1]。 ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.0.Final</version> </dependency> ``` #### 创建Mapper接口 定义一个接口用于描述源对象到目标对象之间的转换逻辑。通过标注`@Mapper`注解并指定所需特性,可以自动生成具体的映射实现类[^2]。 ```java import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface CarMapper { @Mapping(source = "make", target = "manufacturer") CarDto carToCarDto(Car car); } ``` #### 配置编译插件 为了让IDE能够识别由MapStruct生成的代码,还需要配置相应的构建工具插件支持增量编译功能。例如,在Maven环境下可增加`maven-compiler-plugin`设置以确保每次编译都能正确处理这些动态产生的类文件。 ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.0.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> ``` #### 常见问题解决方案 当遇到无法找到生成的mapper实例时,确认已安装适当版本的Java Annotation Processor,并且在开发环境中启用了APT选项;另外还需注意检查包路径是否匹配以及是否存在拼写错误等问题。 如果发现性能瓶颈,则考虑优化映射关系设计减少不必要的字段复制操作,或是利用缓存机制提高重复查询效率。此外,也可以尝试升级至最新稳定版MapStruct获取更好的兼容性和改进后的算法表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值