本篇說明如何在Windows 7建立Spring Boot,Spring Data MongoDB對MongoDB資料庫進行基本操作的專案。
本範例的環境如下。
- 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資料庫的範例。
參考:
沒有留言:
張貼留言