Tích hợp phân trang MySQL và thư viện Lombok vào MyBatis Generator

Vấn đề với công cụ MyBatis Generator mặc định

Mặc định, công cụ MyBatis Generator (MBG) tạo ra các lớp Example không hỗ trợ sẵn các tham số để phân trang phía cơ sở dữ liệu (như LIMIT, OFFSET). Ngoài ra, các lớp Data Object (DO) được sinh ra thường chứa rất nhiều mã boilerplate như Getter và Setter, khiến mã nguồn trở nên cồng kềnh và khó duy trì.

Để giải quyết vấn đề này, chúng ta có thể xây dựng các Plugin tùy chỉnh nhằm tự động hóa việc chèn logic phân trang và tích hợp các annotation của Lombok.

Tự động hóa logic phân trang (Pagination)

Mục tiêu là bổ sung hai thuộc tính limitoffset vào lớp XxxExample, đồng thời cập nhật file XML để thực hiện truy vấn phân trang trên MySQL.

Cấu trúc mã nguồn mong muốn trong lớp Example:

private Integer limit;
private Integer offset;

public void setLimit(Integer limit) {
    this.limit = limit;
}

public Integer getLimit() {
    return limit;
}

public void setOffset(Integer offset) {
    this.offset = offset;
}

public Integer getOffset() {
    return offset;
}

Trong file XxxMapper.xml, thẻ selectByExample sẽ được sửa đổi để nhận diện các tham số này:

<select id="selectByExample" parameterType="com.example.model.XxxExample" resultMap="BaseResultMap">
  ...
  <if test="limit != null">
    limit 
    <if test="offset != null">
      ${offset},
    </if>
    ${limit}
  </if>
</select>

Tích hợp Lombok và JavaDoc từ Database

Thay vì sinh mã Getter/Setter thủ công, chúng ta sử dụng các Annotation của Lombok như @Data, @NoArgsConstructor@AllArgsConstructor. Đồng thời, plugin sẽ trích xuất chú thích (comment) từ các cột trong Database để tạo thành JavaDoc cho các trường tương ứng.

Kết quả lớp Model được tạo ra sẽ tinh gọn như sau:

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
    /**
     * Tên sản phẩm
     */
    private String productName;

    /**
     * Mã định danh duy nhất
     */
    private Long skuId;
}

Cấu hình Plugin trong MyBatis Generator

Để áp dụng các cải tiến trên, bạn cần khai báo các plugin trong file cấu hình generatorConfig.xml của dự án:

<generatorConfiguration>
    <context id="MySqlContext" targetRuntime="MyBatis3">
        <!-- Plugin hỗ trợ phân trang MySQL -->
        <plugin type="com.example.mybatis.plugin.MySqlPaginationPlugin" />
        
        <!-- Plugin tích hợp Lombok -->
        <plugin type="com.example.mybatis.plugin.LombokAnnotationPlugin" />
        
        ...
    </context>
</generatorConfiguration>

Đồng thời, hãy đảm bảo rằng dependency của các plugin này đã được thêm vào cấu hình của mybatis-generator-maven-plugin trong file pom.xml:

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.1</version>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>custom-mbg-plugins</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</plugin>

Việc sử dụng các plugin tùy chỉnh này giúp quy trình phát triển trở nên chuyên nghiệp hơn, giảm thiểu sai sót khi viết SQL phân trang thủ công và giữ cho cấu trúc Model luôn sạch sẽ, dễ đọc.

Thẻ: Mybatis-Generator Lombok mysql pagination java-persistence

Đăng vào ngày 7 tháng 7 lúc 15:45