MapStruct、ignore

Json工具是通过序列化反序列化来实现的,性能低下。

MapStruct是通过getter、setter来实现的。

        <!--MapStruct依赖-->
        <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-jdk8 -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

使用

@Data
@Builder
public class User {
    private String uname;
    private Integer uid;
    private String uaddr;
}
@Data
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {

    private String name;
    private  Integer id;
    private Integer updateUserId;

}

由Spring代理

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "spring")  //表示由Spring代理
public interface UserMapping {

    //UserMapping USERMAPOING = Mappers.getMapper(UserMapping.class);   //可以不要

/*
将user的uname映射成目标类userDto的name字段
...
*/
    @Mapping(target = "name",source = "uname")
    @Mapping(target = "id",source = "uid")
    UserDto userToUserDto(User user);
}

使用

    @Resource
    private UserMapping userMapping;
    
    public void func(){
         User user = User.builder()
                .uname("zhangsan")
                .uid(22)
                .build();

        UserDto userDto = userMapping.userToUserDto(user);
    }
    

不由spring代理

@Mapper
public interface UserMapping {

    UserMapping USERMAPOING = Mappers.getMapper(UserMapping.class);

    @Mapping(target = "name",source = "uname")
    @Mapping(target = "id",source = "uid")
    UserDto userToUserDto(User user);
}
    @Test
    public void t1(){

        User user = User.builder()
                .uname("zhangsan")
                .uid(22)
                .build();

        UserDto userDto = UserMapping.USERMAPOING.userToUserDto(user);
        userDto.setUpdateUserId(111);
        log.info(userDto.toString());
    }

其它属性

ignore

@Mapping(target = “age”, ignore = true)
添加了ignore,表示不会对该属性做映射;


原理

MapStruct生成了mapping的实现类,通过调用get\set实现;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-04-30T12:58:59+0800",
    comments = "version: 1.0.0.Final, compiler: javac, environment: Java 1.8.0_211 (Oracle Corporation)"
)
@Component
public class UserMappingImpl implements UserMapping {

    @Override
    public UserDto userToUserDto(User user) {
        if ( user == null ) {
            return null;
        }

        UserDto userDto = new UserDto();

        userDto.setName( user.getUname() );
        userDto.setId( user.getUid() );

        return userDto;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MapStruct是一个Java注解处理器,用于生成类型安全的映射代码。它可以帮助开发人员自动进行Java Bean之间的映射,减少手动编写映射代码的工作量。 以下是一些MapStruct的技巧用法: 1. 基本映射:MapStruct可以自动映射相同名称和类型的属性。只需在源类和目标类中定义相同名称和类型的属性,MapStruct会自动生成映射代码。 2. 自定义映射:如果源类和目标类的属性名称不一致,或者需要进行一些额外的转换逻辑,可以使用@Mapping注解来自定义映射规则。例如: ```java @Mapper public interface UserMapper { @Mapping(source = "fullName", target = "name") UserDto userToUserDto(User user); } ``` 上述代码中,将源类User的fullName属性映射到目标类UserDto的name属性。 3. 忽略属性:有时候需要忽略某些属性的映射,可以使用@Mapping注解的ignore属性。例如: ```java @Mapper public interface UserMapper { @Mapping(target = "password", ignore = true) UserDto userToUserDto(User user); } ``` 上述代码中,忽略了源类User的password属性的映射。 4. 集合映射:MapStruct可以自动处理集合类型的映射。例如,将List<User>映射为List<UserDto>: ```java @Mapper public interface UserMapper { List<UserDto> usersToUserDtos(List<User> users); } ``` 上述代码中,MapStruct会自动遍历List<User>并调用userToUserDto方法进行映射。 5. 映射器配置:可以通过@Mapper注解的config属性指定映射器配置类。映射器配置类可以定义一些全局的映射规则和转换逻辑。 以上是一些MapStruct的技巧用法,希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值