欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
前言
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
什么是NoSQL?
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
基本概念
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解Mongo中的一些概念
![886de7257b0bd64cb5fe4f0952fa6434.png](https://i-blog.csdnimg.cn/blog_migrate/b179c45d905d958a2729cc8a360ba306.jpeg)
通过下图实例,我们也可以更直观的了解Mongo中的一些概念:
![9e0be90e5d5752e4875c186962ffc7ce.png](https://i-blog.csdnimg.cn/blog_migrate/925cee925b3d08502fabb5bf7f2576d1.jpeg)
关于如何部署mongodb,以及相关的基本概念,老顾就不在这里介绍了,小伙伴们可以自行上网学习。
今天老顾直接带着大家如何在SpringBoot中操作MongoDB;类似操作mysql。
相关配置
在pox.xml文件中添加spring-boot-starter-data-mongodb引用
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
配置yml文件
![f63fbbe1da539f7079ae9a1829ef956e.png](https://i-blog.csdnimg.cn/blog_migrate/dbb5d3153f66d86ab5c5b67d62fa4661.jpeg)
创建实体类
书籍类
![e7addc09624179c60484643aecacff2f.png](https://i-blog.csdnimg.cn/blog_migrate/4a0f8640580cf319bbafe8cc3993905e.jpeg)
用户类
![c3ebc19b3c1e02a8416663fde5848749.png](https://i-blog.csdnimg.cn/blog_migrate/e72612b49df7cb6872302f0dc24d5640.jpeg)
创建service类
Service中主要来实现CURD的操作
此处需要说明的是Mongodb的修改操作大致有3种:
- mongoTemplate.updateFirst操作:修改第一条
- mongoTemplate.updateMulti操作:修改符合条件的所有
- this.mongoTemplate.upsert操作:修改时如果不存在则添加.
![7ce8acea991ae76e6f6062f41b449b1b.png](https://i-blog.csdnimg.cn/blog_migrate/64323fb9f2416f4879ce2b6d8a1c8ffc.jpeg)
![04b20870fb1cf9fb23446ee02c88e2ba.png](https://i-blog.csdnimg.cn/blog_migrate/e65784ad66b255e241e0bc8f7dc54c2c.jpeg)
![073f4c86178b8845cfcdcf42b0e145ff.png](https://i-blog.csdnimg.cn/blog_migrate/9322962015e7182072a27dc054d0d802.jpeg)
![5b7332f1c402fb41b293886560803fa4.png](https://i-blog.csdnimg.cn/blog_migrate/18879518f8c65165e2b1bc44705d24d5.jpeg)
创建控制器Controller
![575a5c148e82cfdde794e3fdd5d2a68a.png](https://i-blog.csdnimg.cn/blog_migrate/463a9114308f1d3e4c41faf10ed25037.jpeg)
启动测试
启动postman
![a8b597af33ff79b53a202e71c455a726.png](https://i-blog.csdnimg.cn/blog_migrate/082df8a1451996ade16d7ce1b137bb10.jpeg)
查看monogoDb数据库
![9e3631c80a8fd3b0fea5d58af03048e1.png](https://i-blog.csdnimg.cn/blog_migrate/2f06c6c9d95d28b55ac9af8f544c2bb0.jpeg)
优化使用
我们看到上面的操作monogoDb的CRUD操作,是使用了MongoTemplate对象的方法,里面有很多CRUD的方法。但是在使用中会发现一个问题,假如要对数据库操作多个对象,那岂不是每一个对象Service都需要写一套增删查改的方法
那能不能有像mysql操作的mybatis-plus操作方式,可以很方便,快速的操作monogoDb数据库呢?
老顾就来分享一下如何做?
定义MongoDbDao抽象类
![bf223ca2b6346e9061ceb956ec758a86.png](https://i-blog.csdnimg.cn/blog_migrate/932ccab64d76ebd3117199c6d3dcde7e.jpeg)
![741e804a06db6c150656599a236aa5ed.png](https://i-blog.csdnimg.cn/blog_migrate/00cab9680666433f195aabaf930e562b.jpeg)
![fef6013f437bd082214b9be2e4660a9c.png](https://i-blog.csdnimg.cn/blog_migrate/1ce4a6e097dc1f058009f2361bc1fe76.jpeg)
![fc32f0f50bc16f526795b2c6a388cf6d.png](https://i-blog.csdnimg.cn/blog_migrate/819e0bc5eb14a7a9054f99bea1624764.jpeg)
![a15de9c7deb2de1e58562348735dd638.png](https://i-blog.csdnimg.cn/blog_migrate/be8218c497fe879ee3b1bf2d9ca33718.jpeg)
![9c56545cb74f6917631907ddfe1d1e45.png](https://i-blog.csdnimg.cn/blog_migrate/3573c423046016c9027dc81ca88932c1.jpeg)
![a375fe9367d6531b61669f4a3206a76a.png](https://i-blog.csdnimg.cn/blog_migrate/76a41569e74e59848a3f3691b9a0804d.jpeg)
![56df81f38173c70f40503104cd10a0d8.png](https://i-blog.csdnimg.cn/blog_migrate/d647d6889d50f12c1a198a00c5de2e24.jpeg)
上面的MongoDbDao抽象类,就是封装了对实体类的CRUD操作。我们还需要定义service类,提供给上层业务去使用
定义MongoDbService抽象类
![e7d5ffe0467eb88ce5b203d4a3690688.png](https://i-blog.csdnimg.cn/blog_migrate/65876278cf28d8b803334878c3350dba.jpeg)
![04ec7c08aa2d9f2cdb33dd445cf126e2.png](https://i-blog.csdnimg.cn/blog_migrate/ec157dcf0ab4f137d7b9b641ab240860.jpeg)
![206b1448f084200bddf680eeabce029b.png](https://i-blog.csdnimg.cn/blog_migrate/b48c225159104882456ada21dc86c2c0.jpeg)
![32bd240fcdbe0d3680b7066e7162e107.png](https://i-blog.csdnimg.cn/blog_migrate/34d099185e971255e7b98610c8cefe37.jpeg)
到这里我们的抽象类就完成了,那如何使用呢?就很简单了。
定义实体类Dao
图书实体操作Dao类,只要继承MongoDbDao就行了,当然需要重写getEntityClass
![3fe65f1d4c60d794ef9631dfe570d8e9.png](https://i-blog.csdnimg.cn/blog_migrate/8c8372c46b1d0c480786928a7e361521.jpeg)
雇佣实体操作Dao,只要继承MongoDbDao就行了,当然需要重写getEntityClass
![c3fa5e16683f9d2870dc8f48439014ef.png](https://i-blog.csdnimg.cn/blog_migrate/7dd010a6dcfdbe58afcf6b43292d6751.jpeg)
定义实体类Service
Book实体Service,只要继承MongoDbService
![8ffad733eb9b05b6387b920fdde864dd.png](https://i-blog.csdnimg.cn/blog_migrate/7fb65fc6acdcef9b9ba98b476177e1ac.jpeg)
Emp实体Service,只要继承MongoDbService
![2087432b9093aa540089431beed14f96.png](https://i-blog.csdnimg.cn/blog_migrate/5ea06fd6d659c5ceb94ff9311056cf4c.jpeg)
控制类改造
![c458d825ceffd6b6d9318a0d79932b22.png](https://i-blog.csdnimg.cn/blog_migrate/62e8dae5ab8fbc7879cb24b9c5905990.jpeg)
是不是整体很方便,只要继承相关的抽象类,就可以完成基本的CRUD操作了。
番外篇
我们发现实体类Book中定义了LocalDateTime属性
我们用postman请求
传入日期 "createTime": "2014-01-01T01:00:00", 后台可以接收
传入"createTime": "2014-01-01 01:00:00", 页面有如下异常信息
JSON parse error: Can not deserialize value of type java.time.LocalDateTime from String
本文中用的序列化方式为:
Maven: com.fasterxml.jackson.core:jackson-databind:2.8.8
![d9fa963ca8fd741a368f0837d96ce2ea.png](https://i-blog.csdnimg.cn/blog_migrate/6dd73dc8b37d266af464bb041b504c11.jpeg)
为什么传2014-01-01T01:00:00 这个字符串可以被后台解析呢?
原因在JavaTimeModule类中:
默认配置对LocalDateTime配置序列化和反序列化类
![a22143e7b01ffba3a10ee5c42e7d36d3.png](https://i-blog.csdnimg.cn/blog_migrate/1da898b8ffdd987c1ad2d37812ba9336.jpeg)
LocalDateTimeSerializer类默认日期格式,有个 T 拼接字符,问题就出在这里,所以2014-01-01 01:00:00后台反序列化失败
![eabaca7126c0513bb1999a2bc6e311c5.png](https://i-blog.csdnimg.cn/blog_migrate/5619afb2f487e18ae92c0763b69032d5.jpeg)
解决方案:自己指定日期解析格式
![924b1a360079851e65c35aae451e94df.png](https://i-blog.csdnimg.cn/blog_migrate/5e592dbbba032da7cbc5a2439a140225.jpeg)
总结
以上就是springboot与mongoDB集成环境的初步搭建,今天就分享到这里了,谢谢!!!
---End---