前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot2.x与MongoDB集成(十)

SpringBoot2.x与MongoDB集成(十)

原创
作者头像
拾荒者的笔记
修改2020-05-18 18:15:04
1.3K0
修改2020-05-18 18:15:04
举报
文章被收录于专栏:Spring专栏Spring专栏

准备工作

介绍MongoDB与Spring Boo集成,并通过MongoRepository以及MongoTemplate来执行CRUD操作。

Spring Boot:2.3.0.RELEASE Spring Boot Data MongoDB:2.3.0.RELEASE MongoDB:4.2.6 MongoDB Driver:4.0.3

要操作的集合示例数据结构(即model)

Department: String id String name String description Array employees Employee: String empId String name int age double salary one to many relationships

安装MongoDB

创建Spring Boot项目

添加Mongo依赖

代码语言:javascript
复制
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Spring application配置

application.properties

代码语言:javascript
复制
spring.data.mongodb.username=root
spring.data.mongodb.password=example
spring.data.mongodb.database=admin

测试能否正常启动

host:localhost port:27017 database:admin user:root password:example

项目结构

image.png
image.png

创建Domain Object

代码语言:javascript
复制
package com.example.mongodb.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.List;

@Document("Department")
public class Department {
    @Id
    private String id;
    @Indexed(name = "deptName")
    private String name;
    private String description;

    @DBRef
    private List<Employee> employees;
    //...getter setter
}
代码语言:javascript
复制
package com.example.mongodb.model;

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

@Document("Employee")
public class Employee {

    @Id
    private String empId;
    private String name;
    private int age;
    private double salary;
    //...getter setter
}

@Document 标识了要持久化到mongodb的DO。

@Id 文档的唯一标识,在mongodb中是objectId。

@DbRef 关联另一个Document对象,存入的是文档的引用,如果不使用这个注解,存入的是内容。不过即使使用@DbRef,mongodb本身并不维护关联数据,也就是说需要手动将数据插入到被关联文档。

两种操作数据的方式

MongoRepository

代码语言:javascript
复制
package com.example.mongodb.repository;

import com.example.mongodb.model.Department;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface DepartmentRepository extends MongoRepository<Department,String> {
    @Query(value = "{'Employee.name': ?0}", fields = "{'employees' : 0}")
    Department findDepartmentByEmployeeName(String empName);

    List<Department> findDepartmentByName(String name);
}

MongoTemplate

代码语言:javascript
复制
package com.example.mongodb.repository;

import com.example.mongodb.model.Department;
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.Repository;

import java.util.List;

@Repository
public class DeptRepository {

    @Autowired
    private MongoTemplate mongoTemplate;

    public List<Department> findAll() {
        return mongoTemplate.findAll(Department.class);
    }

    public List<Department> findDepartmentByName(String deptName){
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is(deptName));
        return mongoTemplate.find(query, Department.class);
    }

    public Department save(Department department) {
        mongoTemplate.save(department);
        return department;
    }

    public Department update(Department department){
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(department.getId()));
        Update update = new Update();
        update.set("name", department.getName());
        update.set("description", department.getDescription());
        return mongoTemplate.findAndModify(query, update, Department.class);
    }

    public void deleteById(String deptId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(deptId));
        mongoTemplate.remove(query, Department.class);
    }

}

创建Controller

代码语言:javascript
复制
package com.example.mongodb.controller;

import com.example.mongodb.model.Department;
import com.example.mongodb.model.Employee;
import com.example.mongodb.repository.DepartmentRepository;
import com.example.mongodb.repository.DeptRepository;
import com.example.mongodb.repository.EmpRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

@RestController
public class DepartmentController {
    @Autowired
    DepartmentRepository departmentRepository;
    @Autowired
    DeptRepository deptRepository;
    @Autowired
    EmpRepository empRepository;

    @PostMapping("/v1/dept/s")
    public Department v1save(@RequestBody Department department) {
        List<Employee> employees = Optional.ofNullable(department.getEmployees()).orElse(Collections.emptyList());
        employees.forEach(employee -> empRepository.save(employee));
        return departmentRepository.save(department);
    }
    @GetMapping("/v1/dept/l")
    public List<Department> v1list(){
        return departmentRepository.findAll();
    }
    @PutMapping("/v1/dept/u/{deptId}")
    public Department v1update(@RequestBody Department department, @PathVariable String deptId) {
        department.setId(deptId);
        List<Employee> employees = Optional.ofNullable(department.getEmployees()).orElse(Collections.emptyList());
        employees.forEach(employee -> empRepository.save(employee));
        return departmentRepository.save(department);
    }
    @DeleteMapping("/v1/dept/d/{deptId}")
    public String v1delete(@PathVariable String deptId) {
        departmentRepository.deleteById(deptId);
        return deptId;
    }
    @GetMapping("/v1/dept/get/{deptName}")
    public List<Department> v1getByName(@PathVariable String deptName) {
        return departmentRepository.findDepartmentByName(deptName);
    }
    @GetMapping("/v1/dept/get/emp/{empName}")
    public Department v1getByEmpName(@PathVariable String empName) {
        return departmentRepository.findDepartmentByEmployeeName(empName);
    }
    
    @PostMapping("/v2/dept/s")
    public Department v2save(Department department) {
        List<Employee> employees = Optional.ofNullable(department.getEmployees()).orElse(Collections.emptyList());
        employees.forEach(employee -> empRepository.save(employee));
        return deptRepository.save(department);
    }
    @GetMapping("/v2/dept/l")
    public List<Department> v2list() {
        return deptRepository.findAll();
    }
    @PutMapping("/v2/dept/u")
    public Department v2update(Department department){
        List<Employee> employees = Optional.ofNullable(department.getEmployees()).orElse(Collections.emptyList());
        employees.forEach(employee -> empRepository.save(employee));
        return deptRepository.update(department);
    }
    @DeleteMapping("/v2/dept/d/{deptId}")
    public void v2delete(@PathVariable String deptId) {
        deptRepository.deleteById(deptId);
    }
    @GetMapping("/v2/dept/get/{deptName}")
    public List<Department> v2getByName(@PathVariable String deptName){
        return deptRepository.findDepartmentByName(deptName);
    }
}

v1的接口使用MongoRepository方式操作数据,v2的接口使用MonoTemplate方式操作数据。

测试

代码语言:javascript
复制
###新增
POST http://localhost:8080/v1/dept/s
Content-Type: application/json

{
  "id": "10010",
  "name": "中国联通",
  "description": "中国联通",
  "employees": [
    {
      "empId": "1",
      "name": "jack ma",
      "age": 78,
      "salary": 900000.0
    }
  ]
}


###更新
PUT http://localhost:8080/v1/dept/u/10010
Content-Type: application/json

{
  "id": "10010",
  "name": "中国联通",
  "description": "中国联通",
  "employees": [
    {
      "empId": "1",
      "name": "jack ma",
      "age": 78,
      "salary": 900000.0
    },
    {
      "empId": "2",
      "name": "pony ma",
      "age": 78,
      "salary": 900000.0
    }
  ]
}

###删除
DELETE http://localhost:8080/v1/dept/d/10010

###查询
GET http://localhost:8080/v1/dept/l
image.png
image.png
image.png
image.png

项目地址

持续更新地址:https://www.yuque.com/ekko/spring/yxs4nf

>> 作者: rainbow unicorn

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • 安装MongoDB
  • 创建Spring Boot项目
  • 添加Mongo依赖
  • Spring application配置
  • 测试能否正常启动
  • 项目结构
  • 创建Domain Object
  • 两种操作数据的方式
    • MongoRepository
      • MongoTemplate
      • 创建Controller
      • 测试
      • 持续更新地址:https://www.yuque.com/ekko/spring/yxs4nf
      相关产品与服务
      云数据库 MongoDB
      腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档