ModelMapper基本使用和常見場景示例詳解
ModelMapper 是一個用于簡化 Java 對象之間屬性映射的庫,它能夠自動或通過自定義規(guī)則將一個對象的屬性值映射到另一個對象中。以下是 ModelMapper 的基本使用方法和常見場景示例:
1. 添加依賴
首先,需要在項目中添加 ModelMapper 的依賴。如果你使用 Maven,可以在 pom.xml 中添加以下依賴:
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.1.1</version> <!-- 使用最新版本 -->
</dependency>2. 基本用法
ModelMapper 的核心是 ModelMapper 類,通過它的 map 方法可以實現(xiàn)對象之間的屬性映射。
示例:簡單對象映射
假設(shè)有兩個類 Source 和 Destination,它們的屬性名相同:
import org.modelmapper.ModelMapper;
class Source {
private String name;
private int age;
// getters and setters
}
class Destination {
private String name;
private int age;
// getters and setters
}
public class Main {
public static void main(String[] args) {
ModelMapper modelMapper = new ModelMapper();
Source source = new Source();
source.setName("Alice");
source.setAge(25);
// 將 Source 對象映射到 Destination 對象
Destination destination = modelMapper.map(source, Destination.class);
System.out.println(destination.getName()); // 輸出: Alice
System.out.println(destination.getAge()); // 輸出: 25
}
}3. 自定義映射規(guī)則
如果源對象和目標對象的屬性名不同,或者需要更復(fù)雜的映射邏輯,可以通過以下方式自定義:
方式 1:使用 PropertyMap
import org.modelmapper.PropertyMap;
ModelMapper modelMapper = new ModelMapper();
// 自定義映射規(guī)則
modelMapper.addMappings(new PropertyMap<Source, Destination>() {
@Override
protected void configure() {
map().setUserName(source.getName()); // 將 Source 的 name 映射到 Destination 的 userName
map().setYears(source.getAge()); // 將 Source 的 age 映射到 Destination 的 years
}
});
Source source = new Source();
source.setName("Bob");
source.setAge(30);
Destination destination = modelMapper.map(source, Destination.class);
System.out.println(destination.getUserName()); // 輸出: Bob
System.out.println(destination.getYears()); // 輸出: 30方式 2:使用 Lambda 表達式(ModelMapper 2.3.0+)
ModelMapper modelMapper = new ModelMapper();
// 使用 Lambda 表達式自定義映射
modelMapper.typeMap(Source.class, Destination.class)
.addMappings(mapper -> mapper.map(src -> src.getName(), Destination::setUserName))
.addMappings(mapper -> mapper.map(src -> src.getAge(), Destination::setYears));
Destination destination = modelMapper.map(source, Destination.class);4. 集合映射
ModelMapper 也支持集合類型的映射,例如將 List<Source> 映射為 List<Destination>:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
List<Source> sources = Arrays.asList(
new Source("Alice", 25),
new Source("Bob", 30)
);
// 方法 1:使用 Stream 和 map
List<Destination> destinations = sources.stream()
.map(source -> modelMapper.map(source, Destination.class))
.collect(Collectors.toList());
// 方法 2:直接映射集合(ModelMapper 2.3.0+)
List<Destination> destinations2 = modelMapper.map(sources, new TypeToken<List<Destination>>() {}.getType());5. 高級配置
匹配策略
ModelMapper 提供了多種匹配策略,例如:
STRICT:嚴格匹配(默認),屬性名和類型必須完全一致。LOOSE:寬松匹配,屬性名可以部分匹配。STANDARD:標準匹配,支持駝峰命名轉(zhuǎn)換。
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE); // 使用寬松匹配忽略某些屬性
modelMapper.typeMap(Source.class, Destination.class)
.addMappings(mapper -> mapper.skip(Destination::setAge)); // 忽略 age 屬性的映射自定義轉(zhuǎn)換器
如果需要將屬性值進行轉(zhuǎn)換(例如日期格式化),可以使用 Converter:
import org.modelmapper.Converter;
import org.modelmapper.spi.MappingContext;
Converter<String, Date> stringToDateConverter = ctx -> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(ctx.getSource());
} catch (ParseException e) {
throw new RuntimeException(e);
}
};
modelMapper.addConverter(stringToDateConverter);6. 在 Spring Boot 中使用
在 Spring Boot 項目中,可以將 ModelMapper 配置為 Bean:
import org.modelmapper.ModelMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
}然后在 Service 或 Controller 中注入使用:
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private ModelMapper modelMapper;
public Destination convertToDestination(Source source) {
return modelMapper.map(source, Destination.class);
}
}總結(jié)
ModelMapper 的核心功能包括:
- 自動映射:根據(jù)屬性名和類型自動映射。
- 自定義映射:通過
PropertyMap或 Lambda 表達式自定義映射規(guī)則。 - 集合映射:支持
List、Set等集合類型的映射。 - 高級配置:支持匹配策略、忽略屬性、自定義轉(zhuǎn)換器等。
- Spring 集成:可以輕松集成到 Spring Boot 項目中。
通過 ModelMapper,可以大大減少對象映射的樣板代碼,提高開發(fā)效率。
到此這篇關(guān)于ModelMapper基本使用和常見場景示例詳解的文章就介紹到這了,更多相關(guān)ModelMapper使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Flyway詳解及Springboot集成Flyway的詳細教程
Flayway是一款數(shù)據(jù)庫版本控制管理工具,,支持數(shù)據(jù)庫版本自動升級,Migrations可以寫成sql腳本,也可以寫在java代碼里。這篇文章主要介紹了Flyway詳解及Springboot集成Flyway的詳細教程的相關(guān)資料,需要的朋友可以參考下2020-07-07
Java中的數(shù)組基礎(chǔ)知識學(xué)習(xí)教程
這篇文章主要介紹了Java中的數(shù)組基礎(chǔ)知識學(xué)習(xí)教程,文中同時也整理了Java對數(shù)字類型的支持狀況及Number類中的方法,需要的朋友可以參考下2016-02-02
Mybatis-plus多數(shù)據(jù)源配置的兩種方式總結(jié)
這篇文章主要為大家詳細介紹了Mybatis-plus中多數(shù)據(jù)源配置的兩種方式,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下2022-10-10
Java Web學(xué)習(xí)之MySQL在項目中的使用方法
mysql數(shù)據(jù)庫是我們在日常開發(fā)中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于Java Web學(xué)習(xí)之MySQL在項目中的使用方法,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04

