1 简介

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

代码结构如下:

2 项目准备

2.1 启动MongoDB实例

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

2.2 引入相关依赖

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.3 配置数据库连接信息

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

server.port=8080

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=testdb
spring.data.mongodb.username=user
spring.data.mongodb.password=123456
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017

2.4 创建数据模型实体

创建User类如下:

package com.pkslow.mongo.model;

import org.springframework.data.annotation.Id;
import java.util.Date; public class User {
@Id
private String userId;
private String name;
private Integer age;
private Date createTime = new Date(); public String getUserId() {
return userId;
} public void setUserId(String userId) {
this.userId = userId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}

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

3 方式1:MongoRepository

3.1 定义数据访问层UserRepository

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

package com.pkslow.mongo.dal;

import com.pkslow.mongo.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository; @Repository
public interface UserRepository extends MongoRepository<User, String> {
}

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

3.2 实现Controller

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

package com.pkslow.mongo.contrlloer;

import com.pkslow.mongo.dal.UserRepository;
import com.pkslow.mongo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; @RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private final UserRepository userRepository; public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
} @GetMapping("")
public List<User> getAllUsers() {
return userRepository.findAll();
} @GetMapping("/{userId}")
public User getByUserId(@PathVariable String userId) {
return userRepository.findById(userId).orElse(new User());
} @PostMapping("")
public User addNewUser(@RequestBody User user) {
return userRepository.save(user);
} @DeleteMapping("/{userId}")
public String delete(@PathVariable String userId) {
User user = new User();
user.setUserId(userId);
userRepository.deleteById(userId);
return "deleted: " + userId;
} @PutMapping("")
public User update(@RequestBody User user) {
return userRepository.save(user);
}
}

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

3.3 测试

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

4 方式2:MongoTemplate

4.1 定义数据访问层UserDAL

先定义接口为:

package com.pkslow.mongo.dal;

import com.pkslow.mongo.model.User;
import java.util.List; public interface UserDAL {
List<User> findAll(); User findById(String userId); User save(User user); void deleteById(String userId);
}

然后实现该接口如下:

package com.pkslow.mongo.dal;

import com.pkslow.mongo.model.User;
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.stereotype.Repository;
import java.util.List; @Repository
public class UserDALImpl implements UserDAL { @Autowired
private MongoTemplate template; @Override
public List<User> findAll() {
return template.findAll(User.class);
} @Override
public User findById(String userId) {
return template.findById(userId,User.class);
} @Override
public User save(User user) {
return template.save(user);
} @Override
public void deleteById(String userId) {
Query query = new Query();
query.addCriteria(Criteria.where("userId").is(userId));
template.remove(query, User.class);
}
}

4.2 实现另一个Controller

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

package com.pkslow.mongo.contrlloer;

import com.pkslow.mongo.dal.UserDAL;
import com.pkslow.mongo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; @RestController
@RequestMapping("/userTemplate")
public class UserTemplateController { @Autowired
private final UserDAL userDAL; public UserTemplateController(UserDAL userDAL) {
this.userDAL = userDAL;
} @GetMapping("")
public List<User> getAllUsers() {
return userDAL.findAll();
} @GetMapping("/{userId}")
public User getByUserId(@PathVariable String userId) {
return userDAL.findById(userId);
} @PostMapping("")
public User addNewUser(@RequestBody User user) {
return userDAL.save(user);
} @DeleteMapping("/{userId}")
public String delete(@PathVariable String userId) {
User user = new User();
user.setUserId(userId);
userDAL.deleteById(userId);
return "deleted: " + userId;
} @PutMapping("")
public User update(@RequestBody User user) {
return userDAL.save(user);
}
}

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. C# 在DataGridView中,点击单元格调出 TreeView控件 或 ListBox控件

    1.调出 TreeView控件 或  ListBox控件 private void deductGrid1_CellClick(object sender, DataGridViewCellEvent ...

  2. 升级Kubernetes 1.18前,你不得不知的9件事

    本文来自Rancher Labs 昨天Kubernetes最新版本v1.18已经发布,其包含了38项功能增强,其中15项为稳定版功能.11项beta版功能以及12项alpha版功能.在本文中,我们将探 ...

  3. DRF之restful规范、Postman接口测试

    一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...

  4. 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载

    前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...

  5. 【深度学习】Neural networks(神经网络)(一)

    神经网络的图解 感知机,是人工设置权重.让它的输出值符合预期. 而神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数. 如果用图来表示神经网络,最左边的一列称为输入层,最右边的一列称为输 ...

  6. Excel中减少两边的字符

    从右边减少几个字符: =LEFT(A1,LEN(A1)-4)

  7. 字符串中的count()方法

    描述 Python count() 方法用于统计字符串里某个字符出现的次数.可选参数为在字符串搜索的开始与结束位置. 语法 count()方法语法: str.count(sub, start= 0,e ...

  8. 一文读懂什么是CA证书

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...

  9. USCOSII

    一.要求 下载附件,尝试在vc6.0中编译运行ucos 下载附件,尝试在vs2017中编译运行ucos,给出你遇到的问题和解决方式 ucos是如何分层的? HAL都有哪些代码? 分析任务是如何切换的? ...

  10. SpringAOP入门

    Spring的AOP aop概述 Aspect Oriented Programing 面向切面(方面)编程, aop:扩展功能不修改源代码实现 aop采取横向抽取机制,取代了传统纵向继承体系重复性代 ...