1、先引入mapstruct的依赖如下
<!--dto转换-->
<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、我们来了解一下mapstruct的几个常用的注解@Mpper注解 的componentModel属性,这个属性支持四个值
- default: 这是默认的情况,mapstruct 不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
- cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
- spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
- jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取
3、下面我们写一个转换的demo
先创建两个实体类UserPO,User
package com.spring.demo.springdemo.infrastructure.entity;
import lombok.Data;
import java.util.Date;
@Data
public class UserPO {
private String id;
private String userNo;
private String userName;
private String usrPwd;
private String status;
private String loginFlg;
private Date createTm;
private Date updateTm;
}
package com.spring.demo.springdemo.domain.model;
import lombok.Data;
import java.util.Date;
/**
* @author: xizhangyan
* @date: 2021/3/5
* @desc: 用户信息
**/
@Data
public class User {
/**
* ID
*/
private String id;
/**
* 用户号
*/
private String userNo;
/**
* 用户名称
*/
private String userName;
/**
* 用户密码
*/
private String usrPwd;
/**
* 是否有效
*/
private String status;
/**
* 是否登录
*/
private String loginFlg;
/**
* 创建时间
*/
private String createTm;
/**
* 更新时间
*/
private Date updateTm;
}
下面我们创建他的转换类UserCovertBasi接口,这里说一下我使用的是default的运行时会自动生成对应的impl,你也可以使用(componentModel = "spring")
当使用这个的时候调用转换类需要使用注解的形式@Autowired调用,在写List实体类转换时,一定要有单个的对象转换方法
//@Mapper(componentModel = "spring")
@Mapper
public interface UserCovertBasic {
UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class);
/**
* userpo 转换成User
* @param userPO
* @return
*/
@Mappings({
@Mapping(target = "createTm",dateFormat = "yyyy-MM-dd")
})
User toCovertModel(UserPO userPO);
/**
* userpoList 转换成UserList
* @param userPOS
* @return
*/
List<User> toCovertModels(List<UserPO> userPOS);
}
下面是使用的地方
@Override
public User getUserById(String id) {
UserPO userPo = userPOMapper.selectByPrimaryKey(id);
return UserCovertBasic.INSTANCE.toCovertModel(userPo);
}
over