SpringBoot2.x与MongoDB集成(十)
SpringBoot2.x与MongoDB集成(十)
准备工作
介绍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 employeesEmployee:
String empId
String name
int age
double salary
one to many relationships
安装MongoDB
- MongoDB快速入门指南与docker-compose快体验
- https://www.yuque.com/ekko/database/dkluyg
创建Spring Boot项目
- SpringBoot2.x快速入门指南(一)
- https://www.yuque.com/ekko/spring/qqt7xd
添加Mongo依赖
<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
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
项目结构
创建Domain Object
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
}
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
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
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
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方式操作数据。
测试
###新增
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
持续更新地址
作者: rainbow unicorn

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
修改Nginx配置实现https请求(SSL 证书部署)
说到 [Nginx]() 服务器,个人认为最大特点就是轻量级和高性能。通过在几台不同的服务器上进行测试,发现它的并发能力特别强,并且相对而言吃的[内存]()少很多。目前已是绝大多数站长的首选 HTTP 和反向代理服务器。站长自己的网站,包括承接企业服务器运维服务所采用的都是 Nginx。Apache 当然也可以,如果有兴趣,可以看一下 Nginx 和 Apache 区别对比。 本文主要分享下 Nginx 安装 SSL 模块并且开启配置 HTTPS 的操作过程。 一、Nginx 的 SSL 模块安装 查看 nginx 是否安装 http_ssl_module 模块。 $ /usr/local/nginx/sbin/nginx -V 如果出现 configure arguments: –with-http_ssl_module, 则已安装(下面的步骤可以跳过,进入 nginx.conf 配置)。 下载 Nginx 安装包,当然是要去 Nginx 官网下载。 下载安装包到 src 目录 $ cd /usr/local/src $ wget http://nginx.org/download/...
-
下一篇
你了解C#的协变和逆变吗
你了解C#的协变和逆变吗 从C# 4.0开始,泛型接口和泛型委托都支持协变和逆变,由于历史原因,数组也支持协变。里氏替换原则:任何基类可以出现的地方,子类一定可以出现。协变(out)协变:即自然的变化,遵循里氏替换原则,表现在代码上则是任何基类都可以被其子类赋值,如Animal = Dog、Animal = Cat使用out关键字声明(注意和方法中修饰参数的out含义不同)被标记的参数类型只能作为方法的返回值(包括只读属性)在没有协变时:abstract class Animal {}class Dog : Animal {}class Cat : Animal {} interface IPoppable{ T Pop(); }class MyStack : IPoppable{ private int _pos; private readonly T[] _data = new T[100]; public void Push(T obj) => _data[_pos++] = obj; public T Pop() => _data[--_pos]; }以下代码是无法...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL数据库在高并发下的优化方案
- SpringBoot2更换Tomcat为Jetty,小型站点的福音