MapStruct(脏活累活都交给我来做)

目录

1.MapStruct是啥玩意

1.1.简介

1.2.示例

2.使用MapStruct

2.1.导包

2.2.创建Do对象

2.3.创建Dto对象

2.4.创建转换器接口

2.5.书写方法测试

2.6.运行

 2.6.MapStruct原理

3.结束语


1.MapStruct是啥玩意

1.1.简介

        正常情况下我们从数据库查出来的数据都不是前端视图需要的数据,这就需要我们手动去进行封装,字段少的话还好说,如果字段很多的话、封装起来就会很麻烦,并且做的也都是没有技术含量的工作,它大量消耗着我们的时间,然而这件事还不得不做,这真让人头疼啊,于是MapStruct站出来了,它说:”这些活我来帮你做,于是就出现了MapStruct,它可以帮我们封装这些数据。

1.2.示例

正常情况下我们会这样写,一个一个往进Set,非常头疼

public void selectConverter(){
    // 从数据库查数据
    List<User> userList = userDao.selectList(null);
    User user = userList.get(0);
    if (user == null) {
            return null;
        } else {
            // 查完之后进行封装
            UserDto userDto = new UserDto();
            userDto.setUserName(user.getName());
            userDto.setUid(user.getId());
            userDto.setAge(user.getAge());
            userDto.setEmail(user.getEmail());
            userDto.setSex(user.getSex());
            userDto.setIsDeleted(user.getIsDeleted());
            return userDto;
        }
}

2.使用MapStruct

2.1.导包

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

2.2.创建Do对象

字段与数据库一一对应

@Data
public class User {

   
    private Long id;

    private String name;

    private Integer age;

    private String email;

    private Integer sex;

    private Integer isDeleted;

}

2.3.创建Dto对象

可以看到uid和UserName跟数据库是不一致的

@Data
public class UserDto {

 
    private Long uid;

    private String userName;

    private Integer age;

    private String email;

    private Integer sex;

    private Integer isDeleted;
}

2.4.创建转换器接口

// 注解的意思是把它交给Spring容器来管理
@Mapper(componentModel = "spring")
public interface UserConverter {

    // User对象转UserDto对象
    // 字段不对应的字段需要加注解
    // source表示数据库查出来的数据
    // target表示需要转换成的数据
    @Mapping(target = "uid", source = "id")
    @Mapping(target = "userName", source = "name")
    UserDto userToUserDto(User user);

    // 批量转换
    List<UserDto> usersToUserDtoS(List<User> users);
}

2.5.书写方法测试

@SpringBootTest
public class UserTest {
    @Autowired
    UserDao userDao;

    @Autowired
    UserConverter userConverter;

    @Test
    public void selectConverter(){
        // 数据库查询数据
        List<User> userList = userDao.selectList(null);
        User user = userList.get(0);
        
        // 进行类型封装
        UserDto userDto = userConverter.userToUserDto(user);
        System.out.println(userDto)
        
        // 批量封装
        List<UserDto> userDtoS = userConverter.usersToUserDtoS(userList);
        userDtoS.forEach(System.out::println);

2.6.运行

发现数据封装完毕,直接起飞(已经将id 和 name 封装成了我们需要的字段名称)

 2.6.MapStruct原理

打开Target下--->项目生成的文件,发现他又生成了一个实现类

 

 打开发现:它的原理跟我们之前写的一样,只不过它帮我们把事情做了,是不是感觉很爽

@Component
public class UserConverterImpl implements UserConverter {
    public UserConverterImpl() {
    }

    public UserDto userToUserDto(User user) {
        if (user == null) {
            return null;
        } else {
            UserDto userDto = new UserDto();
            userDto.setUserName(user.getName());
            userDto.setUid(user.getId());
            userDto.setAge(user.getAge());
            userDto.setEmail(user.getEmail());
            userDto.setSex(user.getSex());
            userDto.setIsDeleted(user.getIsDeleted());
            return userDto;
        }
    }

    public List<UserDto> usersToUserDtoS(List<User> users) {
        if (users == null) {
            return null;
        } else {
            List<UserDto> list = new ArrayList(users.size());
            Iterator var3 = users.iterator();

            while(var3.hasNext()) {
                User user = (User)var3.next();
                list.add(this.userToUserDto(user));
            }
            return list;
        }
    }

3.结束语

好的,今天的分享到此结束,小伙伴们,你们学废了吗

没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。小伙伴们,加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值