天天看點

Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢

Spring Data簡介

Spring Data 是spring的元件之一,主要目的是為了讓開發者再工作中能更加輕松的完成CURD,簡化代碼應該是所有架構的目的吧。今天介紹的Spring-data-mongodb隻是其中的一個子產品而已,Spring團隊的強大不言而喻,有興趣的請移步官網檢視更多子產品。

Spring-Data

Spring Data Jpa 方法定義規範

網上的博文關于這部分大同小異,這裡隻貼部分内容,詳細規則可以參考官方文檔。這些方法隻是在特定情況下才用的到,比如MongoRepository不能完成的工作,但是在本人實際工作中MongoRepository已經覆寫了9成以上的需求,如果你感覺有什麼需求它完成不了,很有可能是沒有找對方法。

Spring-Data-Jpa

Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢
Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢

MongoRepository實戰操作

  1. 建立測試項目,spring boot建立項目可以選擇通路官網,并添加Web和Mongodb依賴即可。如下圖所示
    Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢
  2. 打開項目,并修改application.properties檔案添加資料源,如下所示:
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=testmongodb
           
  1. 分别建立實體類User/Repository接口UserRespository/控制器UserController
public class User {
   private String id;
   private String userName;
   private String password;
   private int age;
   private long createTime;
   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getUserName() {
      return userName;
   }
   public void setUserName(String userName) {
      this.userName = userName;
   }
   public String getPassword() {
      return password;
   }
   public void setPassword(String password) {
      this.password = password;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public long getCreateTime() {
      return createTime;
   }
   public void setCreateTime(long createTime) {
      this.createTime = createTime;
   }  
}
           
package com.ppw.mongoexample.repository;

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

import com.ppw.mongoexample.model.User;

public interface UserRepository extends MongoRepository<User, String>{
	public Page<User> findByUserNameLike(String userName, Pageable pageable);
}
           
package com.ppw.mongoexample.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
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.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpStatus;
import com.ppw.mongoexample.model.User;
import com.ppw.mongoexample.repository.UserRepository;

@RestController
@RequestMapping("/v1/user")
public class UserController {

   @Autowired
   private UserRepository userRepository;
   
   @ResponseStatus(HttpStatus.CREATED)
   @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
   public User createUser(@RequestBody User user) {
      return userRepository.save(user);
   }
   
   /**
    * 根據id查詢
    * @param id
    * @return
    */
   @GetMapping(value="/{id}")
   public User readUserById(@PathVariable("id") String id){
      return userRepository.findOne(id);
   }
   
   /**
    * 根據一個或者多個屬性查詢單個結果
    * @param name
    * @return
    */
   @GetMapping(value="/name/{name}")
   public User readUserByName(@PathVariable("name") String name){
      User user = new User();
      user.setUserName(name);
      ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
      Example<User> example = Example.of(user, matcher);
      return userRepository.findOne(example);
   }
   
   /**
    * 根據一個或者多個屬性分頁查詢 
    * @param pageNumber
    * @param pageSize
    * @return
    */
   @GetMapping(value = "/page/{pageNumber}/pagesize/{pageSize}/name/{name}")
   public Page<User> readUsersByPage(@PathVariable("pageNumber") int pageNumber,
         @PathVariable("pageSize") int pageSize,@PathVariable("name") String name) {
      User user = new User();
      user.setUserName(name);
      ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
      Example<User> example = Example.of(user, matcher);
      if (pageNumber < 1) {
         pageNumber = 1;
      } else if (pageSize == 0) {
         pageSize = 20;
      }
      
      PageRequest pageable = new PageRequest(pageNumber - 1, pageSize);
      return userRepository.findAll(example, pageable);
   }
   
   /**
    * 根據使用者年齡升序排序
    * @return
    */
   @GetMapping
   public List<User> readUsers(){
      
      Order order = new Order(Direction.ASC,"age");
      Sort sort = new Sort(order);
      return userRepository.findAll(sort);
   }
   
   /**
    * 模糊查詢帶分頁
    * @param pageNumber
    * @param pageSize
    * @param keyWords
    * @return
    */
   @GetMapping(value = "/page/{pageNumber}/pagesize/{pageSize}/keyword/{keyWords}")
   public Page<User> readUsersByKeywords(@PathVariable("pageNumber") int pageNumber,
         @PathVariable("pageSize") int pageSize,@PathVariable("keyWords") String keyWords) {
      if (keyWords == null) {
         keyWords = "";
      }
      if (pageNumber < 1) {
         pageNumber = 1;
      } else if (pageSize == 0) {
         pageSize = 20;
      }
      PageRequest pageable = new PageRequest(pageNumber - 1, pageSize);
      return userRepository.findByUserNameLike(keyWords, pageable);
   }
   
   @ResponseStatus(HttpStatus.OK)
   @DeleteMapping(value="/{id}")
   public void removeUser(@PathVariable("id") String id) {
      userRepository.delete(id);
   }
}
           

Postman測試部分接口結果如下圖所示

1.建立使用者

Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢

2.根據使用者名模糊查詢并分頁

Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢

3.根據年齡升序排序

Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢

Mongodb截圖如下

Spring boot內建mongodb使用MongoRepository完成CURD和複雜查詢

注意事項

在使用MongoRepository的過程中,非模糊查詢多配合使用Example/ExampleMatcher來完成工作,MongoRepository已經非常強大,常用功能如排序,分頁都已實作,當然還有很多方法文中沒有提到感興趣的可以深入了解一下。如果MongoRepository能實作,盡量不要做備援的工作,如果非要自定義方法才能實作,一定要符合Spring-Data的規則來定義方法名。這裡有一個小坑需要注意一下,如果實體類中包含有基本資料類型的屬性,那麼在使用repository.find(Example)時,需要把這些屬性忽略掉,因為基本資料類型在建立對象時會有預設值,這時如果你按照别的屬性查找資料時,這些屬性也會附帶到條件裡。比如上文代碼中有一個根據使用者名查找使用者的方法,此時你期望的是在查詢過程中隻有使用者名起作用,那麼這時候就要加上下面的代碼。如果不加,則條件中會多出age=0&createTime=0,查出的結果有誤。

ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
      Example<User> example = Example.of(user, matcher);
      
           

github位址如下

https://github.com/wppcoder/mongo-example.git

歡迎讨論交流,如有錯誤歡迎指正。

繼續閱讀