MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 – 引用自runnoob
一个MongoDB的BSON数据结构如下:
首先当然需要建立一个SpringBoot项目,接着在项目的pom.xml中引入spring-boot-starter-data-mongodb。坐标如下:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>2.2.1.RELEASE</version> </dependency>
在项目的application.properties中添加Mongodb连接配置
################################################################### # MongoDB ################################################################### # 进行认证的db,一般就是admin spring.data.mongodb.authentication-database=admin # 需要进行交互的db,需要实现创建 spring.data.mongodb.database=snowalker # mongodb所在机器的ip/域名 spring.data.mongodb.host=127.0.0.1 # mongodb对外提供服务的端口,默认为27017 spring.data.mongodb.port=27017 # 用户名及密码,可主动在admin库中添加并授权 spring.data.mongodb.username=root spring.data.mongodb.password=root
需要编写一个实体类,该实体类就是一个POJO。这里我们以书籍信息为例
public class BookInfo { private String id; private String name; private String author; // 省略getter setter
这一步较为核心,我们通过编写一个MongoDB的交互接口,实现对MongoDB的操作。这一切只需要让自定义的接口继承MongoRepository接口即可,整体的风格类似于JPA。
public interface BookInfoRepository extends MongoRepository<BookInfo, String> { List<BookInfo> findByAuthorContains(String author); BookInfo findByNameEquals(String bookName); }
我们的接口一旦继承了MongoRepository就能够使用最基本的CURD等操作,而且我们可以根据自己的需求进行操作的扩展。
这里介绍一下如何进行方法扩展。
实际上,在SpringData中,只要方法的定义符合既定规范,则Spring Data就可以分析出开发者的意图,从而避免开发者自定义一些诸如SQL、指令等操作。当然这就仁者见仁智者见智了,笔者认为,对于简单的操作,用这种方法可以很好的提升开发效率,但如果需要针对业务有一些复杂的操作,则自定义SQL、指令应当更加灵活。
常见的命名规则如下:
如果是简单条件查询的场景,如:需要对某一个实体类或者集合进行查询。
按照Spring Data的规范的规定,查询方法应当以 find | read | get开头 (如:find、findBy、read、readBy、get、getBy)。
涉及到查询条件时,条件属性需要用条件关键字进行连接。这里需要注意:条件属性首字母应当大写。当框架进行方法名解析时,会先把方法名的多余前缀截取掉,然后对剩下部分进行解析。
对于直接在接口中定义的查询方法,如果符合规范的,则可以不用写实现,目前支持的关键字写法如下:
到此我们就基本上完成了对MongoDB的整合,接下来就编写一个测试接口对MongoDB进行操作,验证整合是否有效。
@RestController public class BookInfoController { @Autowired BookInfoRepository bookInfoRepository; @GetMapping(value = "mongo") public BookInfo testMongo() throws JsonProcessingException { List<BookInfo> bookInfos = new ArrayList<>(); // 添加数据 for (int i = 0; i < 3; i++) { String uuid = UUID.randomUUID().toString(); BookInfo bookInfo = new BookInfo(); bookInfo.setId(i + "_" + uuid).setAuthor("刘慈欣").setName("三体_" + uuid); bookInfos.add(bookInfo); } // 入Mongo bookInfoRepository.insert(bookInfos); // 查询By author List<BookInfo> queryList = bookInfoRepository.findByAuthorContains("刘慈欣"); ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writeValueAsString(queryList); System.out.println(s); // 查询by Name BookInfo bookInfo = bookInfoRepository.findByNameEquals("三体_89e9a1e3-6597-4415-9699-b5bfb33632ae"); if (bookInfo == null) { return new BookInfo(); } return bookInfo; } }
对上述的测试方法testMongo()稍作总结:
启动项目,访问测试接口: http://localhost:10880/mongo,返回如下json串:
{"id":"2_89e9a1e3-6597-4415-9699-b5bfb33632ae","name":"三体_89e9a1e3-6597-4415-9699-b5bfb33632ae","author":"刘慈欣"}
这表明,我们对Mongodb的整合是ok的,并且成功实现了数据的插入和查询等操作。
本文我们主要介绍了在SpringBoot中如何通过整合spring-boot-starter-data-mongodb实现对MongoDB的操作。
当我们对spring-data使用的更加熟练,就会感受到Spring对于开发者的友好,通过各种封装的组件实现了对不同底层数据源的统一封装,接口对开发者保持风格一致,降低了开发者的学习成本。这种封装思想也同样值得我们去学习借鉴。
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。