Spring Boot實戰系列(2)資料儲存之NoSQL資料庫MongoDB

五月君發表於2018-11-06

簡介

MongoDB 是一個基於分散式檔案儲存的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案,官方解釋。在NoSql資料庫中還是比較優秀的一款資料庫,且官方網站現在已經逐步開始支援中文版了。 MongoDB 中文版 https://www.mongodb.com/zh

之前MySql介紹了Spring Data Jpa,對於MongoDB,Spring也提供了強大的支援Spring Data MongoDB,這個專案提供了與MongoDB文件資料庫的整合。Spring Data MongoDB 官方文件https://spring.io/projects/spring-data-mongodb

注意 在開始之前先開啟你的mongod,對於mongodb安裝啟動有疑問的可以參考這裡 Mac系統下安裝MongoDB

快速導航

新增mongodb依賴

專案根目錄 pom.xml 新增依賴 spring-boot-starter-data-mongodb

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
複製程式碼

修改配置檔案mongodb相關配置

  • mongo2.4以上版本:

    • uri: 資料庫連結地址 mongodb://username:password@ip:host
  • mongo2.4以下版本:

    • host: 127.0.0.1
    • port: 27017
    • username: root
    • password: root
    • database: test

application.yml

spring:
    data:
        mongodb:
            uri: mongodb://127.0.0.1:27017
            database: test
複製程式碼

定義集合模型

關於Spring Data MongoDB更多註解及使用參考官方文件

在專案啟動時候,以下定義的欄位會對應到資料庫中的資料結構,注意要新增@Document註解。

  • @Document: 標註於實體類上表明由mongo來維護該集合,預設集合名為類名還可手動指定集合名@Document(collection=user)
  • @Id: 主鍵,自帶索引由mongo生成對應mongo中的_id欄位(ObjectId)
  • @Indexed: 設定該欄位索引,提高查詢效率,設定引數(unique=true)為唯一索引,預設為false
package com.angelo;

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

@Document
public class User {

    @Id
    private String id;

    @Indexed
    private String name;

    private Integer age;

    @Indexed(unique = true)
    private String idCard;

    public User() {
    }

    // 以下getter、setter方法,程式碼可以參考本節原始碼
}
複製程式碼

建立繼承於mongorepository的資料訪問物件

建立UserRepository繼承於MongoRepository,當然你也可以使用JpaRepository或MongoRepository,這些介面擴充套件了mongodb的CRUD操作的通用介面,此外還公開了底層持久化技術的功能,供我們擴充套件。

例如以下findById,MongoRepository提供的介面為Long型別,顯然我這裡使用mongodb自動生成的ObjectId,自然是不行了,因此擴充套件了該方法。

UserRepository.java

package com.angelo;

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

import java.util.List;

public interface UserRepository extends MongoRepository<User, Long> {
    User findById(String id);

    List <User> deleteById(String id);
}

複製程式碼

建立控制層實現對資料的增刪改查

此處操作Mongodb的增刪改查和之前討論的MySql一樣,以下給出程式碼示例

package com.angelo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    /**
     * 查詢使用者列表
     * @return
     */
    @GetMapping(value = "/user/list")
    public List<User> userList() {
        return userRepository.findAll();
    }

    @GetMapping(value = "/user/info")
    public User findUserById(@RequestParam("id") String id) {
        return userRepository.findById(id);
    }

    /**
     * 建立使用者資訊
     */
    @PostMapping(value = "/user")
    public User createUser(@RequestBody User params) {
        User user = new User();
        user.setName(params.getName());
        user.setAge(params.getAge());
        user.setIdCard(params.getIdCard());

        return userRepository.save(user);
    }


    /**
     * 更新使用者資訊
     */
    @PutMapping(value = "/user/{id}")
    public User updateUser(@PathVariable("id") String id, @RequestParam("name") String name, @RequestParam("age") Integer age,
        @RequestParam("idCard") String idCard) {
        User user = new User();
        user.setId(id);
        user.setName(name);
        user.setAge(age);
        user.setIdCard(idCard);

        return userRepository.save(user);
    }

    /**
     * 刪除使用者資訊
     * MongoRepository提供的原生方法會報deleteById(java.lang.long) in CurdRepository cannot be applied to (java.lang.string),此處定義的id為String型別顯然不符,在UserRepository介面中進行了重寫,
     */
    @DeleteMapping(value = "/user/{id}")
    public void deleteUserById(@PathVariable("id") String id) {
        userRepository.deleteById(id);
    }
}
複製程式碼

原始碼地址 https://github.com/Q-Angelo/SpringBoot-Course/tree/master/chapter2/chapter2-2

作者:五月君
連結:www.imooc.com/article/258…
來源:慕課網
Github: Spring Boot實戰系列

相關文章