Trong Java Spring, có hai loại model mapper chính:
- ModelMapper là một thư viện Java mã nguồn mở được sử dụng để ánh xạ các đối tượng Java. Nó cung cấp một API đơn giản và dễ sử dụng để ánh xạ giữa các đối tượng có cấu trúc tương tự.
- MapStruct là một công cụ mã nguồn Java được sử dụng để tự động tạo các mapper giữa các đối tượng Java. Nó sử dụng các chú thích (anotation) để mô tả các ánh xạ giữa các đối tượng, sau đó tạo ra mã Java thực hiện các ánh xạ đó.
1. ModelMapper
ModelMapper là một lựa chọn tốt cho các ứng dụng cần ánh xạ các đối tượng Java đơn giản. Nó cung cấp một API dễ sử dụng và có thể được sử dụng để ánh xạ giữa các đối tượng có cấu trúc tương đối đơn giản.
Dưới đây là một ví dụ chi tiết hơn về cách sử dụng ModelMapper để ánh xạ các đối tượng Java:
import com.modelmapper.ModelMapper; public class Example { public static void main(String[] args) { // Create two objects Customer customer = new Customer("John Doe", 30); CustomerDto customerDto = new CustomerDto(); // Create a ModelMapper ModelMapper modelMapper = new ModelMapper(); // Map the customer to the customerDto modelMapper.map(customer, customerDto); // Print the customerDto System.out.println(customerDto); }
}
Trong ví dụ này, chúng ta tạo hai đối tượng: một đối tượng Customer
và một đối tượng CustomerDto
. Sau đó, chúng ta tạo một ModelMapper
và sử dụng nó để ánh xạ đối tượng Customer
sang đối tượng CustomerDto
. Cuối cùng, chúng ta in đối tượng CustomerDto
ra console.
Để ánh xạ các thuộc tính của hai đối tượng, chúng ta sử dụng phương thức map()
của ModelMapper
. Phương thức này có hai đối số: đối tượng nguồn và đối tượng đích.
Trong ví dụ này, chúng ta ánh xạ thuộc tính name
của đối tượng Customer
sang thuộc tính customerName
của đối tượng CustomerDto
. Chúng ta cũng ánh xạ thuộc tính age
của đối tượng Customer
sang thuộc tính customerAge
của đối tượng CustomerDto
.
Chúng ta cũng có thể sử dụng các chú thích của ModelMapper để mô tả các ánh xạ giữa các thuộc tính của hai đối tượng. Ví dụ:
import com.modelmapper.ModelMapper; public class Example { public static void main(String[] args) { // Create two objects Customer customer = new Customer("John Doe", 30); CustomerDto customerDto = new CustomerDto(); // Create a ModelMapper ModelMapper modelMapper = new ModelMapper(); // Map the customer to the customerDto using annotations modelMapper.map(customer, customerDto, // Specify the source property @Mapping(source = "name", target = "customerName"), // Specify the target property @Mapping(source = "age", target = "customerAge")); // Print the customerDto System.out.println(customerDto); }
}
Trong ví dụ này, chúng ta sử dụng các chú thích @Mapping()
để mô tả các ánh xạ giữa các thuộc tính của hai đối tượng. Chú thích @Mapping()
có hai đối số: thuộc tính nguồn và thuộc tính đích.
import com.modelmapper.ModelMapper; public class Example { public static void main(String[] args) { // Create two objects Customer customer = new Customer("John Doe", 30, new Address("123 Main Street", "Anytown", "CA", 12345)); CustomerDto customerDto = new CustomerDto(); // Create a ModelMapper ModelMapper modelMapper = new ModelMapper(); // Map the customer to the customerDto using annotations modelMapper.map(customer, customerDto, // Specify the source property @Mapping(source = "name", target = "customerName"), // Specify the target property @Mapping(source = "age", target = "customerAge"), // Map the address property @Mapping(source = "address", target = "customerAddress")); // Print the customerDto System.out.println(customerDto); }
}
Trong ví dụ này, chúng ta sử dụng chú thích @Mapping()
để ánh xạ thuộc tính address
của đối tượng Customer
sang thuộc tính customerAddress
của đối tượng CustomerDto
.
Để biết thêm thông tin về cách sử dụng ModelMapper, vui lòng tham khảo tài liệu tham khảo của ModelMapper.
2.MapStruct
MapStruct là một lựa chọn tốt cho các ứng dụng cần ánh xạ các đối tượng Java phức tạp. Nó có thể được sử dụng để ánh xạ giữa các đối tượng có cấu trúc phức tạp, bao gồm các đối tượng có các thuộc tính phức tạp như danh sách, bản đồ, v.v.
Để sử dụng MapStruct, bạn cần thêm nó vào dependency của dự án. Sau đó, bạn có thể sử dụng chú thích của MapStruct để mô tả các ánh xạ giữa các đối tượng. Dưới đây là một ví dụ chi tiết về cách sử dụng MapStruct để ánh xạ các đối tượng Java:
@Mapper
public interface CustomerMapper { @Mapping(source = "name", target = "customerName") @Mapping(source = "age", target = "customerAge") CustomerDto toCustomerDto(Customer customer);
}
Trong ví dụ này, chúng ta tạo một interface CustomerMapper
được chú thích bằng @Mapper
. Interface này xác định một phương thức toCustomerDto()
được sử dụng để ánh xạ một đối tượng Customer
sang một đối tượng CustomerDto
. Phương thức này sử dụng các chú thích @Mapping()
để mô tả các ánh xạ giữa các thuộc tính của hai đối tượng.
Để sử dụng MapStruct, chúng ta cần sử dụng công cụ mã nguồn của MapStruct để tự động tạo mã Java thực hiện các ánh xạ đó. Chúng ta có thể sử dụng lệnh sau để tạo mã Java:
mvn compile
Sau khi tạo mã Java, chúng ta có thể sử dụng nó để ánh xạ các đối tượng như sau:
import com.example.mapper.CustomerMapper;
import com.example.model.Customer;
import com.example.model.dto.CustomerDto; public class Example { public static void main(String[] args) { // Create a customer Customer customer = new Customer("John Doe", 30); // Create a customerDto CustomerDto customerDto = CustomerMapper.INSTANCE.toCustomerDto(customer); // Print the customerDto System.out.println(customerDto); }
}
Trong ví dụ này, chúng ta sử dụng phương thức toCustomerDto()
của interface CustomerMapper
để ánh xạ một đối tượng Customer
sang một đối tượng CustomerDto
.
Dưới đây là một ví dụ khác về cách sử dụng MapStruct để ánh xạ các thuộc tính phức tạp:
@Mapper
public interface AddressMapper { @Mapping(source = "street", target = "street") @Mapping(source = "city", target = "city") @Mapping(source = "state", target = "state") @Mapping(source = "zipCode", target = "zipCode") AddressDto toAddressDto(Address address);
}
Trong ví dụ này, chúng ta tạo một interface AddressMapper
được chú thích bằng @Mapper
. Interface này xác định một phương thức toAddressDto()
được sử dụng để ánh xạ một đối tượng Address
sang một đối tượng AddressDto
. Phương thức này sử dụng các chú thích @Mapping()
để mô tả các ánh xạ giữa các thuộc tính của hai đối tượng.
Để sử dụng MapStruct để ánh xạ các thuộc tính phức tạp, chúng ta cần sử dụng các chú thích @Mapping()
cho từng thuộc tính của đối tượng đích.
Dưới đây là một ví dụ cuối cùng về cách sử dụng MapStruct để xử lý các trường hợp ngoại lệ:
@Mapper(componentModel = "spring")
public interface CustomerMapper { @Mapping(source = "name", target = "customerName") @Mapping(source = "age", target = "customerAge") CustomerDto toCustomerDto(Customer customer) throws AgeException; class AgeException extends RuntimeException { public AgeException(String message) { super(message); } }
}
Trong ví dụ này, chúng ta sử dụng annotation @Mapper(componentModel = "spring")
để cho phép MapStruct tự động tạo các bean của interface CustomerMapper
.
Chúng ta cũng sử dụng annotation @Mapping()
để mô tả các ánh xạ giữa các thuộc tính của hai đối tượng.
Ngoài ra, chúng ta sử dụng annotation @ExceptionHandler()
để xử lý trường hợp ngoại lệ AgeException
.
So sánh
ModelMapper và MapStruct đều là những công cụ hữu ích để ánh xạ các đối tượng Java. Tuy nhiên, chúng có một số điểm khác biệt chính:
Tính năng | ModelMapper | MapStruct |
---|---|---|
Cấu trúc | API thủ công | Tự động tạo mã |
Khả năng mở rộng | Cao | Thấp |
Hiệu suất | Thấp hơn | Cao hơn |
Lựa chọn
Lựa chọn công cụ ánh xạ nào phụ thuộc vào nhu cầu của ứng dụng của bạn. Nếu bạn cần ánh xạ các đối tượng Java đơn giản, thì ModelMapper là một lựa chọn tốt. Nếu bạn cần ánh xạ các đối tượng Java phức tạp, thì MapStruct là một lựa chọn tốt hơn.