+2

Các loại model mapper trong java spring

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.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí