SpringBoot2中使用Spring Data MongoDB操作mongodb数据库
Spring Data MongoDB中操作mongodb数据库主要使用到MongoRepository和MongoTemplate两个类。
MongoRepository遵循了Spring Data规范,只要继承它、无需写实现类就可以对mongodb增删改查。
MongoTemplate相比于MongoRepository更加灵活,可以弥补MongoRepository的不足。
一、MongoRepository和MongoTemplate常用方法
(一)MongoRepository
常用方法:
1 | insert() | User user = new User(); user.setName(“chushiyan”); userRepository.insert(user); |
2 | save() | // 保存、插入 User user = new User(); user.setName(“chushiyan”); userRepository.save(user); // 修改已存在的 user = mongoTemplate.findOne( Query.query(Criteria.where(“name”).is(“chushiyan”)), User.class); user.setName(“chsuhiyan”); userRepository.save(user); |
3 | delete() | userRepository.delete(user); |
4 | findOne() | userRepository.findOne(user.getId()) |
5 | exists() | boolean isExists = userRepository.exists(user.getId()); |
6 | FindAll() With Sort | List users = userRepository.findAll(new Sort(Sort.Direction.ASC, “name”)); |
7 | FindAll() With Pageable | Pageable pageableRequest = PageRequest.of(0, 1); Page page = userRepository.findAll(pageableRequest); List users = pages.getContent(); |
(二)MongoTemplate
MongoTemplate核心操作类:Criteria和Query
MongoTemplate常用方法:
函数 | 示例 | |
---|---|---|
1 | insert() | User user = new User(); user.setName(“chushiyan”); mongoTemplate.insert(user, “user”); 插入后的数据: { “_id” : ObjectId(“55b4fda5830b550a8c2ca25a”), “_class” : “org.chushiyan.pojo.User”, “name” : “chushiyan” } |
2 | save() 保存。 已存在,则修改。 不存在,则插入 | User user = new User(); user.setName(“chushiyan”); mongoTemplate.save(user, “user”); // 插入 user = mongoTemplate.findOne( Query.query(Criteria.where(“name”).is(“chushiyan”)), User.class); user.setName(“chu”); mongoTemplate.save(user, “user”); // 修改 |
3 | UpdateFirst() 只修改查询到的第一个文档 | // 修改name为chushiyan的用户的name为xiaoming // 如果存在多个,只会修改查询到的第一个 Query query = new Query(); query.addCriteria(Criteria.where(“name”).is(“chushiyan”)); Update update = new Update(); update.set(“name”, “xiaoming”); mongoTemplate.updateFirst(query, update, User.class); |
4 | UpdateMulti() | // 修改name为chushiyan的用户的name为xiaoming // 如果存在多个,会修改所有 Query query = new Query(); query.addCriteria(Criteria.where(“name”).is(“chushiyan”)); Update update = new Update(); update.set(“name”, “xiaoming”); mongoTemplate.updateMulti(query, update, User.class); |
5 | 修改所有查询到的文档 FindAndModify() | Query query = new Query(); query.addCriteria(Criteria.where(“name”).is(“chushiyan”)); Update update = new Update(); update.set(“name”, “xiaoming”); User user = mongoTemplate.findAndModify(query, update, User.class); |
6 | remove() | mongoTemplate.remove(user, “user”); |
下面通过一个案例进一步了解MongoRepository和MongoTemplate的用法
二、数据库准备
在命令行中连接mongodb、创建testdb数据库、创建user集合、插入测试数据:
mongo # 连接mongodb
use testdb # 创建testdb数据库
db.createCollection("user") # 创建user集合
# 插入测试数据
db.user.insert({
_id:"1",
name:"chushiyan",
email:"chushiyan0415@163.com",
password:"123456",
followers:NumberInt(0),
});
db.user.insert({
_id:"2",
name:"xiaoqiang",
email:"xiaoqiang@163.com",
password:"123456",
followers:NumberInt(0),
});
三、dao继承MongoRepository进行基本的增删改查
创建springboot项目(这里项目名为mongodb_tutorial)
1、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.chushiyan</groupId>
<artifactId>mongodb_tutorial</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mongodb_tutorial</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 导入Spring Data MongoDB starter依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、application.yml
server:
port: 30000
spring:
application:
name: mongodb_tutorial
data:
mongodb:
host: 127.0.0.1:27017
database: testdb
3、启动类
package org.chushiyan.mongodb_tutorial;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author chushiyan
* @email chushiyan0415@163.com
* @description
*/
@SpringBootApplication
public class MongodbTutorialApplication {
public static void main(String[] args) {
SpringApplication.run(MongodbTutorialApplication.class, args);
}
}
4、实体类
package org.chushiyan.mongodb_tutorial.pojo;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @author chushiyan
* @email chushiyan0415@163.com
* @description
*/
@Data // 使用lombok库的Data注解,省去setter/getter、equals等函数的手动编写
@Document(collection = "user") // 使用Document注解,表明是mongodb的文档实体类
public class User {
@Id
private String _id;
private String name;
private String email;
private String password;
private Integer followers;
}
5、UserController
package org.chushiyan.mongodb_tutorial.controller;
import org.chushiyan.mongodb_tutorial.pojo.User;
import org.chushiyan.mongodb_tutorial.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author chushiyan
* @email chushiyan0415@163.com
* @description
*/
@RestController
@CrossOrigin
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 增加用户
*
* @param user User对象
* @return
*/
@PostMapping
public ResponseEntity<String> add(@RequestBody User user) {
userService.add(user);
return new ResponseEntity<String>("增加成功", HttpStatus.OK);
}
/**
* 根据 id 删除用户
*
* @param id
* @return
*/
@DeleteMapping("/{id}")
public ResponseEntity<String> deleteById(@PathVariable String id) {
userService.deleteById(id);
return ResponseEntity.ok().body("删除成功");
}
/**
* 修改用户
*
* @param id 用户id
* @param user 用户对象
* @return
*/
@PutMapping("/{id}")
public ResponseEntity<String> update(@PathVariable String id, @RequestBody User user) {
user.set_id(id);
userService.update(user);
return ResponseEntity.ok().body("修改成功");
}
/**
* 根据 id 查询用户
*
* @param id
* @return
*/
@GetMapping("/{id}")
public ResponseEntity<User> findById(@PathVariable String id) {
return ResponseEntity.ok().body(userService.findById(id));
}
/**
* 查询所有
*
* @return
*/
@GetMapping
public ResponseEntity<List<User>> findAll() {
return ResponseEntity.ok().body(userService.findAll());
}
}
6、UserService
package org.chushiyan.mongodb_tutorial.service;
import org.chushiyan.mongodb_tutorial.dao.UserDao;
import org.chushiyan.mongodb_tutorial.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.nio.file.OpenOption;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
/**
* @author chushiyan
* @email chushiyan0415@163.com
* @description
*/
@Service
public class UserService {
@Autowired
private UserDao userDao;
/**
* 增加用户
*
* @param user
*/
public void add(User user) {
// 这里使用UUID生成id ( 将里面的 - 移除 )
String id = UUID.randomUUID().toString().replace("-", "");
user.set_id(id);
userDao.save(user);
}
/**
* 根据 id 删除用户
*
* @param id
*/
public void deleteById(String id) {
userDao.deleteById(id);
}
/**
* 修改用户
*
* @param user
*/
public void update(User user) {
userDao.save(user);
}
public User findById(String id) {
Optional optional = userDao.findById(id);
if (!optional.isPresent()) {
throw new RuntimeException("未查询到指定用户");
}
return (User) optional.get();
}
public List<User> findAll() {
return userDao.findAll();
}
}
7、UserDao
继承MongoRepositor
package org.chushiyan.mongodb_tutorial.dao;
import org.chushiyan.mongodb_tutorial.pojo.User;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @author chushiyan
* @email chushiyan0415@163.com
* @description
*/
public interface UserDao extends MongoRepository<User, String> {
}
四、使用MongoTemplate进行修改
以增加用户的followers为例
1、UserController中添加代码
/**
* 增加用户的关注者
* @param id
* @return
*/
@PutMapping("/followers/{id}")
public ResponseEntity<String> updateFollowers(@PathVariable String id){
userService.updateFollowers(id);
return ResponseEntity.ok().body("增加关注者成功");
}
2、UserService中添加代码
// 增加用户的关注者
public void updateFollowers(String id) {
// Optional optional = userDao.findById(id);
// if (!optional.isPresent()) {
// throw new RuntimeException("未查询到指定用户。增加用户的关注者失败");
// }
// User user = (User) optional.get();
// user.setFollowers(user.getFollowers() + 1);
// userDao.save(user);
// 上面方法虽然实现起来比较简单,但是执行效率并不高(先查询再修改导致效率低),
// 这里只需要将followers加1即可,没必要查询出所有字段修改后再更新所有字段。
// 我们可以使用MongoTemplate类来实现对某列的操作。
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
Update update = new Update();
update.inc("followers", 1);
mongoTemplate.updateFirst(query, update, User.class);
}