0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Hướng Dẫn Chi Tiết Sử Dụng MapStruct Kết Hợp Lombok Trong Java

Đăng vào 1 ngày trước

• 4 phút đọc

Hướng Dẫn Chi Tiết Sử Dụng MapStruct Kết Hợp Lombok Trong Java

Bài viết này sẽ hướng dẫn bạn cách kết hợp hai thư viện phổ biến, MapStruct và Lombok, để thực hiện mapping giữa entity và DTO trong ứng dụng Java. Đây sẽ là một hướng dẫn nhanh gọn giúp tối ưu hóa quy trình lập trình và quản lý mã nguồn.


Các Dependency Cần Thiết

Trước tiên, bạn cần thêm các dependency cần thiết vào dự án Spring Boot (phiên bản 3.4.1) với các thành phần Spring Web, JPA và MySQL (đừng quên tạo database trước nhé!).

xml Copy
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${org.lombok.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok-mapstruct-binding</artifactId>
        <version>0.2.0</version>
    </dependency>
</dependencies>

Cấu Hình Application.properties

Tiếp theo, cấu hình các thông tin kết nối trong file application.properties:

properties Copy
spring.application.name=myhibernate
spring.datasource.url=${DATASOURCE_URL:jdbc:mysql://localhost:3306/myhibernate}
spring.datasource.username=${DATASOURCE_USERNAME:nhan}
spring.datasource.password=${DATASOURCE_PASSWORD:nhan}
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

Triển Khai Mã Nguồn

Dưới đây là ví dụ về hai endpoint trong ứng dụng:

Endpoint Method Mô Tả Request Body Response Body
/customers POST Tạo mới khách hàng CustomerDto CustomerDto
/customers/all GET Lấy danh sách tất cả khách hàng Không List<CustomerDto>

Entity - Customer

Dưới đây là lớp Customer, được sử dụng để ánh xạ dữ liệu từ database:

java Copy
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    private String gender;
}

DTO - CustomerDto

Lớp DTO tương ứng với entity sẽ như sau:

java Copy
public record CustomerDto(Long id, String name, String email, String gender) { }

Mapper - CustomerMapper

Sử dụng MapStruct để tạo mapper:

java Copy
@Mapper(componentModel = "spring")
public interface CustomerMapper {
    @Mapping(target = "id", ignore = true)
    Customer toEntity(CustomerDto customerDto);
    CustomerDto toDto(Customer customer);
}

Repository - CustomerRepository

java Copy
public interface CustomerRepository extends JpaRepository<Customer, Long> { }

Service - CustomerService và CustomerServiceImpl

java Copy
public interface CustomerService {
    CustomerDto createCustomer(CustomerDto customerDto);
    List<CustomerDto> getAllCustomers();
}

@Service
public class CustomerServiceImpl implements CustomerService {
    private final CustomerMapper customerMapper;
    private final CustomerRepository customerRepository;

    public CustomerServiceImpl(CustomerMapper customerMapper, CustomerRepository customerRepository) {
        this.customerMapper = customerMapper;
        this.customerRepository = customerRepository;
    }

    @Override
    public CustomerDto createCustomer(CustomerDto customerDto) {
        Customer customer = customerMapper.toEntity(customerDto);
        customer = customerRepository.save(customer);
        return customerMapper.toDto(customer);
    }

    @Override
    public List<CustomerDto> getAllCustomers() {
        return customerRepository.findAll().stream().map(customerMapper::toDto).toList();
    }
}

Controller - CustomerController

java Copy
@RestController
@RequestMapping("/customers")
public class CustomerController {
    private final CustomerService customerService;

    public CustomerController(CustomerService customerService) {
        this.customerService = customerService;
    }

    @PostMapping
    public CustomerDto createCustomer(@RequestBody CustomerDto customerDto) {
        return customerService.createCustomer(customerDto);
    }

    @GetMapping("/all")
    public List<CustomerDto> getAllCustomers() {
        return customerService.getAllCustomers();
    }
}

Kiểm Tra API

Để kiểm tra các endpoint trên, bạn có thể sử dụng Httpie Desktop:

  1. Để tạo mới khách hàng, bạn thực hiện POST tại /customers với body là CustomerDto:

    json Copy
    {
      "id": 2,
      "name": "tran nhan",
      "email": "nhan@gmail.com",
      "gender": "male"
    }

    Response cho biết id sẽ được sinh tự động.

  2. Để lấy danh sách khách hàng, thực hiện GET tại /customers/all.

Lưu Ý

  • Để hiểu rõ hơn, bạn có thể kiểm tra các class được tạo ra tự động trong thư mục target/classes/package_tương_ứng.
  • Hãy nhớ rằng việc cập nhật và tìm hiểu kỹ càng về các thư viện là điều rất quan trọng, vì nó sẽ giúp bạn cải thiện kỹ năng lập trình và nâng cao chất lượng mã nguồn của dự án.

Tài Liệu Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào