Spring Data JPA

Tawee Taenkam
blog blog
Published in
3 min readMay 7, 2019

ก่อนที่เราจะมาเรียนรู้เรื่อง Spring Data JPA เราควรจะรู้เรื่อง JPA ก่อนว่ามันคืออะไร แล้วเอาไว้ทำอะไร ซึ่งผมจะอะธิบายไว้คร่าวๆ ดังนี้

JPA คืออะไร?

JPA ย่อมาจาก Java Persistence API เป็น Java API ตัวหนึ่งที่ทำหน้าที่ Map ข้อมูลจาก Database ให้อยู่ในรูปของ Object ในภาษา Java ช่วยลดภาระการเขียนโค้ดและทำให้การจัดการกับข้อมูล Database มีประสิทธิภาพมากขึ้น ซึ่ง JPA เป็นทางเชื่อมระหว่าง Object Model กับ Relation Model นั่นเอง

ความสามารถของ JPA คือการดึงข้อมูลจาก Database แล้วแปลงให้เป็น Object ของภาษา Java และสามารถแปลง Object ของภาษา Java ให้กลายเป็นข้อมูล Database ได้ ซึ่งตรงนี้ถือเป็นข้อดีของ JPA ที่โปรแกรมเมอร์ไม่ต้องเขียน Query Statement ก็สามารถจัดการกับข้อมูลได้แบบชิวๆ ยิ่งถ้าอาศัยความสามารถของ IDE แล้วละก็ Generate แปปเดียวก็สั่งได้เลย

อยากใช้ JPA ต้องทำยังไง

เนื่องด้วย JPA เป็น API (Application Programming Interface) ซึ่ง Inteface เนี่ยมันยังไม่พร้อมใช้งานนะ! ต้อง implement เสียก่อน เพราะฉะนั้นถ้าเราอยากลองใช้ เอาที่สบายใจเลยก็คือไปหา Provider แจ่มๆมาซักตัว ปัจจุบันก็มี Provider นำไป implement เยอะแยะมากมาย เช่น Hibernate, Eclipselink, Spring Data JPA เป็นต้น แต่ละตัวก็มีข้อดีข้อเสียแตกต่างกันไปเป็นธรรมดา ยังไงก็ลองศึกษาแล้วเลือกให้เหมาะสมกับงานนะครับ

Spring Data JPA

ถ้าเราต้องการเรียกใช้งาน spring data jpa เราต้องเรียกผ่าน Query method interface ที่ JPA implement มาให้เรา ตัวอย่างเช่นการดึงข้อมูล findByFirstnameOrderByCreateDateDesc หมายถึงดึงข้อมูลจาก Column Name = firstname โดยดึงมาแล้วเรียงด้วย CreateDate แบบ Desc

ชึ่งการทำงานของมันก็จะเป็นดังนี้เมื่อเทียบกับ Query SQL

  • find = คือการค้นหาข้อมูลคล้ายกับการ select ของใน Database
  • By = คือการกรองข้อมูลที่ต้องการคล้ายกับการ where ของใน Database
  • OrderBy…Asc, OrderBy…Desc = คือการเรียงลำดับข้อมูลคล้ายกับการ order by ของใน Database

ข้อดีของมันคือเราสามารถเขียนเป็นภาษาคนในการดึงข้อมูลได้เลย และตัวมัน provide interface หลายๆ อย่างให้พอสมควร ทำให้ง่ายต่อการเรียกใช้การ

เริ่มต้นใช้ Spring Data JPA

เราจะใช้ Spring Initializr ในการสร้างโปรเจกของเรา ทำการสร้าง project และเลือก dependencies ดังนี้

  • Web เป็น Starter dependency ในการสร้าง web โดยประกอบไปด้วย RESTful, Spring MVC และ embedded tomcat by default
  • JPA (Java Persistence API)
  • H2 เราจะใช้ H2 ซึ่งเป็น in memory database
  • Lombok ซึ่งเป็น annotation processing ช่วยในการทำ code generation เช่นลดการสร้าง Getter Setter โดยการ add annotation เข้าไปแทน

เลือก dependencies เสร็จแล้วก็กดปุ่ม Generate Project ได้เลย

Spring Initializr ก็จะโหลดไฟล์มาให้เราประมาณนี้

เสร็จแล้วก็เอาไฟล์เข้าไปใน Project ของเราได้เลยที่นี้เราก็จะใช้งาน Spring Data JPA ได้แล้ว

ซึ่งในไฟล์ Spring Initializr ที่ Generate มาให้เราจะ include dependencies ให้เราตามที่เราได้เลือกไว้แล้วดังนี้

dependencies

Config Port

ทำการแก้ไข Port ใหม่ไปที่ 9090

Person Entity

ทำการสร้าง class Person และเพิ่ม JPA annotations ดังนี้

  • @Entity เป็นการกำหนดให้ class เป็น entity
  • @Id เป็นการกำหนด primary key ของ entity
  • @GeneratedValue เป็นการบอกให้ทำการ generation values สำหรับ primary key โดย GenerationType.AUTO หมายถึงเวลา inert ข้อมูลใหม่ระบบจะ generate id ให้อัตโนมัติ
  • @Column ในที่นี้ใช้ในการกำหนดชื่อของ Column ใน tables ของเรา
  • @Getter @Setter เป็นการกำหนดให้มี get set โดยที่เราไม่ต้องสร้างเอง dependencies Lombok เป็นตัวจัดการให้เราเอง

MemberRepo

จากนั้นทำการสร้าง PersonRepository ดังนี้

  • findByFirstName => …where firstname=?1
  • findByLastName => …where lastname=?1
  • findByFirstNameOrLastName => …where firstname=?1 or lastname=?2
  • findByFirstNameOrLastName => …where firstname=?1 and lastname=?2

DemoApplication เพิ่ม CommandLineRunner

ด้านล่างเป็น Code ง่ายๆที่ใช้ CommandLineRunner ซึ่ง Bean ที่ใช้ CommandLineRunner จะทำงานทันทีหลังจากที่ Spring application context ทำการ initialized เสร็จเรียบร้อยแล้ว เราทำการสร้าง bean ใช้ CommandLineRunner และทำการ Save Data ลง DB เพื่อให้มีข้อมูลในการเรียกดู

MainController

ทำการสร้าง MainController เพื่อให้เรียกใช้งานเว็บผ่าน Rest api ได้

ชึ่งจะมี Method ให้เรียกใช้เรียกดังนี้

  • home() สำหรับการเข้าหน้าแรกของเว็บว่าจะให้แสดงอะไรบ้าง
  • showAllPerson() สำหรับแสดงข้อมูล Person ทั้งหมดใน DB
  • searchPerson() สำหรับการค้นหา FirstName=’David’ หรือ LastName=’David’
  • insertPerson() สำหรับการ insert Person Name = ‘Kim Jisoo’ เข้าไป
  • deletePerson() สำหรับการ delete Person Name = ‘Jack Bauer’ ออกไป

ทดสอบใช้งาน

ทำการ run application ระบบจะ print ข้อมูล Person ที่เรา initial ไว้จาก Method CommandLineRunner ใน Class DemoApplication

เข้าหน้าเว็บผ่าน link => http://localhost:9090/

สามารถ Download Code จากที่นี่มาลองใช้งานได้เลย

Link : https://github.com/tawee-taenkam/spring-data-jpa

--

--