步驟如下:
**1. 創建實體類和被映射的類**
```java
/**
* 實體類
* 必須提供Getter和Setter方法
*/
@Data
public class User {
private Integer id;
private String name;
private Date createTime;
}
/**
* 被映射的類
* 必須提供Setter和Getter方法
* 與實體類User的屬性一致
*/
@Data
public class UserDto01 {
private Integer id;
private String name;
private Date createTime;
}
/**
* 被映射的類
* 必須提供Setter和Getter方法
* 比實體類User少了一個屬性
*/
@Data
public class UserDto02 {
private Integer id;
private String name;
}
```
**2. 創建映射接口**
```java
import com.mapstruct.domain.User;
import com.mapstruct.dto.UserDto01;
import com.mapstruct.dto.UserDto02;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface UserMapper {
/** 成員變量INSTANCE,目的是讓客戶端可以訪問 Mapper 接口的實現 **/
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
/** User映射到UserDto01 **/
UserDto01 toDto01(User source);
/** UserDto01映射到User **/
User toUser01(UserDto01 source);
/** User映射到UserDto02 **/
UserDto02 toDto02(User source);
/** UserDto02映射到User **/
User toUser02(UserDto02 source);
}
```
**3. 測試**
```java
public static void main(String[] args) {
User user = new User();
user.setId(1001);
user.setName("張三");
user.setCreateTime(new Date());
//User-->UserDto01
UserDto01 userDto01 = UserMapper.INSTANCE.toDto01(user);
//User-->UserDto02
UserDto02 userDto02 = UserMapper.INSTANCE.toDto02(user);
//UserDto01-->User
User user01 = UserMapper.INSTANCE.toUser01(userDto01);
//UserDto02-->User
User user02 = UserMapper.INSTANCE.toUser02(userDto02);
System.out.println("User:" + user.toString());
System.out.println("User-->UserDto01:" + userDto01);
System.out.println("User-->UserDto02:" + userDto02);
System.out.println("UserDto01-->User:" + user01);
System.out.println("UserDto02-->User:" + user02);
}
```
輸出如下:
```
User:User(id=1001, name=張三, createTime=Thu Oct 14 17:26:49 CST 2021)
User-->UserDto01:UserDto01(id=1001, name=張三, createTime=Thu Oct 14 17:26:49 CST 2021)
User-->UserDto02:UserDto02(id=1001, name=張三)
UserDto01-->User:User(id=1001, name=張三, createTime=Thu Oct 14 17:26:49 CST 2021)
UserDto02-->User:User(id=1001, name=張三, createTime=null)
```
**4. 查看映射接口被Mapstruct編譯后的代碼**
可以發現MapStruct實現`UserMapper`接口,并重寫了接口中的方法進行屬性賦值。
```java
public class UserMapperImpl implements UserMapper {
public UserMapperImpl() {
}
public UserDto01 toDto01(User source) {
if (source == null) {
return null;
} else {
// 對UserDto01的屬性賦值
UserDto01 userDto01 = new UserDto01();
userDto01.setId(source.getId());
userDto01.setName(source.getName());
userDto01.setCreateTime(source.getCreateTime());
return userDto01;
}
}
public User toUser01(UserDto01 source) {
if (source == null) {
return null;
} else {
// 對User的屬性賦值
User user = new User();
user.setId(source.getId());
user.setName(source.getName());
user.setCreateTime(source.getCreateTime());
return user;
}
}
public UserDto02 toDto02(User source) {
if (source == null) {
return null;
} else {
// 對UserDto02的屬性賦值
UserDto02 userDto02 = new UserDto02();
userDto02.setId(source.getId());
userDto02.setName(source.getName());
return userDto02;
}
}
public User toUser02(UserDto02 source) {
if (source == null) {
return null;
} else {
// 對Use的屬性賦值
User user = new User();
user.setId(source.getId());
user.setName(source.getName());
return user;
}
}
}
```
- MapStruct屬性映射
- MapStruct是什么
- maven依賴
- 基本映射
- 字段名不一致的映射
- 字段類型不一致的映射
- 基本數據類型轉換
- 日期格式轉換
- 使用表達式轉換
- 枚舉映射
- 多個源類的映射
- 集合的映射
- 添加自定義映射方法
- 映射前后
- 添加默認值
- 映射異常處理
- SpringDataJPA
- SpringDataJPA是什么
- 與JPA、Hibernate的關系
- 環境搭建
- 簡單CURD操作
- 內部原理
- 主鍵生成策略
- 聯合主鍵
- 查詢方式
- 方法命名規則查詢
- 限制查詢結果查詢
- 注解@Query查詢
- 命名參數查詢
- SpEL表達式查詢
- 原生查詢
- 更新與刪除
- Specification動態查詢
- 核心接口
- 查詢例子
- 分頁查詢與排序
- 多表查詢
- 一對一查詢
- 一對多查詢
- 多對多查詢
- 注意事項
- Specification多表查詢
- @Query多表查詢
- 只查詢指定字段
- 級聯操作
- 加載規則