網頁

2019/8/21

Spring Boot 2 + Spring Data MongoDB + MongoDB 簡單範例

本篇說明如何在Windows 7建立Spring BootSpring Data MongoDBMongoDB資料庫進行基本操作的專案。

本範例的環境如下。

  • Windows 64 Bit
  • JDK 1.8.0_171
  • Eclipse 2019-03 (4.11.0)
  • MongoDB 4.0.11
  • Spring Boot 2.1.7.RELEASE

MongoDB的安裝請參考Windows MongoDB 下載與安裝教學

MongoDB安裝好後,新增一個資料庫mydb,並在mydb建立一個Collection customers



customers新增一筆資料如下,這是待會要查詢用的。

{
    "name" : "John",
    "age" : 28
}


在Eclipse安裝好STS plugin。參考使用Eclipse STS建立Spring Boot應用程式專案

建立一個Spring Boot專案,在Eclipse功能選單選擇 File -> New -> Spring Starter Project



將專案Maven資訊填寫如下後按Next >



勾選Spring Web Starter與Spring Data MongoDB加入為專案的依賴,按Next >



直接按Finish完成設定。



新建好的Spring Boot專案目錄結構如下。



依照以上設定自動生成的pom.xml設定如下。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.abc</groupId>
    <artifactId>springboot-data-mongodb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-data-mongodb</name>
    <description>SpringBoot Data MongoDB Demo</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

設定專案的application.properties如下。
連線的MongoDB在本機localhost,MongoDB預設port為27017,資料庫為mydb

#context
server.servlet.contextPath=/demo
server.port=8080

#mongodb
spring.data.mongodb.uri=mongodb://localhost:27017/mydb

建立com.abc.entity.Customer,其為與資料庫customers Collection映射的實體(Entity)類別。

@Document指定映射的Collection名稱,也就是customers
@Id映射Collection customers_id欄位。
@Field則映射Collection customers其他欄位。

Customer

package com.abc.demo.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document(collection="customers")
public class Customer {
    
    @Id
    public String id;
    @Field("name")
    public String name;
    @Field("age")
    public int age;

    public Customer() {}

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and setters
    
}

建立Repository介面com.abc.demo.repo.CustomerRepo,繼承MongoRepository<T, ID>。此介面提供方法用來存取MongoDB。

CustomerRepo

package com.abc.demo.repo;

import java.util.List;
import java.util.Optional;

import org.springframework.data.mongodb.repository.MongoRepository;

import com.abc.demo.entity.Customer;

public interface CustomerRepo extends MongoRepository<Customer, String> {
    
    public Optional<Customer> findByName(String name);
    public List<Customer> findByAge(int age);          

}


建立com.abc.demo.controller.CustomerController來接收HTTP Request及呼叫CustomerRepo並返回結果。

CustomerController

package com.abc.demo.controller;

import java.util.List;

import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.abc.demo.entity.Customer;
import com.abc.demo.repo.CustomerRepo;

@RestController
@RequestMapping(value="/api/customers")
public class CustomerController {
    
    @Autowired
    private CustomerRepo customerRepo;
    
    /**
     * 查詢全部
     */
    @GetMapping(value="/all", produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
    public List<Customer> getAllCustomers() {
        return customerRepo.findAll();
    }
    
    /**
     * 依id查詢
     */
    @GetMapping(value="/id/{id}", produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Customer getCustomerById(@PathVariable String id) {
        return customerRepo.findById(id).orElse(null);
    }

    /**
     * 依名稱name查詢
     */
    @GetMapping(value="/name/{name}", produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Customer getCustomerByName(@PathVariable String name) {
        return customerRepo.findByName(name).orElse(null);
    }

    /**
     * 依年紀age查詢
     */
    @GetMapping(value="/age/{age}", produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
    public List<Customer> getCustomerByAge (@PathVariable int age) {
        return customerRepo.findByAge(age);
    }

    /**
     * 新增一筆資料
     */
    @PostMapping(value="/add", produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Customer createCustomer(@RequestBody Customer customer) {
        customer.setId(ObjectId.get().toHexString());
        customerRepo.save(customer);
        return customer;
    }
    
}

完成以上後便可以啟動專案來測試。

首先使用Postman來測試新增一筆資料,
HTTP Method設為POST,
URL為http://localhost:8080/demo/api/customers/add
Body部分填入要新增的json格式資料如下。

{
    "name" : "Mary",
    "age" : 23
}

設定好後如下,按[Send]送出請求給Spring Boot應用程式,也就是CustomerController.createCustomer()

如果新增成功可以看到下方的Response Body的回應結果。



接著測試查詢全部。
HTTP Method設為GET,
URL為http://localhost:8080/demo/api/customers/all

設定好後如下,按[Send]送出請求至CustomerController.getAllCustomers()

如果查詢成功可以看到下方的Response Body的回應結果。



測試依名稱(name)查詢。
HTTP Method設為GET,
URL為http://localhost:8080/demo/api/customers/name/John

返回結果如下。

{
    "id": "5d5d54e8bde3f3783ed04996",
    "name": "John",
    "age": 28
}

測試依年紀(age)查詢。
HTTP Method設為GET,
URL為http://localhost:8080/demo/api/customers/age/23

返回結果如下。

[
    {
        "id": "5d5d75e9e646b627cccf2c77",
        "name": "Mary",
        "age": 23
    }
]

範例完成後的專案目錄結構如下。



以上即為Spring Boot搭配Spring Data MongoDB框架存取MongoDB資料庫的範例。


參考:

沒有留言:

張貼留言