Tạo bảng trong EzyPlatform plugin
Back To BlogsMục tiêu
Của bài hướng dẫn này nhằm giúp bạn:
- Tạo được bảng mới và alter được bảng nếu muốn.
- Tạo được đối tượng Entity và Repository gắn với bảng.
- 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;
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`;
- Ngoài ra bạn cũng cần cập nhật script của bảng
personal_post_word_countstrong tập tinscripts.sqlđể bổ sungupdated_atnhư 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_tabletrước dẫn điến việc nếupersonal_post_word_countsbị thiếu trườngupdated_at. - EzyPlatform sẽ đảm bảo các script có từ
altertrong 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.