Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)
作者:南瓜慢说 发布时间:2021-12-16 18:29:04
1 简介
Springboot
是最简单的使用Spring
的方式,而MongoDB
是最流行的NoSQL
数据库。两者在分布式、微服务架构中使用率极高,本文将用实例介绍如何在Springboot
中整合MongoDB
的两种方法:MongoRepository
和MongoTemplate
。
代码结构如下:
2 项目准备
2.1 启动MongoDB实例
为了方便,使用Docker
来启动MongoDB
,详细指导文档请参考:基于Docker的MongoDB实现授权访问的方法 ,这里不再赘述。
2.2 引入相关依赖
主要的依赖为Web
和MongoDB
的starter
,把下面代码加入到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 配置数据库连接信息
与配置MySQL
或Oracle
一样,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 总结
本文通过实例讲解了如何整合Springboot
和MongoDB
,主要有两种方法:MongoRepository
和MongoTemplate
。代码基本在文章中已经贴出来了,需要的可以下载源代码。
链接: https://pan.baidu.com/s/1bSu4rIkK4f7UIIWW_fZT7A 提取码: 2uei
来源:https://www.cnblogs.com/larrydpk/p/12735620.html
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:boolean result = o
- 相信绝大多数.NET玩家和我一样,常常使用Timer这个对象,而在WPF中使用DispatcherTimer的人也是很多,Dispatche
- YAMLSpring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项
- 现在很多电脑提供了蓝牙支持,很多笔记本网卡也集成了蓝牙功能,也可以采用USB蓝牙方便的连接手机等蓝牙设备进行通信。操作蓝牙要使用类库InTh
- 前面照着android系统的裁剪图片的功能自己写了一个相似的工具。功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具
- 一、项目搭建1、可以在新建项目的使用Spring MVC框架。或者创建一个简单的项目之后再用Add Framework Support来添加
- 一、先明确几个基本概念1、伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的
- 1,编写一个程序,读取文件test.txt的内容并在控制台输出。如果源文件不存在,则显示相应的错误信息。 package src;impor
- 一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下;所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其
- 为了解放程序员的双手,减少重复性代码的编写,推荐使用插件:mybatis-plus-generator 进行代码自动生成。下面我将详细介绍通
- 快速排序实现: namespace QuickSort { class QuickSort { public static void Sor
- 本文实例讲述了Java实现字符串解析为日期时间的方法。分享给大家供大家参考,具体如下:Java版本:1.8开始import java.tim
- WPF 实现筛选下拉多选控件框架使用.NET4 至 .NET6;Visual Studio 2022;创建 MultiSelect
- 功能实现:1、图片加载类ImageLoader实现:1)用阻塞队列存储要图片:BlockingQueue images = new Arra
- 正常情况下,我们是直接去string的length的,但是汉字是有两个字节的,所以直接用length是错的。如下图:所以应该用以下代码来获取
- 代理模式代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基
- 这篇文章主要介绍了SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递,文中通过示例代码介绍的非常详细,对大家的学
- Mutex类、Event类、SemaphoreSlim类和ReaderWriterLockSlim类等提供了多个进程之间的线程同步。&nbs
- C++的函数指针(function pointer)是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多,而对指
- C#消息提示框messagebox的详解及使用消息对话框是用messagebox对象的show方法显示的。MessageBox对象是命名空间