MapStruct-Java实体转换利器

简介: 本文介绍了MapStruct这一Java实体转换工具,通过定义mapper接口和使用注解,自动生成实现类以简化不同Java对象之间的转换过程,并提供了一个简单的使用示例,包括定义DTO、Entity类和映射接口,以及在Service层中的使用方式。

MapStruct 概述

MapStruct 是一个用于生成映射器接口的代码生成库,主要用于简化 Java 对象之间的转换过程。在处理不同模型之间数据转换时,MapStruct 可以自动生成实现类减少手工转换逻辑的工作量。

使用场景:各种模型之间的转换。BO,DTO,VO,POJO

使用步骤:

  1. 引入mapstruct的pom依赖
  2. 定义mapper接口(注意,这里不是MyBatis的Mapper哦),使用@Mapper注解标记,并在接口中声明映射方法。
  3. 编写映射方法,(从xxxO转换为yyyO,模型之间的转换)
  4. 在业务层中使用Mapper接口定义的方法,进行模型之间的转换。

MapStruct 使用例子

列举一种最简单的mapstruct的使用,dto->entity的转换

UserDTO

@Data // lombok
public class UserDTO {
   
    private String name;
    private int age;
}

UserEntity

@Data // lombok
public class UserEntity {
   
    private String username;
    private int userAge;
}

UserDTOConverter ( mapstruct 接口)

@Mapper
public interface UserModelConverter {
   

    UserModelConverter INSTANCE = Mappers.getMapper(UserModelConverter.class);

    /**
    * dto->entity 的转换
    */
    UserEntity convertDtoToEntity(UserDTO dto);

    /**
    * entity->dto 的转换
    */
    UserDTO convertEntityToDto(UserEntity entity);
}

UserModelConverterImpl (自动生成)

xxxConvertImpl会自动在mvn构建时生成在target目录下,这里写出来,只是为了让大家了解它的本质就是bean的转换

public class UserModelConverterImpl implements UserModelConverter {
   

    @Override
    public UserEntity convertDtoToEntity(UserDTO userDto) {
   
        if ( userDto == null ) {
   
            return null;
        }

        UserEntity useEntity = new UserEntity();

        useEntity.setUserName( userDto.getName() );
        useEntity.setUserAge( userDto.getAge() );

        return useEntity;
    }



    @Override
    public UserDTO convertEntityToDto(UserEntity userEntity) {
   
        if ( userEntity == null ) {
   
            return null;
        }

        UserDTO userDto = new UserDTO();

        userDto.setName( userEntity.getUserName() );
        userDto.setAge( userEntity.getUserAge() );

        return userDto;
    }
}

自动生成的impl类贴图:

image.png

Service 层使用

public class UserServiceImpl implements UserService {
   

    @Override
    public add(UserDTO userDto){
   
       UserEntity userEntity =  UserModelConverter.INSTANCE
        .convertDtoToEntity(userDto);
       // 插入到数据库中 .... 
    }

}

更详细的用法,可以参考 MapStruct 快速指南 | Baeldung中文网 (baeldung-cn.com)

相关文章
|
IDE Java 数据库
Java实体映射工具MapStruct
Java实体映射工具MapStruct
155 0
|
4天前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
26 9
|
4月前
|
存储 Java 数据库
Java一分钟之-JPA实体监听器:@PrePersist, @PostLoad
【6月更文挑战第15天】JPA实体监听器通过`@PrePersist`等注解在实体生命周期关键点执行逻辑,例如设置默认值或处理并发更新。常见问题包括监听器未注册、并发冲突和性能影响。示例展示了如何在`@PrePersist`中设置默认创建时间和`@PostLoad`时初始化关联数据。使用监听器能增强灵活性,但也需注意潜在问题和优化。
90 6
|
4月前
|
JSON Java API
Java一分钟之-JPA实体关系:一对一, 一对多, 多对多
【6月更文挑战第14天】Java Persistence API (JPA) 的 ORM 规范简化了数据库操作,重点是实体关系映射。本文讨论了三种主要关系:一对一、一对多和多对多。对于每种关系,都指出了常见问题(如循环引用、懒加载异常)和避免策略(使用注解解决循环引用,明确级联操作边界等)。同时,提供了示例代码以展示如何在实践中设置这些关系。理解并妥善处理这些问题能提升开发效率和数据准确性。
105 1
|
5月前
|
XML SQL 前端开发
【Java】实体字段传参类型线上问题记录
【Java】实体字段传参类型线上问题记录
46 1
|
5月前
|
Java API Apache
java的实体拷贝方式与实战
Java 中的实体拷贝,通常指的是将一个对象的属性值复制到另一个对象的过程。实体拷贝可以是浅拷贝(Shallow Copy)或深拷贝(Deep Copy)。浅拷贝仅复制对象的引用,而不复制引用的对象本身;深拷贝则会复制对象以及对象内部引用的所有对象。实现实体拷贝的方法有多种,包括直接赋值、使用克隆方法、通过序列化/反序列化,以及利用反射或第三方库。下面详细介绍这些实现原理:
205 1
|
Java
CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]
CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]
345 0
java202303java学习笔记第四十六天-请求-简单参数和实体参数1
java202303java学习笔记第四十六天-请求-简单参数和实体参数1
40 0
java202303java学习笔记第四十六天-请求-简单参数和实体参数2
java202303java学习笔记第四十六天-请求-简单参数和实体参数2
50 0