เริ่มต้น Spring Boot part 5 สร้าง model class ด้วย JPA Hibernate

บทความที่ 5 แล้วสำหรับ Spring Boot แบบตั้งแต่พื้นฐาน

โดยวันนี้เราจะมาเริ่มเขียน Spring boot ติดต่อฐานข้อมูลกันบ้างโดยใช้ library spring-boot-starter-data-jpa ที่ทำให้การเขียนคำสั่งเพื่อใช้งาน JPA ทำได้โดยง่าย แทบไม่ต้อง config อะไรเลย

โดยเนื้อหาในวันนี้แบ่งเป็นดังนี้ครับ

  • ติดตั้ง library spring-boot-starter-data-jpa และ mysql-connector-java เข้าไปใน project
  • แก้ไข config file แก้ไขค่า connection string กับ database
  • สร้าง entity class

เรามาเริ่มกันเลยครับ

ติดตั้ง library spring-boot-starter-data-jpa และ mysql-connector-java เข้าไปใน project

เปิด project Spring Clinic ที่เราได้สร้างไว้แล้ว เปิด file build.gradle แก้ไขส่วนของ dependencies โดยเพิ่ม library spring-boot-starter-data-jpa และ mysql-connector-java เข้าไป

  • spring-boot-starter-data-jpa เป็น library สำหรับใช้งาน JPA Hibernate ทีช่วยให้เราเขียนคำสั่งใช้งาน database แนว OOP รวมตัว ORMซึ่งก็คือ Hibernate เข้าไปแล้วด้วยครับ แต่ API ที่เรียกใช้ไม่ได้ผ่าน Hibernate ตรงๆ ผ่าน JPA ที่ถูกสร้างขึ้นมาให้เป็นมาตรฐานกลางของแต่ละค่าย
  • mysql-connector-java เป็น library สำหรับเขียนคำสั่งฐานข้อมูลแบบ low level พื้นฐานของ Java ถ้าไม่ต้องการใช้ ORM ใช้แต่ตัวนี้ก็พอครับ แต่ต้องเขียน commend SQL กันเอง ต่างกับ ORM ที่ช่วยให้เราแทบไม่ต้องเขียน SQL เองเลย

build.gradle ที่แก้ไขแล้วจะเป็นดังนี้ครับ

group 'com.codesanook.springclinic'
version '1.0-SNAPSHOT'


buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE")
    }

}


apply plugin: 'java'
apply plugin: 'spring-boot'

sourceCompatibility = 1.7

repositories {
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.3.2.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf:1.3.2.RELEASE")
    compile('net.sourceforge.nekohtml:nekohtml:1.9.22')
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.3.2.RELEASE")
    compile('mysql:mysql-connector-java:5.1.36')
}

แก้ไข config file แก้ไขค่า connection string กับ database

ในส่วนนี้ เราจะเก็บค่า connection ต่างๆ ของ database ไว้ใน application.properties ซึ่งเป็น configuration file ของ Spring Boot

เครื่องของผู้อ่านจำเป็นต้องมี MySQL Server ติดตั้งไว้ ถ้ายังไม่มีแนะนำให้ไปโหลดฟรีมาติดตั้งนะครับ แล้วสร้าง database เปล่าๆ ขึ้นมา ชื่อว่า spring-clinic

เมื่อมี MySQL Server ติดตั้งไว้ในเครื่องแล้ว ให้เปิด file application.properties เพิ่ม config เชื่อมต่อ database ต่างๆ ดังนี้

** \src\main\resources\spring.properties **

spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.cache=false

#database name is spring-clinic
spring.datasource.url = jdbc:mysql://localhost:3306/spring-clinic
spring.datasource.username = root
spring.datasource.password = 12345

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

username,password, server url, port อาจต่างกันในแต่ละเครื่อง ถ้ามีปัญหาในการเชื่อมต่อ database ลองตรวจสอบส่วนนี้ด้วยนะครับ

สร้าง entity class

entity class เป็น class ที่เป็นตัวแทนของ database table ใช้เก็บข้อมูลต่างๆ ที่ดึงมาจาก database ดังนั้นโดยทั่วไป โครงสร้างของ entity class จะคล้ายกับ database table แต่ไม่จำเป็นต้องเหมือนกันก็ไปทั้งหมดก็ได้

entity class ยังเปรียบเหมือน model ใน MVC pattern model คือส่วนที่เก็บข้อมูลของ application

1 instance ของ entity class ยังสามารถเปรียบได้กับ 1 row ของ database table

เนื่องจาก spring-clinic ที่เรากำลังสร้างอยู่นั้นเป็น project สำหรับเก็บข้อมูลผู้ป่วยในคลินิกขนาดเล็ก ดังนั้น entity class หรือ model ที่สำคัญก็คือ class ที่เก็บข้อมูลป่วย โดยเราจะสร้าง Patient class ขึ้นมา แต่เป็น version ง่ายๆ แล้วจะเพิ่มเติมรายละเอียดอื่นๆ ในครั้งต่อไป

สร้าง class Patient.java ใน package model แล้วแก้ไขข้อมูลเป็นดังนี้

package com.codesanook.springclinic.model;
import javax.persistence.*;

@Entity
@Table(name = "patients")
public class Patient {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int hospitalNumber;

    private String firstName;
    private String lastName;

    public int getHospitalNumber() {
        return hospitalNumber;
    }

    public void setHospitalNo(int hospitalNumber) {
        this.hospitalNumber = hospitalNumber;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

อธิบาย annotation ต่างๆ

  • @Entity บอกว่า class นี้เป็น entity class
  • @Table(name = "patients") เป็นการ map class นี้กับ table ที่ชื่อว่า patients
  • @Id และ @GeneratedValue(strategy = GenerationType.IDENTITY) ระบุว่า field นั้นเป็น id ของ table และให้ id ทำการเพิ่มข้อมูลโดยอัตโนมัติ auto increment โดย database server เพิ่มค่า id ทีละหนึ่ง
  • สำหรับ field อื่นๆ ที่อยู่ใน class ซึ่งก็คือ firstName และ lastName จะถูก map เข้ากับ field หรือ column ใน database โดยอัตโนมัติ

** entity class ที่เราสร้างขึ้นมา บวกกับ config spring.jpa.hibernate.ddl-auto = update เมื่อเรา run Spring Boot web ขึ้นมาจะทำการสร้าง table Patient ให้โดยอัตโนมัติ และถ้ามีการเพิ่ม field ใน Patient.java ก็จะมีการเพิ่ม field ใน database ให้ด้วย **

ในบทความนี้เราได้ทำการติดตั้ง library ต่างๆ ที่จำเป็น เตรียม entity class ไว้ใช้งานแล้วในตอนต่อไป เราจะได้มาใช้งาน entity class ที่สร้างไว้แล้วครับ

download source code

https://github.com/codesanook/spring-clinic