将数据库的entity对象转换成数据处理的dto对象
在业务逻辑中,一般使用dto对象来进行数据处理。而将entity对象转换成dto对象有很多种方法。
因为老是忘记,所以记录一下mapstruct这个方法,以便以后会用到。
1. 在pom文件中加入maven依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
2. 使用@Mapper注解
这个@mapper注解不是mybatis提供的注解,是mapstruct提供的,不要使用错了。
package com.article.community.service;
import com.article.community.bean.Person;
import com.article.community.bean.User;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* @author
* @date 2020/8/13
* @description
*/
@Mapper
public interface UserMapper {
UserMapper USER_MAPPER = Mappers.getMapper(UserMapper.class);
User toUser(Person person);
List<User> toUserList(List<Person> personList);
}
3. 使用maven编译代码(如图所示,idea在启动项目的时候也会自动编译)
4. 完成后检查代码编译是否成功,下面是编译后的代码,自动生成的
package com.article.community.service;
import com.article.community.bean.Person;
import com.article.community.bean.User;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2020-08-13T21:05:36+0800",
comments = "version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)"
)
public class UserMapperImpl implements UserMapper {
@Override
public User toUser(Person person) {
if ( person == null ) {
return null;
}
User user = new User();
user.setName( person.getName() );
user.setAge( person.getAge() );
return user;
}
@Override
public List<User> toUserList(List<Person> personList) {
if ( personList == null ) {
return null;
}
List<User> list = new ArrayList<User>( personList.size() );
for ( Person person : personList ) {
list.add( toUser( person ) );
}
return list;
}
}
5. 测试类
@Test
public void TestMappers() {
Person person1 = new Person("小明", "14", "男");
Person person2 = new Person("小红", "12", "女");
//小明
User user1 = USER_MAPPER.toUser(person1);
System.out.println(user1.toString());
List<Person> list = Arrays.asList(person1, person2);
List<User> users = USER_MAPPER.toUserList(list);
users.forEach(System.out::println);
}
6. 其他类
User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private String age;
}
Person
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private String age;
private String sex;
}
7. 测试结果
注意:当Person类和User类的参数不一致时,需要使用@Mappings注解
//只需要在对应的单个对象转换的上方增加就可以了,集合的方法不需要增加
@Mappings({
@Mapping(source = "name", target = "username")
})
User toUser(Person person);
生成的toUser方法
@Override
public User toUser(Person person) {
if ( person == null ) {
return null;
}
User user = new User();
//这个地方的set方法变了
user.setUsername( person.getName() );
user.setAge( person.getAge() );
return user;
}