โปรเจกต์นี้เป็นแอปพลิเคชันรูปแบบ Standalone Java SE พัฒนาด้วยเทคโนโลยี JPA (Jakarta Persistence API) ร่วมกับ Hibernate (ORM), MySQL Connector และ Lombok เพื่อเรียนรู้สถาปัตยกรรมการวางเลเยอร์ของระบบฐานข้อมูล (Clean Layer Architecture) และเทคนิคขั้นสูงในระดับองค์กร
โปรเจกต์นี้ถูกออกแบบเป็น Layered Architecture เพื่อแยกความรับผิดชอบของโค้ดออกจากกัน:
├───src
│ ├───main
│ │ ├───java
│ │ │ └───org
│ │ │ └───example
│ │ │ ├───entities # เลเยอร์โครงสร้างข้อมูล (JPA Entity Mapping)
│ │ │ │ ├── Actor.java
│ │ │ │ ├── Film.java
│ │ │ │ ├── CourseEnrollment.java
│ │ │ │ └── AppSystemConfig.java
│ │ │ ├───repositories # เลเยอร์เชื่อมต่อฐานข้อมูลระดับต่ำ (DAO Pattern)
│ │ │ │ ├── Repository.java
│ │ │ │ ├── AbstractRepository.java
│ │ │ │ ├── ActorRepository.java
│ │ │ │ ├── CourseEnrollmentRepository.java
│ │ │ │ └── AppSystemConfigRepository.java
│ │ │ ├───services # เลเยอร์ตรรกะทางธุรกิจ (Service Layer)
│ │ │ │ ├── ActorService.java
│ │ │ │ ├── CourseEnrollmentService.java
│ │ │ │ └── AppSystemConfigService.java
│ │ │ └───utils # เลเยอร์เครื่องมือช่วยเหลือ (Utility Layer)
│ │ │ └── JPAUtil.java
│ │ └───resources
│ │ └───META-INF # ที่อยู่ของ persistence.xml
📦 pom.xml
- Java Version: ตั้งค่าสำหรับการรันบน JDK 24
- Lombok Version: อัปเกรดขึ้นเป็น 1.18.38 เพื่อรองรับความเข้ากันได้กับ Java 24 (ป้องกันบั๊ก
TypeTag UNKNOWN) - Maven Compiler Plugin: ใส่ค่าการเรียกทำงาน
annotationProcessorPathsเพื่อแปลงโค้ดจากแอนโนเทชัน Lombok โดยอัตโนมัติ
- Connection URL: ตั้งค่าเชื่อมต่อ MySQL บน localhost ที่พอร์ต 3306
- Hibernate hbm2ddl.auto: โหมด
updateสำหรับสร้างหรือขยายโครงสร้างตารางโดยอัตโนมัติเมื่อตรวจพบ Entity ใหม่ - Batch Config: เปิดใช้งานและจัดระเบียบ JDBC Batching ผ่าน:
hibernate.jdbc.batch_size=50hibernate.order_inserts/hibernate.order_updates=true
สำหรับผู้ที่ต้องการเริ่มต้นตั้งค่าเครื่องคอมพิวเตอร์ใหม่ หรือต้องการ Setup สภาพแวดล้อมระบบตั้งแต่แรกเริ่ม สามารถทำตามขั้นตอนต่อไปนี้ได้ทันที:
เปิดคอมพิวเตอร์และเข้าโปรแกรม IntelliJ IDEA และทำการเปิดโฟลเดอร์โปรเจกต์ขึ้นมา
- ไปที่แถบเมนูด้านบนเลือก Help ➡️ คลิกที่ Manage Licenses... (หรือ Register...)
- เลือกหัวข้อลงทะเบียนแบบ License Server
- กรอกที่อยู่เซิร์ฟเวอร์สำหรับสิทธิ์ใช้งาน:
https://sit.fls.jetbrains.com - คลิกกด Login และลงชื่อเข้าใช้งานด้วยบัญชีนักศึกษา:
@ad.sit.kmutt.ac.th
- ไปที่เมนู File ➡️ Settings (สำหรับ macOS: IntelliJ IDEA ➡️ Settings) ➡️ เลือกแถบ Plugins
- ไปที่แท็บ Marketplace ค้นหาและกดติดตั้ง (Install) ปลั๊กอินต่อไปนี้:
- Jakarta EE
- Hibernate
- เปิดหน้าต่างเครื่องมือ Database (แถบขวามือของโปรแกรม)
- คลิกเครื่องหมาย
+➡️ Data Source ➡️ เลือก MySQL - กรอกรายละเอียดการเชื่อมต่อ เช่น Host:
localhost, Port:3306, User:root, Password:mysql@sitและกด Test Connection ให้ผ่าน
5. ตั้งค่าโครงสร้างโปรเจกต์ใน pom.xml
เปิดไฟล์ pom.xml แล้วทำการคัดลอกตัวจัดการ Dependencies ด้านล่างไปวางเขียนทับทั้งหมด:
...
<properties>
<maven.compiler.source>24</maven.compiler.source>
<maven.compiler.target>24</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Jakarta Persistence API (JPA) -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- Hibernate Core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.5.2.Final</version>
</dependency>
<!-- MySQL Connector J -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.4.0</version>
</dependency>
<!-- Lombok (Lombok 1.18.38 or higher is required for JDK 24 compatibility) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>24</source>
<target>24</target>
<!-- Lombok Annotation Processor is required for javac to generate getters/setters/builders -->
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
...
- คลิกขวาที่ไฟล์
pom.xml➡️ เลือกหัวข้อ Maven ➡️ คลิกที่ Reload Project (หรือ Sync Project) เพื่อให้ระบบทำการดาวน์โหลดและอัปเดตไลบรารีทั้งหมดให้เรียบร้อย
- ไปที่เมนู File ➡️ Project Structure ➡️ เลือกแถบ Modules
- หากยังไม่มี JPA ให้กดปุ่มเครื่องหมายบวก
+หรือเลือกโมดูลโปรเจกต์ของคุณแล้วกดเลือก Import "JPA" (หรือคลิกขวาที่โมดูล ➡️ Add ➡️ JPA) - ติ๊กเลือกประเภทตัวเลือก import "persistence.xml"
- ระบุพิกัดที่อยู่ไฟล์:
src\main\resources\META-INF\persistence.xmlจากนั้นกด OK
8. ตัวอย่างการสร้างการตั้งค่าใน persistence.xml
ตรวจสอบความถูกต้องหรือสร้างไฟล์ XML ไว้ที่ตำแหน่ง src/main/resources/META-INF/persistence.xml โดยกรอกโค้ดตั้งค่าฐานข้อมูลดังนี้:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
version="3.0">
<persistence-unit name="rename" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>org.example.entities.Actor</class>
<class>org.example.entities.Film</class>
<class>org.example.entities.AppSystemConfig</class>
<properties>
<!-- Database Connection Settings -->
<property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sakila"/>
<property name="jakarta.persistence.jdbc.user" value="root"/>
<property name="jakarta.persistence.jdbc.password" value="mysql@sit"/>
<!-- Hibernate Settings -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.highlight_sql" value="true"/>
<!-- JDBC Batch Settings -->
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
<!-- automatically create the app_system_config and course_enrollment tables -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>ทำตามขั้นตอนแบบ "จับมือทำ" ด้านล่างนี้ เมื่ออาจารย์สั่งให้ทำตารางข้อมูลใหม่ลงในโปรเจกต์:
หากอาจารย์ให้ Database ตัวใหม่ (เช่น ชื่อ university) ให้เข้าไปที่ไฟล์ persistence.xml แล้วปรับปรุง URL ตรงคอลัมน์ชื่อฐานข้อมูล:
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/university?..."/>คุณสามารถสร้างคลาส Entity จากตารางในฐานข้อมูลได้ง่ายๆ โดยใช้เครื่องมือของ IntelliJ IDEA ดังนี้:
- เปิดแถบเครื่องมือ Database ใน IntelliJ IDEA (อยู่ขวามือของโปรแกรม) และเชื่อมต่อไปยังฐานข้อมูลใหม่ของคุณ
- เข้าไปที่ตารางที่ต้องการสร้าง Entity ➡️ คลิกขวาที่ชื่อตาราง ➡️ คลิกเลือก Create Entities Attr from DB (หรือ Generate Persistence Mapping ➡️ By Database Schema)
- เลือกเซฟคลาส Java นั้นลงในแพ็กเกจ
org.example.entitiesตัวโปรแกรมจะสร้างคลาส Entity (เช่นStudent.java) พร้อมจับคู่ชนิดข้อมูล (Data Types) และใส่แอนโนเทชัน JPA ให้คุณโดยอัตโนมัติทันที - หลังจากคลาสถูกสร้างแล้ว แนะนำให้แปะแอนโนเทชันของ Lombok เพิ่มเติมบนหัวคลาสเพื่อความสะอาดและสะดวกในการเขียนโค้ด:
@Getter @Setter @ToString
เข้าไปที่ไฟล์ persistence.xml และระบุเส้นทางของคลาสใหม่ลงในส่วนรายชื่อ <class> เพื่อให้ระบบสแกนพบเมื่อแพ็คเกจโปรเจกต์:
<class>org.example.entities.Student</class>คุณสามารถก๊อปปี้เทมเพลตโค้ดของ Repository ตัวอื่น (เช่น ActorRepository.java) มาสร้างเป็นไฟล์ใหม่ชื่อ StudentRepository.java ได้เลย แต่มีข้อควรระวังสำคัญคือ:
- ระวังเรื่องชนิดข้อมูลของ ID: ตรวจเช็คให้ชนิดข้อมูลของ Primary Key (
IntegerหรือShort) ตรงกับที่ระบุในคลาส Entity (ในตัวอย่างนี้คือStudentและInteger) - ระวังเรื่องการ Import Entity: แก้ไขบรรทัด
importให้ชี้ไปยัง Entity ตัวใหม่ให้ถูกต้อง
โค้ดเทมเพลต:
package org.example.repositories;
import jakarta.persistence.EntityManager;
import org.example.entities.Student; // แก้ไขให้ชี้ไปยัง Entity ตัวใหม่
public class StudentRepository extends AbstractRepository<Student, Integer> { // ระบุ Entity และชนิดข้อมูลของคีย์หลัก (เช่น Integer)
public StudentRepository(EntityManager em) {
super(em);
}
}คุณสามารถก๊อปปี้เทมเพลตโค้ดของ Service ตัวอื่น (เช่น ActorService.java) มาสร้างเป็นไฟล์ใหม่ชื่อ StudentService.java ได้เช่นกัน แต่มีข้อควรระวังสำคัญคือ:
- ระวังเรื่องชนิดข้อมูลของ ID: ตรวจเช็คเมธอดค้นหาหรือลบด้วย ID ให้รับชนิดข้อมูลตามคีย์หลักของ Entity (เช่น
Integer) - ระวังเรื่องการ Import Entity & Repository: แก้ไขการ Import และการเรียกใช้ Repository ตัวใหม่ให้ถูกต้องตามชื่อคลาสที่สร้างขึ้นใหม่
โค้ดเทมเพลต:
package org.example.services;
import jakarta.persistence.EntityManager;
import org.example.entities.Student; // แก้ไขให้ชี้ไปยัง Entity ตัวใหม่
import org.example.repositories.StudentRepository; // แก้ไขให้ชี้ไปยัง Repository ตัวใหม่
import org.example.utils.JPAUtil;
import java.util.List;
public class StudentService {
private static final int BATCH_SIZE = 50;
public Student save(Student student) {
EntityManager em = JPAUtil.getEntityManager();
StudentRepository repository = new StudentRepository(em);
try {
return repository.save(student);
} finally {
em.close();
}
}
public List<Student> findAll() {
EntityManager em = JPAUtil.getEntityManager();
StudentRepository repository = new StudentRepository(em);
try {
return repository.findAll();
} finally {
em.close();
}
}
// (สามารถก๊อปปี้เมธอด findById, update, delete เพิ่มเติมจากเทมเพลตอื่นมาเขียนต่อได้)
}คุณสามารถเปิดไฟล์ Main.java แล้วทดลองประกาศตัวแปรของ Service ตัวใหม่ (เช่น StudentService) เพื่อสั่งรันทดสอบการทำงาน CRUD ของตารางใหม่ได้ทันทีเลยครับ
ใช้คำสั่งต่อไปนี้ใน Terminal เพื่อคอมไพล์และรันไฟล์หลัก (Main.java):
mvn clean compile exec:java "-Dexec.mainClass=org.example.Main"หรือรันผ่านปุ่ม Run บนคลาส Main ในโปรแกรม IntelliJ IDEA