前言

上一章节,简单讲解了如何集成Spring-data-jpa。本章节,我们来看看如何集成NoSQLMongodbmongodb是最早热门非关系数据库的之一,使用也比较普遍。最适合来存储一些非结构数据了,适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。

一点知识

以下部分关于Mongodb介绍,来自网站:https://www.mongodb.com/cn纯洁的微笑

MongoDB简介

MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新。与此同时,它也为开发人员 提供了传统数据库的功能:二级索引,完整的查询系统以及严格一致性等等。 MongoDB能够使企业更加具有敏捷性和可扩展性,各种规模的企业都可以通过使用MongoDB来创建新的应用,提高与客户之间的工作效率,加快产品上市时间,以及降低企业成本。

MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企业级的可靠性和操作灵活性。

简单来说,MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。

MongoDB支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型,也因为他的存储格式也使得它所存储的数据在Nodejs程序应用中使用非常流畅。

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。

MongoDB的适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事物支持较弱,不适用复杂的多文档(多表)的级联查询。

SpringBoot集成MongoDB

得力于SpringBoot方便性,集成MongoDB也是很简单的。可通过三种方式进行访问,分别是:原生Db对象MongoTemplate以及MongoRepository。原生的方式需要连接其语法规则,这里就不阐述了,毕竟不熟悉。还是使用封装好的吧,开箱急用!

准备工作

本文示例的MongoDB版本为:4.0.3。

可视化工具为:studio-3t-x64。

至于MongoDB如何安装,大家简单百度下就好了,很简单。下载个msi,直接安装即可。

下载地址:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.3-signed.msi

0.加入POM依赖。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>

1.创建实体。

  1. /**
  2. * 通知消息对象
  3. * @author oKong
  4. *
  5. */
  6. @Document(collection="notify_msg")//集合名
  7. @Data
  8. @Builder
  9. @NoArgsConstructor
  10. @AllArgsConstructor
  11. public class NotifyMsg implements Serializable{
  12. /**
  13. *
  14. */
  15. private static final long serialVersionUID = -8985545025018238754L;
  16. @Id
  17. String id;
  18. /**
  19. * 消息类型
  20. */
  21. @Indexed
  22. String notifyType;
  23. /**
  24. * 消息单号
  25. */
  26. @Indexed
  27. String notifyNo;
  28. /**
  29. * 消息通知日期
  30. */
  31. String notifyDate;
  32. /**
  33. * 消息体
  34. */
  35. @Field("notifyMsg")//可指定存储时的字段名
  36. String notifyMsg;
  37. /**
  38. * 创建时间
  39. */
  40. @CreatedDate
  41. Date gmtCreate;
  42. }

这里注意:@Document(collection="notify_msg") 表示:操作的集合为:notify_msg

这个可手动使用工具创建下。

另外,针对@CreatedDate注解,也和之前的jpa用法一直,创建时会自动赋值,需要在启动类中添加@EnableMongoAuditing注解使其生效!

同时,可使用@Field注解,可指定存储的键值名称,默认就是类字段名。如设置@Field("notify_Msg")后,效果如下:

2.配置文件中填写连接地址。

  1. #mongodb
  2. # 单机模式 mongodb://name:pass@ip:port/database
  3. # 集群模式 mongodb://user:pwd@ip1:port1,ip2:port2/database
  4. spring.data.mongodb.uri=mongodb://127.0.0.1:27017/learning

注意,这里填写格式

  • 单机模式:mongodb://name:pwd@ip:port/database
  • 集群模式:mongodb://name:pwd@ip1:port1,ip2:port2/database

3.启动类编写。

  1. /**
  2. * mongodb 集成示例
  3. * @author oKong
  4. *
  5. */
  6. @SpringBootApplication
  7. @EnableMongoAuditing
  8. //@EnableMongoRepositories(basePackages="cn.lqdev")//当有些dao不在default page下时 可通过此方法进行注册扫描包
  9. @Slf4j
  10. public class MongodbApplication {
  11. public static void main(String[] args) throws Exception {
  12. SpringApplication.run(MongodbApplication.class, args);
  13. log.info("spring-boot-mongodb-chapter31启动!");
  14. }
  15. }

注意:当使用MongoRepositories时,可能有些MongoRepositories类不在默认的包路径(启动类路径)下,可使用@EnableMongoRepositoriesbasePackages需要扫描的路径信息。若都在默认的包路径下,可以不加此注解的。

MongoTemplate方式

以下示例下MongoTemplate方式进行数据操作。

0.创建一个接口类:

  1. /**
  2. * 接口服务
  3. * @author oKong
  4. *
  5. */
  6. public interface NotifyMsgService {
  7. /**
  8. * 保存数据
  9. * @author 作者:oKong
  10. */
  11. NotifyMsg saveNotifyMsg(NotifyMsg msg);
  12. /**
  13. * 根据消息号查找
  14. * @author 作者:oKong
  15. */
  16. NotifyMsg findNotifyMsgByNo(String notifyNo);
  17. /**
  18. * 根据消息日期查找
  19. * @author 作者:oKong
  20. */
  21. List<NotifyMsg> findNotifyMsgByDate(String notifyDate);
  22. /**
  23. * 根据id进行删除 返回删除的对象
  24. * @author 作者:oKong
  25. */
  26. NotifyMsg delNotifyMsgById(String id);
  27. }

1.接口实现类,引入MongoTemplate

  1. /**
  2. * MongoTemplate 访问实现
  3. * @author oKong
  4. *
  5. */
  6. @Service
  7. public class NotifyMsgServiceImpl implements NotifyMsgService{
  8. @Autowired
  9. MongoTemplate mongoTemplate;
  10. @Override
  11. public NotifyMsg saveNotifyMsg(NotifyMsg msg) {
  12. //使用 save和insert都可以进行插入
  13. //区别:当存在"_id"时
  14. //insert 插入已经存在的id时 会异常
  15. //save 则会进行更新
  16. //简单来说 save 就是不存在插入 存在更新
  17. mongoTemplate.insert(msg);
  18. mongoTemplate.save(msg);
  19. return msg;
  20. }
  21. @Override
  22. public NotifyMsg findNotifyMsgByNo(String notifyNo) {
  23. //根据Criteria 改造查询条件
  24. Query query = new Query(Criteria.where("notifyNo").is(notifyNo));
  25. return mongoTemplate.findOne(query, NotifyMsg.class);
  26. }
  27. @Override
  28. public List<NotifyMsg> findNotifyMsgByDate(String notifyDate) {
  29. //查找 notifyDate 根据Criteria 改造查询条件
  30. Query query = new Query(Criteria.where("notifyDate").is(notifyDate));
  31. return mongoTemplate.find(query, NotifyMsg.class);
  32. }
  33. @Override
  34. public NotifyMsg delNotifyMsgById(String id) {
  35. //查找 id 根据Criteria 改造查询条件
  36. Query query = new Query(Criteria.where("id").is(id));
  37. return mongoTemplate.findAndRemove(query, NotifyMsg.class);
  38. }
  39. }

针对查询,可以使用org.springframework.data.mongodb.core.query.Criteria对象进行构造查询条件。其提供的方法如下:

具体使用时,可根据实际情况进行组合查询条件。

针对saveinsert也需要注意下:

  • 在无_id情况下,两者都能进行新增操作。
  • 存在_id,同时记录库里不存在,两者都是进行插入操作。
  • 存在_id,同时库里也存在记录save相当于进行更新操作。而insert直接就异常了。

2.创建示例控制层。

  1. /**
  2. * mongoTemplate 示例
  3. * @author oKong
  4. *
  5. */
  6. @RestController
  7. @RequestMapping("/template")
  8. @Slf4j
  9. public class MongoTemplateController {
  10. @Autowired
  11. NotifyMsgService notifyMsgService;
  12. @PostMapping("/add")
  13. public NotifyMsg add(NotifyMsg msg) {
  14. log.info("mongoTemplate方式新增:{}", msg);
  15. return notifyMsgService.saveNotifyMsg(msg);
  16. }
  17. @PostMapping("del/{id}")
  18. public NotifyMsg del(@PathVariable String id) {
  19. log.info("mongoTemplate方式删除:{}", id);
  20. return notifyMsgService.delNotifyMsgById(id);
  21. }
  22. @GetMapping("/find/{no}")
  23. public NotifyMsg findNotifyMsgByNo(@PathVariable String no){
  24. log.info("mongoTemplate方式查找:notifyNo-{}", no);
  25. return notifyMsgService.findNotifyMsgByNo(no);
  26. }
  27. @GetMapping("/find/list/{date}")
  28. public List<NotifyMsg> findNotifyMsgByDate(@PathVariable String date){
  29. log.info("mongoTemplate方式查找:notifyDate-{}", date);
  30. return notifyMsgService.findNotifyMsgByDate(date);
  31. }
  32. }

3.启动应用,使用Postman进行访问。

可以看见,已经返回对应的信息,同时数据库也可看见记录了。

其他的都是类似的,大家可自行访问下:

MongoRepository方式

以上还需要自己编写一些类啥的,现在是jpa的方式进行操作数据,优雅,简单。

0.创建资源类

  1. /**
  2. * MongoRepository 示例
  3. * @author oKong
  4. *
  5. */
  6. public interface NotifyMsgDao extends MongoRepository<NotifyMsg, String>{
  7. /*
  8. * 根据消息号进行查询
  9. */
  10. NotifyMsg findByNotifyNo(String notifyNo);
  11. /**
  12. * 根据日期查询 自定义查询
  13. * @author 作者:oKong
  14. */
  15. //需要注意 查询的语法结构 ,同时这里和`jpa`不一样的地方是,第一个索引值从0 开始。。
  16. @Query("{'notifyDate':?0}")
  17. Page<NotifyMsg> queryBySql(String notifyDate,Pageable pageable);
  18. }

这里需要注意一个地方:和上一章节的自定义sql不同之处是,参数索引值从0开始。

同时,要注意查询的语法。具体用法,可查看:https://docs.spring.io/spring-data/mongodb/docs/1.10.14.RELEASE/reference/html/#mongodb.repositories.queries 这里简单截图下:

1.编写示例控制层。

  1. /**
  2. * MongoRepository 示例
  3. * @author oKong
  4. *
  5. */
  6. @RestController
  7. @RequestMapping("/repository")
  8. @Slf4j
  9. public class MongoRepositoryController {
  10. @Autowired
  11. NotifyMsgDao notifyMsgDao;
  12. @PostMapping("/add")
  13. public NotifyMsg add(NotifyMsg msg) {
  14. log.info("repository方式新增:{}", msg);
  15. return notifyMsgDao.save(msg);
  16. }
  17. @GetMapping("/find/sql/{date}")
  18. public Page<NotifyMsg> queryBySql(@PathVariable String date){
  19. Pageable pageable = new PageRequest(0, 10);
  20. log.info("repository方式分页sql查找日期:{}", date);
  21. return notifyMsgDao.queryBySql(date, pageable);
  22. }
  23. @GetMapping("/find/{no}")
  24. public NotifyMsg findByNotifyNo(@PathVariable String no) {
  25. log.info("repository方式查找单号:{}", no);
  26. return notifyMsgDao.findByNotifyNo(no);
  27. }
  28. }

2.启动应用,使用Postman,访问具体的方法,就可以看见相关结果了。

也可直接利用可视化工具,直接查看数据信息

参考资料

  1. https://docs.spring.io/spring-data/mongodb/docs/1.10.14.RELEASE/reference/html

  2. https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#boot-features-mongodb

  3. https://www.mongodb.com/cn

  4. http://www.ityouknow.com/springboot/2017/05/08/springboot-mongodb.html

总结

本章节主要介绍了Mongodb的集成和简单的使用。相关更加详细的用法,可取官网查阅下,若使用MongoRepository模式,基本和上章节讲的Spring-data-jpa用法差不多,有些细微差别,就是自定义查询sql上了,毕竟一个是关系型数据库,一个是NoSql数据库,查询的语法还有略有不同的。而使用MongoRepository还是MongoTemplate,就看个人喜好了。自从接触了jpa后,是倾向于前者的,毕竟真的比较简单呀!想多复杂用法的大家自定查阅官网信息吧。

最后

目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

老生常谈

  • 个人QQ:499452441
  • 微信公众号:lqdevOps

个人博客:http://blog.lqdev.cn

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-31

原文地址:http://blog.lqdev.cn/2018/11/01/springboot/chapter-thirty-one/

SpringBoot | 第三十一章:MongoDB的集成和使用的更多相关文章

  1. Gradle 1.12用户指南翻译——第三十一章. FindBugs 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  2. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. C#高级编程(第六版)学习:第三十一章:Windows窗体

    第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...

  4. “全栈2019”Java第三十一章:二维数组和多维数组详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 第三十一章、containers容器类部件QDockWidget停靠窗功能介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...

  6. SpringBoot | 第三十三章:Spring web Servcies集成和使用

    前言 最近有个单位内网系统需要对接统一门户,进行单点登录和待办事项对接功能.一般上政府系统都会要求做统一登录功能,这个没啥问题,反正业务系统都是做单点登录的,改下shiro相关类就好了.看了接入方案, ...

  7. SpringBoot | 第三十七章:集成Jasypt实现配置项加密

    前言 近期在进行项目安全方面评审时,质量管理部门有提出需要对配置文件中的敏高文件进行加密处理,避免了信息泄露问题.想想前段时间某公司上传github时,把相应的生产数据库明文密码也一并上传了,导致了相 ...

  8. SpringBoot | 第三十章:Spring-data-jpa的集成和使用

    前言 在前面的第九章:Mybatis-plus的集成和使用章节中,介绍了使用ORM框架mybatis-plus进行数据库的访问.今天,我们来简单学习下如何使用spring-data-jpa进行数据库的 ...

  9. springBoot系列教程02:mongodb的集成及使用

    1.安装mongodb mongdb的安装很简单,只需要下载解压后运行mongod就好了 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86 ...

随机推荐

  1. opencv3.3.1+vs2015+c++实现直接在图像上画掩码,保存掩码图片

    左键红右键蓝,保存为k #include "opencv2\imgproc\imgproc.hpp" // Gaussian Blur #include "opencv2 ...

  2. storm集群快速搭建

    sudo mkdir /export/serverssudo chmod -R 777 /exportmkdir /export/servers tar -zxvf apache-storm-1.0. ...

  3. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」

    题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...

  4. [51nod]1229 序列求和 V2(数学+拉格朗日差值)

    题面 传送门 题解 这种颓柿子的题我可能死活做不出来-- 首先\(r=0\)--算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\) 设 \[s_p ...

  5. 190310HTML&CSS&JS

    一.HTML 1.web server import socket def handle_request(client): buf = client.recv(1024) client.send(by ...

  6. IntersectionObserver

    创建对象 var io = new IntersectionObserver(callback, option); IntersectionObserver是浏览器原生提供的构造函数,接受两个参数:c ...

  7. RNA-seq分析htseq-count的使用

    HTSeq作为一款可以处理高通量数据的python包,由Simon Anders, Paul Theodor Pyl, Wolfgang Huber等人携手推出HTSeq — A Python fra ...

  8. CodeForces - 1110E-Magic Stones(差分+思维)

    Grigory has nn magic stones, conveniently numbered from 11 to nn. The charge of the ii-th stone is e ...

  9. Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)

    目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...

  10. hibernateUtil类

    package com.test.Util; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfi ...