Về cơ bản thì hàng trăm bảng có sẵn trong EzyPlatform và các plugin core đã cung tương đối đầy đủ các bảng mà bạn cần rồi, tuy nhiên nếu bạn vẫn muốn tạo ra một bảng để đáp ứng nhu cầu của mình, điều này cũng khá đơn giản.

Mục tiêu

Của bài hướng dẫn này nhằm giúp bạn:

  1. Tạo được bảng mới và alter được bảng nếu muốn.
  2. Tạo được đối tượng Entity và Repository gắn với bảng.
  3. Chạy thử được thông qua lớp Integration Test.

Tạo một bảng

Tiếp tục với dự án personal, ở đây hãy nói rằng bạn cần tạo ra một bảng để lưu số lượng từ có trong các bài viết bạn có thể làm như sau:

1. Trong thư mục main/src/resources của module personal-admin-plugin, hãy tạo thư mục scripts. EzyPlatform sẽ tự động tìm kiếm tất cả các tập tin sql trong thư mục scripts này để thực thi và nó chỉ thực thi 1 lần duy nhất khi khởi động. Ngoài ra EzyPlatform sẽ chỉ quét các tập tin sql ở module admin thôi, nếu bạn đặt ở module khác như web hay socket sẽ không có tác dụng.

2. Bạn hãy tạo một tập tin có tên bất kỳ, ví dụ scripts.sql trong thư mục scripts.

3. Bạn đưa mã nguồn sql tạo bảng vào tập tin scripts.sql, lưu ý rằng việc đặt tên bảng luôn kèm với tiền tố là tên plugin để tránh trùng lặp gây ra lỗi không thể khởi động được ezyplatform, ví dụ:

CREATE TABLE IF NOT EXISTS `personal_post_word_counts` (
    `post_id` bigint unsigned NOT NULL,
    `word_count` bigint NOT NULL DEFAULT 0,
    PRIMARY KEY (`post_id`),
    INDEX `index_word_count_post_id` (`word_count`, `post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
Ngoài ra hãy để ở dạng CREATE TABLE IF NOT EXISTS để tránh bị lỗi trong trường hợp vô tình chạy scripts 2 lần.

4. Ở trên trên server hoặc ở local sau khi bạn export và active plugin thì EzyPlatform sẽ tự chạy scripts cho bạn, tuy nhiên để cho nhanh gọn bạn có thể chạy script tạo bảng này thông qua SQL IDE của bạn ví dụ như MySQL Workbench.

Thay đổi một bảng

Bởi vì EzyPlatform chỉ chạy scripts duy nhất 1 lần nên nếu vì một lý do nào đó bạn muốn thay đổi bảng của mình, ví dụ như bạn muốn thêm trường updated_at vào bảng personal_post_word_counts bạn có thể làm như sau:

1. Tạo tập tin có chứa từ alter trong tên, ví dụ alter_post_word_counts_table.sql với nội dung như sau:

ALTER TABLE `personal_post_word_counts`
ADD COLUMN `updated_at` datetime AFTER `word_count`;
  1. Ngoài ra bạn cũng cần cập nhật script của bảng personal_post_word_counts trong tập tin scripts.sql để bổ sung updated_at như sau:
CREATE TABLE IF NOT EXISTS `personal_post_word_counts` (
    `post_id` bigint unsigned NOT NULL,
    `word_count` bigint NOT NULL DEFAULT 0,
    `updated_at` datetime,
    PRIMARY KEY (`post_id`),
    INDEX `index_word_count_post_id` (`word_count`, `post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Tại sao lại như vậy?

  • Đầu tiên, EzyPlatform không đảm bảo thứ tự chạy scripts nên nếu lần đầu tiên người dùng cài đặt plugin thì nó sẽ có thể chạy alter_post_word_counts_table trước dẫn điến việc nếu personal_post_word_counts bị thiếu trường updated_at.
  • EzyPlatform sẽ đảm bảo các script có từ alter trong tên file khi chạy dù có lỗi cũng sẽ được bỏ qua và khởi động bình thường.

Tạo lớp Entity

Tiếp theo chúng ta sẽ tạo lớp Entity tương ứng với bảng personal_post_word_counts.

1. Đầu tiên hãy tạo một hằng số để lưu tên bảng trong lớp PersonalConstants, ví dụ:

public static final String TABLE_NAME_WORD_COUNT = 
        "personal_post_word_counts";

2. Tiếp theo hãy tạo lớp PersonalPostWordCount trong gói org.youngmonkeys.personal.entitty của module personal-sdk. Chúng ta sử dụng tiền tố Personal để tránh entity của chúng ta bị trùng với các plugin khách và đặt ở personal-sdk để cả admin và web hay socket đều sử dụng được nếu cần. Mã nguồn của lớp PersonalPostWordCount sẽ như sau:

package org.youngmonkeys.personal.entity;

import lombok.*;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;

import static org.youngmonkeys.personal.constant.PersonalConstants.TABLE_NAME_WORD_COUNT;

@Getter
@Setter
@ToString
@Entity
@Table(name = TABLE_NAME_WORD_COUNT)
@AllArgsConstructor
@NoArgsConstructor
public class PersonalPostWordCount {
    @Id
    @Column(name = "post_id")
    private long postId;

    @Column(name = "word_count")
    private long wordCount;

    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
}

Tạo lớp Repository

EzyPlatform đã cung cấp sẵn công cụ để bạn tạo ra các lớp Repo cho các module, bạn có thể tìm đến tập tin PersonalRepositoryClassesGenerator và thay đổi mã nguồn thành như sau:

package org.youngmonkeys.personal.test;

import org.youngmonkeys.devtools.repository.RepositoryClassesGenerator;
import org.youngmonkeys.personal.entity.PersonalPostWordCount;

public class PersonalRepositoryClassesGenerator {

    public static void main(String[] args) throws Exception {
        new RepositoryClassesGenerator(PersonalPostWordCount.class)
            .generate();
    }
}

Bây giờ hãy chạy lớp PersonalRepositoryClassesGenerator này và bạn sẽ thấy các lớp:

  • PersonalPostWordCountRepository
  • AdminPersonalPostWordCountRepository
  • WebPersonalPostWordCountRepository
  • AdminPersonalPostWordCountRepositoryIT

Được tạo ra ngay lập tức.

Chạy thử thông qua lớp Integration Test

Bây giờ bạn hãy tìm đến lớp AdminPersonalPostWordCountRepositoryIT, sửa đổi nội dung 1 chút thành như sau:

@EzySingleton
@AllArgsConstructor
public class AdminPersonalPostWordCountRepositoryIT implements IntegrationTest {

    private final AdminPersonalPostWordCountRepository personalPostWordCountRepository;

    @Override
    public void test() throws Exception {
        saveFindTest();
    }

    private void saveFindTest() {
        // given
        PersonalPostWordCount entity = new InstanceRandom().randomObject(PersonalPostWordCount.class);

        // when
        personalPostWordCountRepository.save(entity);
        PersonalPostWordCount actual = personalPostWordCountRepository.findById(entity.getPostId());

        // then
        Asserts.assertNotNull(actual);
        personalPostWordCountRepository.delete(entity.getPostId());
    }
}

Tiếp theo hãy chạy lớp PersonalAdminPluginStartupTest, nếu không có vấn đề gì nghĩa là mã nguồn tạo bảng và các lớp entity, repo đều ổn.

Tài liệu tham khảo