WebFlux 集成MongoDb

上一篇文章中我們已經簡單搭建了webflux的框架,今天就集成mongodb完成一個用戶管理系統。

1. 安裝MongoDb

  • 直接去官網下載安裝包:

https://www.mongodb.com/downl...

  • 選擇對應的操作系統,我的是windows,然後選擇zip,還是msi。我下載的zip也就是綠色免安裝。如果msi的就直接下一步,下一步按要求安裝就好了。
  • zip啓動方式:

到bin目錄下打開cmd命令窗口 運行:

mongod.exe --dbpath C:\Tools\mongodb\db

dbpathshi 是設置數據備份目錄,必須要設置,否則啓動不了。

bin目錄下的 mongo.exe是mongodb的查詢客戶端,可以執行查詢操作。一些查詢命令可以直接去官網看。
show dbs:顯示當前所有文檔庫,相當於數據庫
use test:選擇test庫
db.user.find():查詢所有user文檔數據
db.user.drop():刪除所有user文檔

2.集成mogodb

pom文件依賴:

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

配置連接:

spring.data.mongodb.host=localhost
spring.data.mongodb.database=test
spring.data.mongodb.port=27017

3.dao層

package com.mike.dao;

import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;

import com.mike.po.User;

/**
 * The class UserDao.java
 */
@Repository
public interface UserDao extends ReactiveMongoRepository<User, String>{

}

ReactiveMongoRepository 已經幫你實現了增刪該查,如果需要別的方法,需要自己添加實現接口。具體寫法和JPA類似

4.service層

package com.mike.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import com.mike.dao.UserDao;
import com.mike.po.User;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * The class UserService.java
 */
@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    
    @Autowired
    private MongoTemplate mongoTemplate;
    
    public Mono<User> saveOrUpdateUser(User user){
        return userDao.save(user);
    }
    
    public Mono<User> findById(String id){
        return userDao.findById(id);
    }
    
    public Flux<User> findAll(){
        return userDao.findAll();
    }
    
    public  void deleteById(String id){
        // 使用mongoTemplate來做刪除   直接使用提供的刪除方法不行
        Query query = Query.query(Criteria.where("id").is(id));
        mongoTemplate.remove(query, User.class);
        //userDao.deleteById(id);  這樣無法刪除,不知道爲什麼
    }
}

5.controller層

package com.mike.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.ResponseBody;

import com.mike.po.User;
import com.mike.service.UserService;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * The class UserController.java
 */
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/user")
    public String save(User user,final Model model){
         Mono<User> u = userService.saveOrUpdateUser(user);
         model.addAttribute("user", u);
         return "redirect:/users";
    }
    
    @GetMapping("/user/find/{id}")
    @ResponseBody
    public Mono<User> find(@PathVariable("id") String id){
        return userService.findById(id);
    }
    
    @GetMapping("/users")
    public String findAll(final Model model){
        Flux<User> users= userService.findAll();
        model.addAttribute("users", users);
        return "user";
    }
    
    @GetMapping("/user/delete/{id}")
    public String delete(@PathVariable("id") String id){
        userService.deleteById(id);
        return "redirect:/users";
    }
}

6.po層

package com.mike.po;

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

/**
 * The class User.java
 */
public class User {
    @Id
    @Field("_id")
    private String id;
    private String name;
    private String sex;
    private String job;
    private String address;
    private String phone;
    
    
    /**
     * @return the id
     */
    public String getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the sex
     */
    public String getSex() {
        return sex;
    }
    /**
     * @param sex the sex to set
     */
    public void setSex(String sex) {
        this.sex = sex;
    }
    /**
     * @return the job
     */
    public String getJob() {
        return job;
    }
    /**
     * @param job the job to set
     */
    public void setJob(String job) {
        this.job = job;
    }
    /**
     * @return the address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address the address to set
     */
    public void setAddress(String address) {
        this.address = address;
    }
    /**
     * @return the phone
     */
    public String getPhone() {
        return phone;
    }
    /**
     * @param phone the phone to set
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }
    
    
}

7. 總結

和正常的關係型數據庫的操作一樣,只不過有些問題想不明白。我上面的刪除舊出現了無法刪除的問題,最後使用的mongodbTemplate完成的,這是個同步操作。爲什麼會出現這樣的問題呢?這就是響應式編程的坑,如果你不理解就會出現問題。增刪改查完了,但是沒有頁面展示,寫一篇寫頁面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章