1 简介

Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在分布式、微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合MongoDB的两种方法:MongoRepositoryMongoTemplate

代码结构如下:

2 项目准备

2.1 启动MongoDB实例

为了方便,使用Docker来启动MongoDB,详细指导文档请参考:用Docker安装一个MongoDB最新版玩玩 ,这里不再赘述。

2.2 引入相关依赖

主要的依赖为WebMongoDBstarter,把下面代码加入到pom.xml中即可:

  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>

2.3 配置数据库连接信息

与配置MySQLOracle一样,MongoDB也需要配置连接信息,配置在application.properties中如下:

  1. server.port=8080
  2. spring.data.mongodb.authentication-database=admin
  3. spring.data.mongodb.database=testdb
  4. spring.data.mongodb.username=user
  5. spring.data.mongodb.password=123456
  6. spring.data.mongodb.host=localhost
  7. spring.data.mongodb.port=27017

2.4 创建数据模型实体

创建User类如下:

  1. package com.pkslow.mongo.model;
  2. import org.springframework.data.annotation.Id;
  3. import java.util.Date;
  4. public class User {
  5. @Id
  6. private String userId;
  7. private String name;
  8. private Integer age;
  9. private Date createTime = new Date();
  10. public String getUserId() {
  11. return userId;
  12. }
  13. public void setUserId(String userId) {
  14. this.userId = userId;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public Integer getAge() {
  23. return age;
  24. }
  25. public void setAge(Integer age) {
  26. this.age = age;
  27. }
  28. public Date getCreateTime() {
  29. return createTime;
  30. }
  31. public void setCreateTime(Date createTime) {
  32. this.createTime = createTime;
  33. }
  34. }

不需要在MongoDB中创建对应的Collections(表),当通过Web应用新增时会自动创建。

3 方式1:MongoRepository

3.1 定义数据访问层UserRepository

使用过Spring Jpa的都清楚,Repository实际就是用于操作数据库的类。在非关系型数据库MongoDB的整合中,也是一样的。Spring会帮我们实现好对应接口的方法,开发人员连SQL都不用写,非常省心。代码如下:

  1. package com.pkslow.mongo.dal;
  2. import com.pkslow.mongo.model.User;
  3. import org.springframework.data.mongodb.repository.MongoRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface UserRepository extends MongoRepository<User, String> {
  7. }

注意MongoRepository后面接的泛型<User, String>第一个为实体类,第二个为主键ID

3.2 实现Controller

Controller比较基础,就不讲解了,常用的注解是必须要掌握的,直接上代码吧:

  1. package com.pkslow.mongo.contrlloer;
  2. import com.pkslow.mongo.dal.UserRepository;
  3. import com.pkslow.mongo.model.User;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. import java.util.List;
  7. @RestController
  8. @RequestMapping("/user")
  9. public class UserController {
  10. @Autowired
  11. private final UserRepository userRepository;
  12. public UserController(UserRepository userRepository) {
  13. this.userRepository = userRepository;
  14. }
  15. @GetMapping("")
  16. public List<User> getAllUsers() {
  17. return userRepository.findAll();
  18. }
  19. @GetMapping("/{userId}")
  20. public User getByUserId(@PathVariable String userId) {
  21. return userRepository.findById(userId).orElse(new User());
  22. }
  23. @PostMapping("")
  24. public User addNewUser(@RequestBody User user) {
  25. return userRepository.save(user);
  26. }
  27. @DeleteMapping("/{userId}")
  28. public String delete(@PathVariable String userId) {
  29. User user = new User();
  30. user.setUserId(userId);
  31. userRepository.deleteById(userId);
  32. return "deleted: " + userId;
  33. }
  34. @PutMapping("")
  35. public User update(@RequestBody User user) {
  36. return userRepository.save(user);
  37. }
  38. }

注意代码没有做异常情况的判断和处理,这里为了快速演示,就先不管了。

3.3 测试

Postman测试后,每个接口均调用成功。就不一一截图了。

4 方式2:MongoTemplate

4.1 定义数据访问层UserDAL

先定义接口为:

  1. package com.pkslow.mongo.dal;
  2. import com.pkslow.mongo.model.User;
  3. import java.util.List;
  4. public interface UserDAL {
  5. List<User> findAll();
  6. User findById(String userId);
  7. User save(User user);
  8. void deleteById(String userId);
  9. }

然后实现该接口如下:

  1. package com.pkslow.mongo.dal;
  2. import com.pkslow.mongo.model.User;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.data.mongodb.core.MongoTemplate;
  5. import org.springframework.data.mongodb.core.query.Criteria;
  6. import org.springframework.data.mongodb.core.query.Query;
  7. import org.springframework.stereotype.Repository;
  8. import java.util.List;
  9. @Repository
  10. public class UserDALImpl implements UserDAL {
  11. @Autowired
  12. private MongoTemplate template;
  13. @Override
  14. public List<User> findAll() {
  15. return template.findAll(User.class);
  16. }
  17. @Override
  18. public User findById(String userId) {
  19. return template.findById(userId,User.class);
  20. }
  21. @Override
  22. public User save(User user) {
  23. return template.save(user);
  24. }
  25. @Override
  26. public void deleteById(String userId) {
  27. Query query = new Query();
  28. query.addCriteria(Criteria.where("userId").is(userId));
  29. template.remove(query, User.class);
  30. }
  31. }

4.2 实现另一个Controller

这个Controller的代码与之前的基本一样,只是数据访问类不一样,代码如下:

  1. package com.pkslow.mongo.contrlloer;
  2. import com.pkslow.mongo.dal.UserDAL;
  3. import com.pkslow.mongo.model.User;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. import java.util.List;
  7. @RestController
  8. @RequestMapping("/userTemplate")
  9. public class UserTemplateController {
  10. @Autowired
  11. private final UserDAL userDAL;
  12. public UserTemplateController(UserDAL userDAL) {
  13. this.userDAL = userDAL;
  14. }
  15. @GetMapping("")
  16. public List<User> getAllUsers() {
  17. return userDAL.findAll();
  18. }
  19. @GetMapping("/{userId}")
  20. public User getByUserId(@PathVariable String userId) {
  21. return userDAL.findById(userId);
  22. }
  23. @PostMapping("")
  24. public User addNewUser(@RequestBody User user) {
  25. return userDAL.save(user);
  26. }
  27. @DeleteMapping("/{userId}")
  28. public String delete(@PathVariable String userId) {
  29. User user = new User();
  30. user.setUserId(userId);
  31. userDAL.deleteById(userId);
  32. return "deleted: " + userId;
  33. }
  34. @PutMapping("")
  35. public User update(@RequestBody User user) {
  36. return userDAL.save(user);
  37. }
  38. }

4.3 测试

测试一样也是全部通过:

5 总结

本文通过实例讲解了如何整合SpringbootMongoDB,主要有两种方法:MongoRepositoryMongoTemplate。代码基本在文章中已经贴出来了,如果还不清楚,可以在南瓜慢说公众号回复<SpringbootMongoDB>获取代码。


欢迎访问南瓜慢说 www.pkslow.com 获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

实例讲解Springboot整合MongoDB进行CRUD操作的两种方式的更多相关文章

  1. mybatis(二)执行CRUD操作的两种方式配置和注解

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...

  2. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  3. springboot 注册服务注册中心(zk)的两种方式

    在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,可以故障摘除和负载均衡. 我遇到过两种注 ...

  4. 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)

    1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了.架构更复杂.应用更多,要从中快速诊断出问题.找到性能瓶颈,并不是一件容易的事.因此,也随着诞生了一系列面向Dev ...

  5. MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

    先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用Maven创建的,没有使用Mave ...

  6. SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用

    一.前言 我们在开发中会经常遇到一些可能会变的值,比如数据库的密码,一些关键链接的配置等等. 都需要我们写在配置文件中,这样可以把这些配置文件放到nacos上进行管理,修改nacos的配置,咱们发布的 ...

  7. SpringBoot整合ActiveMq实现Queue和Topic两种模式(看不懂你来打我)

    目录 一.前言 二.ActiveMq的下载和使用 三.依赖准备 四.yml文件配置 五.配置Bean 六.创建生产者(Queue+Topic) 七.创建消费者(Topic模式下) 八.测试结果(Top ...

  8. 在.net core中数据操作的两种方式(Db first && Code first)

    在开发过程中我们通常使用的是Db first这种模式,而在.net core 中推荐使用的却是 code first 反正我是很不习惯这种开发模式 于是就搜寻整个微软的官方文档,终于找到了有关.net ...

  9. flask操作mongo两种方式--ORM

    #manage.py #coding=utf-8 #Flask-Script是一个可以在flask应用外部编写脚本的扩展 #常用功能: #运行一个开发的服务器 #python shell中操作数据库看 ...

随机推荐

  1. android studio 添加GSON

  2. xheditor图片上传

    前端步骤:分为三部,这三部做完之后就能正确显示富文本了 1.下载xheditor文件,并按照如下要求进行引入: <!-- xheditor富文本的文件引入 --> <script t ...

  3. 【NLP面试QA】预训练模型

    目录 自回归语言模型与自编码语言 Bert Bert 中的预训练任务 Masked Language Model Next Sentence Prediction Bert 的 Embedding B ...

  4. [最短路,floyd] Codeforces 1202B You Are Given a Decimal String...

    题目:http://codeforces.com/contest/1202/problem/B B. You Are Given a Decimal String... time limit per ...

  5. [最短路,floyd] Codeforces 1204C Anna, Svyatoslav and Maps

    题目:http://codeforces.com/contest/1204/problem/C C. Anna, Svyatoslav and Maps time limit per test 2 s ...

  6. eclipse-JEE配置Tomcat并发布第一个项目

    一.配置过程 Window--preferences--Server--Runtime Environment, 然后点击add 我下载的是Tomcat7.0,选择你的版本就行了 选择Tomcat的安 ...

  7. Building Applications with Force.com and VisualForce(Dev401)( 九):Designing Applications for Multiple Users: Putting It All Together

    Module Objectives1.Apply profiles, organization wide defaults, role hierarchy and sharing to given a ...

  8. 【干货】史上最全的Tensorflow学习资源汇总

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:AI小昕 在之前的Tensorflow系列文章中,我们教大家 ...

  9. iOS 状态栏显示/隐藏

    iOS 10为止,将在plist文件中将 View controller-based status bar appearance 设置为NO,就可以用UIApplication设置状态栏. 注意,要在 ...

  10. Activiti网关--排他网关

    排他网关 1.什么是排他网关 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策. 当流程执行到这个网关,所有分支都会判断条件是否为true,如果为 true 则执行该分 ...