目录
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.结束语
好的,今天的分享到此结束,小伙伴们,你们学废了吗
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。小伙伴们,加油