目錄
Redis的執行速度遠超關係型數據庫,可以極大地提高系統的性能,但是它有一些致命的缺陷,其中最爲嚴重的就是計算功能十分有限,例如,在一個10萬數據量的List中,我只需要滿足特定條件的元素,這時我們需要先把元素取出,然後通過條件去篩選得到我們想要的數據,這顯然存在比較大的問題。當然,我們可以通過Lua腳本去完善,只是這樣對於開發者的工作量就大大地增加了。
對於那些需要緩存而且經常需要統計、分析和查詢的數據,對於Redis這樣簡單的NoSQL顯然就不是那麼便捷了,這時我們可以採用MongoDB數據庫。對於那些需要統計,按條件查詢和分析的數據,它提供了支持。
MongoDB是由C++語言編寫的一種NoSQL,是一個基於分佈式文件存儲的開源數據庫系統。在負載高時可以添加更多的節點,以保證服務器的性能,MongoDB的目的是爲Web應用提供可擴展的高性能數據存儲解決方案。MongoDB將數據存儲爲一個文檔,數據結構由鍵值對組成。MongoDB文檔類似於JSON數據集,所以很容易轉化爲Java POJO對象或者JavaScript對象。
1.配置MongoDB
首先需要引入MongoDB的starter:
<!--引入MongoDB的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
然後安裝MongoDB,安裝的地址爲:https://blog.csdn.net/heshengfu1211/article/details/94218337
MongoDB配置信息如下:
spring.data.mongodb.host=192.168.0.1
spring.data.mongodb.database=test
spring.data.mongodb.username=mongod
spring.data.mongodb.password=test
spring.data.mongodb.port=27017
有了上述配置信息之後,SpringBoot會自動爲我們創建關於MongoDB的Spring Bean,自動創建的Bean信息如下:
2.使用MongoTemplate實例
我們主要使用MongoTemplate實例進行操作數據,SpringBoot會根據配置自動生成這個對象,所以我們不需要自己去創建。
2.1 用戶POJO
UserDO代碼如下:
package com.martin.config.mongodb;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.io.Serializable;
import java.util.List;
/**
* @author: martin
* @date: 2020/2/4
*/
//標識爲MongoDB
@Document
@Data
public class UserDO implements Serializable {
//MongoDB文檔編號,主鍵
@Id
private Long id;
//在MongoDB中使用user_name保存屬性
@Field("user_name")
private String userName;
//角色列表
private List<Role> roles;
}
文檔被標識爲@Document,這說明它將作爲MongoDB的文檔存在,@id註解則將對應的字段設置爲主鍵,@Field註解將屬性userName與MongoDB中的user_name屬性對應起來。
Role代碼如下:
package com.martin.config.mongodb;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.io.Serializable;
/**
* @author: martin
* @date: 2020/2/4
*/
@Document
@Data
public class Role implements Serializable {
private Long id;
@Field("role_name")
private String roleName;
private String note;
}
這裏繼續使用@Document註解,標明Role是一個單獨的MongoDB文檔。如果我們只是在UserDO中使用角色,沒有別的使用場景,也可以不使用@Document註解。
2.2 Controller
用戶控制器的實例代碼如下:
package com.martin.config.controller;
import com.martin.config.mongodb.UserDO;
import com.martin.config.service.MongoUserService;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* @author: martin
* @date: 2020/2/4
*/
@Controller
@RequestMapping("/mongo")
public class UserController {
@Autowired
private MongoUserService userService;
@RequestMapping("/save")
@ResponseBody
public UserDO saveUser(@RequestBody UserDO user) {
userService.saveUser(user);
return user;
}
@RequestMapping("/get")
@ResponseBody
public UserDO getUser(Long id) {
return userService.getUser(id);
}
@RequestMapping("/find")
@ResponseBody
public List<UserDO> findUsers(String userName, String note, Integer skip, Integer limit) {
return userService.findUser(userName, note, skip, limit);
}
@RequestMapping("/update")
@ResponseBody
public UpdateResult updateUser(Long id, String userName, String note) {
return userService.updateUser(id, userName, note);
}
@RequestMapping("/delete")
@ResponseBody
public DeleteResult deleteResult(Long id) {
return userService.deleteUser(id);
}
}
這裏引入了MongoUserService接口,下面我們討論一下該接口的具體實現。
2.3使用MongoTemplate操作文檔
首先定義用戶服務接口MongoUserService,代碼如下:
package com.martin.config.service;
import com.martin.config.mongodb.UserDO;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import java.util.List;
/**
* @author: martin
* @date: 2020/2/4
*/
public interface MongoUserService {
void saveUser(UserDO userDO);
DeleteResult deleteUser(Long id);
/**
* 查詢用戶
*
* @param userName 用戶名稱
* @param note 備註
* @param skip 跳過用戶個數
* @param limit 限制返回用戶個數
* @return
*/
List<UserDO> findUser(String userName, String note, int skip, int limit);
/**
* 更新用戶部分屬性
*
* @param id 用戶編號
* @param userName 用戶名稱
* @param note 備註
* @return
*/
UpdateResult updateUser(Long id, String userName, String note);
UserDO getUser(Long id);
}
方法的含義比較簡單,包含了增刪改查等功能。
實現類MongoUserServiceImpl的實例代碼如下:
package com.martin.config.service.impl;
import com.martin.config.mongodb.UserDO;
import com.martin.config.service.MongoUserService;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
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.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author: martin
* @date: 2020/2/4
*/
@Service
public class MongoUserServiceImpl implements MongoUserService {
//注入mongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void saveUser(UserDO userDO) {
mongoTemplate.save(userDO);
}
@Override
public DeleteResult deleteUser(Long id) {
//構建id相等的條件
Criteria criteriaId = Criteria.where("id").is(id);
//查詢對象
Query queryId = Query.query(criteriaId);
//刪除用戶
return mongoTemplate.remove(queryId, UserDO.class);
}
@Override
public List<UserDO> findUser(String userName, String note, int skip, int limit) {
//將用戶名稱和備註設置爲模糊查詢準則
Criteria criteria = Criteria.where("userName").regex(userName).and("note").regex(note);
//構建查詢條件,並設置分頁跳過前skip個,至多返回limit個
Query query = Query.query(criteria).limit(limit).skip(skip);
return mongoTemplate.find(query, UserDO.class);
}
@Override
public UpdateResult updateUser(Long id, String userName, String note) {
//確定更新的對象
Criteria criteriaId = Criteria.where("id").is(id);
Query query = Query.query(criteriaId);
//定義更新對象
Update update = Update.update("userName", userName);
update.set("note", note);
return mongoTemplate.updateMulti(query, update, UserDO.class);
}
@Override
public UserDO getUser(Long id) {
return mongoTemplate.findById(id, UserDO.class);
}
}