目录
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);
}
}