Skip to content

AUUNNG/Java-Exam

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java JPA Lab Project (Standalone CRUD, Batching & JPA Joins)

โปรเจกต์นี้เป็นแอปพลิเคชันรูปแบบ Standalone Java SE พัฒนาด้วยเทคโนโลยี JPA (Jakarta Persistence API) ร่วมกับ Hibernate (ORM), MySQL Connector และ Lombok เพื่อเรียนรู้สถาปัตยกรรมการวางเลเยอร์ของระบบฐานข้อมูล (Clean Layer Architecture) และเทคนิคขั้นสูงในระดับองค์กร


🏗️ โครงสร้างสถาปัตยกรรม (Project Structure)

โปรเจกต์นี้ถูกออกแบบเป็น 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

⚙️ ข้อมูลการตั้งค่าระบบ (Configuration Files)

📦 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 = 50
    • hibernate.order_inserts / hibernate.order_updates = true

🛠️ คู่มือการตั้งค่าโปรเจกต์ใหม่ตั้งแต่เริ่มต้น (Fresh Setup Guide)

สำหรับผู้ที่ต้องการเริ่มต้นตั้งค่าเครื่องคอมพิวเตอร์ใหม่ หรือต้องการ Setup สภาพแวดล้อมระบบตั้งแต่แรกเริ่ม สามารถทำตามขั้นตอนต่อไปนี้ได้ทันที:

1. เปิดโปรแกรม IntelliJ IDEA

เปิดคอมพิวเตอร์และเข้าโปรแกรม IntelliJ IDEA และทำการเปิดโฟลเดอร์โปรเจกต์ขึ้นมา

2. ลงทะเบียนเปิดใช้งานด้วย License Server สถาบัน

  • ไปที่แถบเมนูด้านบนเลือก Help ➡️ คลิกที่ Manage Licenses... (หรือ Register...)
  • เลือกหัวข้อลงทะเบียนแบบ License Server
  • กรอกที่อยู่เซิร์ฟเวอร์สำหรับสิทธิ์ใช้งาน:
    https://sit.fls.jetbrains.com
    
  • คลิกกด Login และลงชื่อเข้าใช้งานด้วยบัญชีนักศึกษา: @ad.sit.kmutt.ac.th

3. ติดตั้งปลั๊กอินเสริมที่จำเป็น (Plugins Setup)

  • ไปที่เมนู File ➡️ Settings (สำหรับ macOS: IntelliJ IDEA ➡️ Settings) ➡️ เลือกแถบ Plugins
  • ไปที่แท็บ Marketplace ค้นหาและกดติดตั้ง (Install) ปลั๊กอินต่อไปนี้:
    1. Jakarta EE
    2. Hibernate

4. เชื่อมต่อระบบฐานข้อมูล (Database Connection)

  • เปิดหน้าต่างเครื่องมือ 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>

...

6. อัปเดตและดาวน์โหลดทรัพยากร (Maven Sync)

  • คลิกขวาที่ไฟล์ pom.xml ➡️ เลือกหัวข้อ Maven ➡️ คลิกที่ Reload Project (หรือ Sync Project) เพื่อให้ระบบทำการดาวน์โหลดและอัปเดตไลบรารีทั้งหมดให้เรียบร้อย

7. โหลดโมดูลการตั้งค่าของ JPA (JPA Facet Setup)

  • ไปที่เมนู 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>

💡 คู่มือทีละขั้นตอน: เมื่อได้รับตาราง DB ใหม่และต้องการสร้าง Entity เอง (Step-by-Step Guide)

ทำตามขั้นตอนแบบ "จับมือทำ" ด้านล่างนี้ เมื่ออาจารย์สั่งให้ทำตารางข้อมูลใหม่ลงในโปรเจกต์:

1️⃣ ขั้นที่ 1: ตรวจเช็คการเชื่อมต่อ Database ใน persistence.xml

หากอาจารย์ให้ Database ตัวใหม่ (เช่น ชื่อ university) ให้เข้าไปที่ไฟล์ persistence.xml แล้วปรับปรุง URL ตรงคอลัมน์ชื่อฐานข้อมูล:

<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/university?..."/>

2️⃣ ขั้นที่ 2: สร้างคลาส Entity (ในโฟลเดอร์ entities)

คุณสามารถสร้างคลาส Entity จากตารางในฐานข้อมูลได้ง่ายๆ โดยใช้เครื่องมือของ IntelliJ IDEA ดังนี้:

  1. เปิดแถบเครื่องมือ Database ใน IntelliJ IDEA (อยู่ขวามือของโปรแกรม) และเชื่อมต่อไปยังฐานข้อมูลใหม่ของคุณ
  2. เข้าไปที่ตารางที่ต้องการสร้าง Entity ➡️ คลิกขวาที่ชื่อตาราง ➡️ คลิกเลือก Create Entities Attr from DB (หรือ Generate Persistence Mapping ➡️ By Database Schema)
  3. เลือกเซฟคลาส Java นั้นลงในแพ็กเกจ org.example.entities ตัวโปรแกรมจะสร้างคลาส Entity (เช่น Student.java) พร้อมจับคู่ชนิดข้อมูล (Data Types) และใส่แอนโนเทชัน JPA ให้คุณโดยอัตโนมัติทันที
  4. หลังจากคลาสถูกสร้างแล้ว แนะนำให้แปะแอนโนเทชันของ Lombok เพิ่มเติมบนหัวคลาสเพื่อความสะอาดและสะดวกในการเขียนโค้ด:
    @Getter
    @Setter
    @ToString

3️⃣ ขั้นที่ 3: ลงทะเบียนคลาสใหม่ใน persistence.xml

เข้าไปที่ไฟล์ persistence.xml และระบุเส้นทางของคลาสใหม่ลงในส่วนรายชื่อ <class> เพื่อให้ระบบสแกนพบเมื่อแพ็คเกจโปรเจกต์:

<class>org.example.entities.Student</class>

4️⃣ ขั้นที่ 4: สร้างคลาส Repository (ในโฟลเดอร์ repositories)

คุณสามารถก๊อปปี้เทมเพลตโค้ดของ 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);
    }
}

5️⃣ ขั้นที่ 5: สร้างคลาส Service (ในโฟลเดอร์ services)

คุณสามารถก๊อปปี้เทมเพลตโค้ดของ 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 เพิ่มเติมจากเทมเพลตอื่นมาเขียนต่อได้)
}

6️⃣ ขั้นที่ 6: เรียกใช้งานผ่าน Main.java

คุณสามารถเปิดไฟล์ Main.java แล้วทดลองประกาศตัวแปรของ Service ตัวใหม่ (เช่น StudentService) เพื่อสั่งรันทดสอบการทำงาน CRUD ของตารางใหม่ได้ทันทีเลยครับ


🛠️ วิธีการรันและทดสอบระบบ

ใช้คำสั่งต่อไปนี้ใน Terminal เพื่อคอมไพล์และรันไฟล์หลัก (Main.java):

mvn clean compile exec:java "-Dexec.mainClass=org.example.Main"

หรือรันผ่านปุ่ม Run บนคลาส Main ในโปรแกรม IntelliJ IDEA

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors