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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群