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
<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
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
@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
public record CustomerDto(Long id, String name, String email, String gender) { }
Mapper - CustomerMapper
Sử dụng MapStruct để tạo mapper:
java
@Mapper(componentModel = "spring")
public interface CustomerMapper {
@Mapping(target = "id", ignore = true)
Customer toEntity(CustomerDto customerDto);
CustomerDto toDto(Customer customer);
}
Repository - CustomerRepository
java
public interface CustomerRepository extends JpaRepository<Customer, Long> { }
Service - CustomerService và CustomerServiceImpl
java
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
@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
:
-
Để tạo mới khách hàng, bạn thực hiện POST tại
/customers
với body làCustomerDto
:json{ "id": 2, "name": "tran nhan", "email": "nhan@gmail.com", "gender": "male" }
Response cho biết
id
sẽ được sinh tự động. -
Để 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
- Website MapStruct
- Hướng Dẫn Lombok trên Viblo
source: viblo