Spring Boot with Oracle DB

Phai Panda
5 min readJun 27, 2019

--

หลังจากได้ติดตั้ง Oracle Database เป็นที่เรียบร้อยแล้ว หนนี้เราจะใช้ Spring Boot JPA มาเชื่อมต่อเพื่อทดสอบเรียกและบันทึกข้อมูลกันครับ

ใครที่ยังไม่ได้อ่านบทความของผมเกี่ยวกับการติดตั้ง Oracle DB ด้วย Docker เชิญตรงนี้

ความจริงตัวอย่างการเชื่อมต่อและใช้งานผ่าน Spring Boot JPA มีเยอะครับ ผมก็ไปอ่านมา (พอสมควร) จึงอยากนำมาเล่าในแบบฉบับของตนเองอย่างเคยๆ

เราต้องมีเครื่องมือใดบ้าง
- IntelliJ เวอร์ชัน community
- Java JDK เวอร์ชัน 1.8
- พื้นฐาน Gradle (หรือ Maven ก็ได้)

ผมจะใช้ Gradle สร้างโปรเจกต์ดังตัวอย่างนี้ครับ

กดเมนู File > New > Project …

คอยให้ Gradle มันเตรียมโปรเจกต์ให้ก่อนนะ

ระหว่างคอยผมขอไปดู SQL Developer หน่อย ผมสร้าง connection ชื่อ system ไว้ดังนี้

อย่างแรกเลยหลังจากเชื่อมต่อเข้าไปแล้ว ผมซึ่งในตอนนี้คือ SYSTEM มีสิทธิ์ที่จะเปลี่ยน password ได้ เดิมของผมคือ Xg8aKBTbZrA=1 (จำไม่ได้) ผมอยากเปลี่ยนเป็น Passw@rd1234

ผมจึงเขียนคำสั่งเปลี่ยน password ดังนี้

alter user system identified by "Passw@rd1234";

คราวนี้กลับมาที่ IntelliJ เริ่มสร้างคลาส Application.java ก่อน แล้ว say Hello

กดปุ่มลูกศรสีเขียวมันต้องรันได้ปกติ

ขั้นตอนต่อไปเราจะหยิบ Spring Boot JAP มาแปะครับ การแปะนี้ให้วางไว้ในไฟล์ชื่อ build.gradle รอช้าใยล่ะ จัดเลย

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

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group 'com.pros'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
testCompile group: 'junit', name: 'junit', version: '4.12'
}

รอจนกว่า Gradle จะทำงานเสร็จด้วยนะ…​รอ รอ รอ

จากนั้นกลับไปแก้ไข Applicaton.java ณ นาทีนี้ผมอยากให้เพื่อนๆมือใหม่คอยบรรจงพิมพ์ด้วยตนเองก่อนนะครับ หากทุกอย่างถูกต้อง IntelliJ ต้องรู้จัก Spring Boot แล้ว (ง่ายๆว่า IntelliJ ไม่มี error เกิดขึ้น)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}

ทว่าเพื่อนๆไปกดปุ่ม Run (ลูกศรสีเขียว) มันจะได้ runtime error แบบนี้

Application run failedorg.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [Application]; nested exception is java.io.FileNotFoundException: class path resource...

เหตุผลคือเจ้าคลาส Application ของเราไม่มีคอก ฟังไม่ผิดครับ มันไม่มีคอก! เราต้องสร้าง package ซึ่งเป็นเสมือนคอก (สัตว์) ให้กับมัน

ผมตั้งชื่อ package นี้ว่า com.pros
จากนั้นจึงจับคลาส Application ยัดเข้าไป

รันใหม่อีกครั้งครับ…
คราวนี้เพราะเราบอกว่าจะใช้ spring-boot-starter-data-jpa (ในไฟล์ build.gradle) ผลลัพธ์ที่ได้มันแจ้งมาว่า

***************************
APPLICATION FAILED TO START
***************************
Description:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active)

คือมันอยากได้ datasource หรือก็คือหนทางที่มันจะได้ติดต่อกับ database นั่นแหละ การณ์นี้ Spring Boot ก็มีหนทางให้ คือให้ไปบอกไว้ในไฟล์ชื่อ application.properties ในเมื่อเรายังไม่มีก็ให้ไปสร้างไว้ที่ src/main/resources

เมื่อสร้างไฟล์นี้แล้วก็ให้กำหนดค่าในการเชื่อมต่อลงไป

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=SYSTEM
spring.datasource.password=Passw@rd1234
spring.datasource.driver-class-oracle.jdbc.driver.OracleDriver

บรรทัดแรกสุดเราเรียกว่า connection string ของผม SID ชื่อ orcl
ถัดมาคือ username ถัดมาก็ password สองอย่างนี้รู้กัน
บรรทัดสุดท้ายคือ driver หรือตัวกลางระหว่าง Oracle Database คุยกับ Java

หากสงสัยหรือถามว่ารู้ได้อย่างไร จริงๆแล้ว oracle เขามีเอกสารอธิบายเรื่องเหล่านี้แยกเป็นเวอร์ชันไป (ด้านล่างนี้คือเอกสารเวอร์ชัน 12.1)

กลับมากดปุ่มรันกันอีกครั้ง กดปุ๊บมันจะแจ้งแบบนี้ครับ

***************************
APPLICATION FAILED TO START
***************************
Description:Failed to bind properties under '' to com.zaxxer.hikari.HikariDataSource:Property: driverclassname
Value: oracle.jdbc.OracleDriver
Origin: "driverClassName" from property source "source"
Reason: Failed to load driver class oracle.jdbc.OracleDriver in either of HikariConfig class loader or Thread context classloader

นี่เพราะว่ามันหา (Java) Oracle Driver ไม่เจอ

google ค้นหา
oracle jdbc driver download

เลือกหน้าผลลัพธ์ค้นหาที่ตรงกับ Oracle Database เวอร์ชันที่เราเลือก ในที่นี้คือ

เขาบอกว่า ojdbc7.jar ทำงานได้กับ JDK 8 (เวอร์ชัน 1.8)

ดังนั้นโหลด ojdbc7.jar

เมื่อโหลดมาแล้วให้ย้าย ojdbc7.jar ที่ได้ไปวางไว้ในโปรเจกต์

อดทนอีกนิด เราต้องให้รายละเอียดของ ojdbc7.jar กับ Gradle ด้วย เดี๋ยวบอกเหตุผลให้ทีหลัง

google ค้นว่า
ojdbc 7 maven

กดเข้าไปเลยสิ

ได้รายละเอียดมาแล้ว จึงกลับไปบอกกับ build.gradle

ภายหลัง Gradle ได้พยายามหา ojdbc7 จาก maven repository (maven central) ข้างต้น แต่กลับหาไม่เจอ มันฟ้องว่า unable to resolve คือจัดการหามาให้ไม่ได้ ?

ยังไม่ต้องงง เพราะนี่คือทางแก้ไข

ทางแก้ไข กูรูหลายท่านถามว่า เครื่องได้ติดตั้ง maven ไว้แล้วใช่ไหม ถ้ามีแล้วก็ใช้ maven นี่แหละจัดเก็บ ​ojdbc7.jar นี้ไว้ใน .m2 ซึ่งเป็น local repository ของเครื่องเราเองก่อน จากนั้นค่อยให้ Gradle ไปหยิบเอาอีกต่อหนึ่ง

1.ใช้ maven นี่แหละจัดเก็บ ​ojdbc7.jar นี้ไว้ใน .m2 ซึ่งเป็น local repository ของเครื่องเราเองก่อน ให้เปิด Terminal แล้ว cd เข้าไปในโปรเจกต์ (หรือใช้ Terminal ที่ติดมากับ IntelliJ ก็ได้) ซัดเลย

mvn install:install-file -Dfile=ojdbc7.jar -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar

2.จากนั้นค่อยให้ Gradle ไปหยิบเอาอีกต่อหนึ่ง ขั้นตอนนี้ให้เปิดไฟล์ build.gradle แล้วเพิ่ม mavenLocal() เข้าไป (เป็นการบอกกับ Gradle ว่าให้หาที่เครื่องเรานี่ด้วยนะเออ เออ!มีอย่างนี้ด้วย)

repositories {
mavenLocal()
}

บูชายันเสร็จสิ้น จึงลบ ojdbc7.jar ที่อยู่ภายในโปรเจกต์นี้ทิ้งได้ แต่ถ้าไปรันโปรเจกต์นี้ที่เครื่องอื่น อื่ม… copy เจ้า ojdbc7.jar นี่ไปด้วยแล้วกัน จะได้ไม่ต้องไปโหลดมาใหม่

กดปุ่ม Run!

สำเร็จ! ปาดเหงื่อ

เป็นว่าก็สามารถเชื่อมต่อ Oracle Database ด้วย Spring Boot JPA ได้เป็นผลสำเร็จนะครับ

โอกาสต่อไปผมจะสร้าง RESTful API ด้วย Spring Boot Web แล้วให้เรียกไปที่ JPA เพื่อควบคุมการสร้างหรือทำลายหรือปรับปรุงฐานข้อมูลนี้ต่อไป สวัสดีจ้า

--

--

No responses yet