iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
1

雖然標題是寫 Spring Data, 但其實底下細分很多套件如

  • Spring Data JPA
  • Spring Data Elasticsearch
  • Spring Data MongoDB
  • Spring Data Redis
  • Spring Data Hazelcast

上面大致列一下比較常聽到的,如果你想用的我沒列到可以去 Spring Data 官方網站 看看

透過 Spring Data 這個共用的架構,你可以在不同的資料庫跟 NoSQL 間用很相近的方式來開發, 不用像以前各種 NoSQL 各自的套件各種 API 都要看怎麼用, 是不是聽起來很不錯呢?

這篇還是先介紹一下 Spring Data JPA 怎麼用, 因為後面的範例都是用資料庫, 所以 NoSQL 的話也許之後再補

開始呢我們一樣可以到 http://start.spring.io/ 去勾選套件來產生初始專案
現在選這幾項 Lombok、Web、H2、JPA 就可以了
好了之後我們 dependencies 如下

dependencies {
	compile('org.springframework.boot:spring-boot-starter-data-jpa')
	compile('org.springframework.boot:spring-boot-starter-web')
	runtime('com.h2database:h2')
	compileOnly('org.projectlombok:lombok')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

然後把我們專案內的 application.properties 改名為 application.yml
application.yml 的內容如下

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1
    initialize: true
    sql-script-encoding: UTF-8

然後在 resources 建立 schema.sql 檔案 內容如下

DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
  `bookid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`bookid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

再建立一個 import.sql 用來做初始化測試用資料

INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (1, '億男', '川村元氣');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (2, '異境之書:安伯托‧艾可最後人文藝術巨作', '安伯托‧艾可');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (3, '窮查理的投資哲學與選股金律', '崔恩‧葛瑞芬');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (4, '演算法星球:七天導覽行程,一次弄懂演算法', '賽巴斯提安・史帝樂');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (5, '戴美樂小姐的婚禮', '王定國');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (6, '超級預測:洞悉思考的藝術與科學,在不確定的世界預見未來優勢', ' 菲利普.泰特洛克');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (7, '貓狗的逆襲:荊棘滿途的公民之路', '大衛‧葛林姆');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (8, '我還是想你,媽媽:101個失去童年的孩子', '斯維拉娜‧亞歷塞維奇');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (9, '咖啡的科學', '崔斯坦.史蒂文森');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (10, '被討厭的勇氣:自我啟發之父「阿德勒」的教導', '岸見一郎');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (11, '魔法精油寶典:102種植物香氣的能量運用', '史考特‧康寧罕');
INSERT INTO `book` (`bookid`, `name`, `author`) VALUES (12, '天生變態:一個擁有變態大腦的天才科學家', '詹姆斯‧法隆');

這樣一來 Spring 在啟動的時候會去幫我執行 schema.sql 的內容,
方便我們實驗的時候資料乾淨跟一直去管理 DB 的瑣碎事

接下來我們建立資料庫的實體物件
Book.java

package com.example.book;

import lombok.Data;

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

@Data
@Entity
public class Book {
    @Id
    @GeneratedValue
    private Integer bookid;
    private String name;
    private String author;
}

建立操作資料物件的 Repository
這個就是透過 Spring Data JPA 提供的功能, 我們不必真的寫一堆配置跟Dao物件就可以進行操作了

package com.example.book;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {
}

寫一個控制器來輸出資料庫的資料
BookController.java

package com.example.book;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping(value = "/api")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    @ResponseStatus(HttpStatus.OK)
    @GetMapping(value = "/v1/book", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public List<Book> getAll() {
        return bookRepository.findAll();
    }
}

好了之後呢, 我們測試一下可不可以取得資料

curl -X GET http://localhost:8080/api/v1/book

像下圖這樣可以取得資料表示資料庫跟JPA都正常工作啦
取得資料

這這樣子比起傳統光配置就要搞個一兩天真是方便太多啦

基本上只要不是太特殊的需求, Spring Data JPA 都可以滿足你的使用情境

其他 NoSQL 類的你可以大概參考一下我以前的文章範例
使用Spring-Boot整合Spring-Data操作ElasticSearch
SpringBoot Data Set Multiple MongoDB


上一篇
Day 02 - SpringBoot 起手式
下一篇
Day 04 - 增加 Rest Repositories 讓 Spring Data 直接升級為 RestAPI
系列文
30天從零開始 使用 Spring Boot 跟 Spring Cloud 建構完整微服務架構35

1 則留言

1
lemon0417
iT邦新手 4 級 ‧ 2017-12-20 18:00:19

使用Lombok 有個很重要的步驟:
必須為IDE安裝Plugin,不然compile後的程式一樣不會有那些自動產的setter/getter

以Intellij 為例
https://projectlombok.org/setup/intellij

Sam iT邦新手 5 級‧ 2017-12-20 18:03:04 檢舉

感謝補充, 用習慣就忘了他的存在了XD

我要留言

立即登入留言