[Spring Boot] การเชื่อมต่อ database ด้วย Spring data JPA

JPA คืออะไร

ก่อนอื่นก็ต้องมาพูดถึงไอ่เจ้าตัว JPA ก่อนเลยว่ามันคืออะไร มีไว้ทำอะไร

JPA เป็นมาตรฐานหรือแนวทางในการทำ ORM (Object Relational Mapping) เช่น เคยเห็นพวก class java ของเราใช่มะ คือ JPA อ่ะ จะเป็นตัวบอกว่าเราจะต้องทำยังไงบ้างเพื่อที่จะเชื่อมต่อ java class ให้ไปเป็น table หรือ column ที่อยู่ใน database ของเรา

โดยส่วนใหญ่ใน spring เนี่ย มันจะมีสิ่งที่เรียกว่า Hibernate ให้ใช้อยู่ และ Hibernate ได้ทำการ implement ตาม JPA ไว้เรียบร้อยแล้ว

การดำเนินการเชื่อมต่อข้อมูลกับ database

  1. เพิ่ม JPA module ไว้ในโปรเจคของเราก่อน โดยการใส่โค้ดด้านล่างไว้ใน pom.xml ของโปรเจคภายใต้ tag <dependencies>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2. เพิ่ม module ของ database ที่ต้องการเชื่อมต่อลงใน pom.xml ภายใต้ tag <dependencies> ตัวอย่างเช่น

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

3. ตั้งค่ารายละเอียดการเชื่อมต่อ database (DataSource) ในไฟล์ application.propperties ตัวอย่างเช่น

#-------------------------------------------------------------------#
# Database connection                                               #
#-------------------------------------------------------------------#
## Connection url for the database test
spring.datasource.url = jdbc:mysql://ztidev.com:3306/cgd_eacc?autoReconnect=true&useSSL=true&characterEncoding=UTF-8&characterSetResults=UTF-8

## Username and password
spring.datasource.username = root
spring.datasource.password = ZTIDEV*******

เริ่มต้นสร้าง Entity

ตามการวางโครงสร้าง Project สร้าง Class ของโครงสร้างข้อมูล (Entity) ใน package entity โดยที่เราต้องบอก spring สักหน่อยว่าเป็น Entity Class ด้วยการใส่ annotation @Entity ดังตัวอย่าง

package com.zti.cgd.superproject.entity;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Getter
@Setter
public class MProvince {

    @Id @GeneratedValue(strategy= GenerationType.IDENTITY)
    private String provinceId;
    private String province;


}

*ปกติต้องสร้าง getter setter method ของฟิลด์ที่ถูก encapsulated แต่เพื่อความสะดวกสามารถใช้ @Getter @Setter ได้เช่นเดียวกัน

เห็นว่าจะมีการใส่ Annotation @Id เข้าไปด้วย และตัว Id นี่แหล่ะจะเป็นส่วนที่บอกว่า field ไหนเป็น Primary Key ของเรา ส่วน @GeneratedValue เนี่ย ก็เป็นเหมือนการบอก spring ว่า ในdatabase อ่ะ column เนี้ย ขอเป็น auto-increment อะไรแบบนี้นะ

นอกจากนี้เราสามารถสร้าง Entity Class โดยการ generate อัตโนมัติได้โดยวิธีดังต่อไปนี้

Generate Entity จาก Data Source

  1. เพิ่ม Data Source โดยเปิด Database Panel แล้วคลิ๊กปุ่ม + ที่มุมบนซ้ายของแผงเมนู
  2. เลือกเมนู Data Source และเลือกประเภท database ที่ต้องการเชื่อมต่อ
  3. กรอกข้อมูลรายละเอียด database และสามารถกด Test Connection เพื่อทดสอบการเชื่อมต่อ จากนั้นกดปุ่ม OK
    *กรณีไม่มี driver กดโหลดได้เลย
  4. เปิด Persistence Panel จากนั้นคลิกเปิดขยาย แล้วคลิ๊กขวาที่ entityManagerFactory แล้วเลือก Assign Data Sources
  5. เลือก Data Source ที่สร้าง แล้วกด OK
  6. เปิด Persistence Panel จากนั้นคลิ๊กขวาที่ชื่อ Project แล้วเลือก Generate Persistence Mapping > By Database Schema
  7. เลือก Data Source เลือก package entity แล้วเลือกตารางที่ต้องการ generate ติ๊ก Add to Persistence Unit ออก แล้วกด OK และกด Yes ใน  popup OR mapping

สร้าง Repository

สร้าง package repository และสร้าง interface ของข้อมูลที่ต้องการ โดย extends JpaRepository หรือ CrudRepository แล้วก็เพิ่ม annotation @Repository บน class โดยเบื้องต้นไม่ต้อง implement method ใดๆ เพิ่มก็ได้ เนื่องจากว่าเนื้อโค้ดที่จะใช้ในการทำ action กับ database เนี่ยมันถูก implement ไว้ให้ใน JpaRepository อยู่แล้ว ตัวอย่างเช่น

package com.zti.cgd.superproject.repository;

import com.zti.cgd.superproject.entity.MProvince;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MProvinceRepository extends JpaRepository<MProvince, String> {
}

จุดสำคัญก็คือ extends JpaRepository<MProvice, String> สังเกตว่าตามหลัง JpaRepository มี MProvice กับ String แล้วสองตัวนี้คืออะไรล่ะ

  • MProvice นั้นหมายถึง Entity ของเรา เราใช้ Entity ชื่ออะไรก็ใส่เป็นชื่อนั้นแหล่ะครับ
  • String คือ Data type ของ Primary Key ของตัวแปร Entity นั้นๆ ซึ่งของเราเป็น String นั่นเองครับ

Method ที่ JpaRepository ได้ implement ให้เรามาแล้วเนี่ย ลอง Google ตามชื่อ Interface ดูได้เลยว่าใช้อะไรได้บ้าง

 

#จบเท่านี้ก่อน ตอนนี้เราก็ได้ Entity และ Repository ที่พร้อมจะเอาไป Inject เพื่อใช้งานแล้ว ไว้มาดูการใช้งาน Repository ใน part ต่อไปจ้า

Reference:

https://medium.com/grean-developers-family/%E0%B9%80%E0%B8%8A%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%A1%E0%B8%95%E0%B9%88%E0%B8%AD-spring-boot-application-%E0%B8%81%E0%B8%B1%E0%B8%9A-database-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-jpa-hibernate-22c038cf972d