一、前言

  Spring Boot集成MongoDB非常简单,主要为加依赖加配置编码

二、说明

环境说明:

  • JDK版本为15(1.8+即可)
  • Spring Boot 2.4.1

三、集成步骤

3.1 添加依赖

<!-- 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.4.1</version>
</dependency>

3.2添加配置

spring:
# mongo连接
data:
mongodb:
uri: mongodb://mydb:mydb@127.0.0.1:27017/mydb

四、案例

4.1 基于MongoRepository实现对MongoDB的操作

4.1.1 新建客户实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id; @Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
// 客户
public class Customer { // 主键ID
// 此种方式ID需要自己设定
@Id
private String id; // // 主键ID
// // 采用此种方式会自动生成ID
// private ObjectId id; // 名字
private String firstName; // 姓氏
private String lastName;
}

4.1.2 新建客户仓库并实现MongoDB仓库

import com.ruiyicloud.bbfbusiness.entity.mongo.Customer;
import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface CustomerRepository extends MongoRepository<Customer, String> { /**
* 根据名字查找客户
* @param firstName 名字
* @return
*/
Customer findByFirstName(String firstName); /**
* 根据姓氏查找客户
* @param lastName 姓氏
* @return
*/
List<Customer> findByLastName(String lastName); }

4.1.3 创建控制器,对接口方法进行测试

import com.ruiyicloud.bbfbusiness.entity.mongo.Customer;
import com.ruiyicloud.bbfbusiness.service.mongo.CustomerRepository;
import com.ruiyicloud.comm.result.Result;
import com.ruiyicloud.comm.result.ResultGenerator;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*; import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional; import static com.ruiyicloud.comm.utils.check.CheckUtil.notNull; /**
* <p>
* MongoDB相关操作
* </p>
*
* @author wanggx_ruiyi
* @since 2021-01-19
*/
@Api(description="MongoDB相关操作",tags={"MongoDB"})
@RestController
@RequestMapping("/api/v1/mongo/mongoTest")
public class MongoTestController {
@Resource
private CustomerRepository customerRepository; @InitBinder
protected void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
} /**
* @create wanggx_ruiyi 2021-01-19 新增客户信息
* @param customer 客户模型
* @return
*/
@ApiOperation(value="新增",notes = "新增")
@PostMapping("/add")
public Result<Customer> add(@ApiParam(name = "customer", value = "客户模型", required = true) @RequestBody Customer customer) { notNull(customer, "输入参数不能为空"); return ResultGenerator.genSuccessResult(customerRepository.save(customer));
} /**
* @create wanggx_ruiyi 2021-01-19 批量新增客户信息
* @param customerList 客户模型列表
* @return
*/
@ApiOperation(value="批量新增",notes = "批量新增")
@PostMapping("/batchAdd")
public Result<List<Customer>> batchAdd(
@ApiParam(name = "customerList", value = "客户模型", required = true) @RequestBody List<Customer> customerList) { notNull(customerList, "输入参数不能为空"); return ResultGenerator.genSuccessResult(customerRepository.saveAll(customerList));
} /**
* @create wanggx_ruiyi 2021-01-19 根据名字查找客户
* @param firstName 名字
* @return
*/
@ApiOperation(value="根据名字查找客户",notes = "根据名字查找客户")
@PostMapping("/findByFirstName")
public Result<Customer> findByFirstName(
@ApiParam(name = "firstName", value = "名字", required = true) @RequestParam String firstName) { notNull(firstName, "输入参数不能为空"); return ResultGenerator.genSuccessResult(customerRepository.findByFirstName(firstName));
} /**
* @create wanggx_ruiyi 2021-01-19 根据姓氏查找客户
* @param lastName 姓氏
* @return
*/
@ApiOperation(value="根据姓氏查找客户",notes = "根据姓氏查找客户")
@PostMapping("/findByLastName")
public Result<List<Customer>> findByLastName(
@ApiParam(name = "lastName", value = "姓氏", required = true) @RequestParam String lastName) { notNull(lastName, "输入参数不能为空"); return ResultGenerator.genSuccessResult(customerRepository.findByLastName(lastName));
} /**
* @create wanggx_ruiyi 2021-01-19 根据id查找客户
* @param id 数据id
* @return
*/
@ApiOperation(value="根据id查找客户",notes = "根据id查找客户")
@PostMapping("/findById")
public Result<Customer> findById(
@ApiParam(name = "id", value = "数据ID", required = true) @RequestParam String id) { notNull(id, "输入参数不能为空"); Optional<Customer> customer = customerRepository.findById(id);
return ResultGenerator.genSuccessResult(customer.isPresent() ? customer.get() : null);
} /**
* @create wanggx_ruiyi 2021-01-19 根据id判断客户是否存在
* @param id 数据id
* @return
*/
@ApiOperation(value="根据id判断客户是否存在",notes = "根据id判断客户是否存在")
@PostMapping("/existsById")
public Result<Boolean> existsById(
@ApiParam(name = "id", value = "数据ID", required = true) @RequestParam String id) { notNull(id, "输入参数不能为空"); return ResultGenerator.genSuccessResult(customerRepository.existsById(id));
} /**
* @create wanggx_ruiyi 2021-01-19 查找所有客户
* @return
*/
@ApiOperation(value="查找所有客户",notes = "查找所有客户")
@PostMapping("/findAll")
public Result<List<Customer>> findAll() { return ResultGenerator.genSuccessResult(customerRepository.findAll());
} /**
* @create wanggx_ruiyi 2021-01-19 查找所有客户(排序)
* @return
*/
@ApiOperation(value="查找所有客户(排序)",notes = "查找所有客户(排序)")
@PostMapping("/findAllBySort")
public Result<List<Customer>> findAllBySort() { return ResultGenerator.genSuccessResult(customerRepository.findAll(Sort.by("id")));
} }

4.2 基于通用MyBatis Mapper插件的Service接口的实现

4.2.1 创建MongonService接口

import org.springframework.data.domain.Pageable;
import java.util.List;

/**
* MongonService 层 基础接口,其他有关mongo的Service 接口 请继承该接口
*/
public interface MongonService<T> {
/**
* 持久化
* @param model
*/
void save(T model);

/**
* 批量持久化
* @param models
*/
void save(List<T> models);

/**
* 通过_id刪除
* @param id
*/
void deleteById(String id);

/**
* 批量删除
* @param models
*/
void deleteAll(List<T> models);

/**
* 更新每个实体--需自己实现
* @param model
* @return
*/
int update(T model);

/**
* 通过ID查找
* @param id
* @return
*/
T findById(String id);

/**
* 获取所有
* @return
*/
List<T> findAll();

/**
* 通过分页查询
* @param pageable
* @return
*/
List<T> findByPage(Pageable pageable);
}

4.2.2 创建AbstractMongoService抽象类实现MongonService接口

import com.ruiyicloud.bbfbusiness.service.mongo.MongonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query; import java.lang.reflect.ParameterizedType;
import java.util.List; /**
* 基于通用MyBatis Mapper插件的Service接口的实现
*/
public abstract class AbstractMongoService<T> implements MongonService<T> { /**
* 由springboot自动注入,默认配置会产生mongoTemplate这个bean
*/
@Autowired
private MongoTemplate mongoTemplate; // 当前泛型真实类型的Class
private Class<T> modelClass; public AbstractMongoService() {
// 返回表示由该类对象表示的实体(类、接口、基元类型或void)的直接超类的类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
// 返回表示此类型的实际类型参数的类型对象数组。
modelClass = (Class<T>) pt.getActualTypeArguments()[0];
} /**
* 插入一个集合
*/
@Override
public void save(List<T> models) {
mongoTemplate.insertAll(models);
} /**
* 查找全部
*/
@Override
public List<T> findAll() {
return mongoTemplate.findAll(modelClass);
} /**
* 根据id得到对象
*/
@Override
public T findById(String id) {
return mongoTemplate.findById(id, modelClass);
// return mongoTemplate.findOne(new Query(Criteria.where("_id").is(id)), modelClass);
} /**
* 插入
*/
@Override
public void save(T model) {
mongoTemplate.insert(model);
} /**
* 根据id删除
*/
@Override
public void deleteById(String id) {
T model = findById(id);
mongoTemplate.remove(model);
// Criteria criteria = Criteria.where("_id").is(id);
// Query query = new Query(criteria);
// mongoTemplate.remove(query,modelClass);
} /**
* 批量删除
*
* @param models
*/
@Override
public void deleteAll(List<T> models) {
for (T model : models) {
mongoTemplate.remove(model);
}
} /**
* 分页查找
* pageable代表分页bean
*/
@Override
public List<T> findByPage(Pageable pageable) {
Query query = new Query();
List<T> list = mongoTemplate.find(query.with(pageable), modelClass);
return list;
}
}

4.2.3 使用示例

// Service 示例代码
public interface EmrFileInfoService extends MongonService<EmrFileInfo>{}
// Service impl 示例代码
@Service
public class EmrFileInfoServiceImpl extends AbstractMongoService<EmrFileInfo> implements EmrFileInfoService {}

五、总结

  总的来说,Spring Boot集成MongoDB非常简单。

关于MongoDB的简单理解(三)--Spring Boot篇的更多相关文章

  1. Spring Boot 项目学习 (三) Spring Boot + Redis 搭建

    0 引言 本文主要介绍 Spring Boot 中 Redis 的配置和基本使用. 1 配置 Redis 1. 修改pom.xml,添加Redis依赖 <!-- Spring Boot Redi ...

  2. 【swagger】1.swagger提供开发者文档--简单集成到spring boot中【spring mvc】【spring boot】

    swagger提供开发者文档 ======================================================== 作用:想使用swagger的同学,一定是想用它来做前后台 ...

  3. Spring Boot系列(三) Spring Boot 之 JDBC

    数据源 类型 javax.sql.DataSource javax.sql.XADataSource org.springframework.jdbc.datasource.embedded,Enbe ...

  4. spring boot:用redis+lua实现基于ip地址的分布式流量限制(限流/简单计数器算法)(spring boot 2.2.0)

    一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处 ...

  5. 关于MongoDB的简单理解(二)--Java篇

    一.声明 本文依赖于 MongoDB JVM DRIVERS 4.1 版本编写. 本文案例依赖于 Maven 项目管理工具. 二.本文主要讲解哪些内容? 如何连接到MongoDB 通过TLS/SSL连 ...

  6. 从源码看Spring Security之采坑笔记(Spring Boot篇)

    一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...

  7. 关于MongoDB的简单理解(一)--基础篇

    一.什么是MongoDB? MongoDB是一个基于分布式文件存储的文档数据库,旨在简化开发和扩展,为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之 ...

  8. 简单使用:spring boot整合spring Data JPA

    JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.jpa具有什么优势? (1).标准 ...

  9. 简单使用idea Spring Boot搭建项目

    第一步:使用Spring Initializr创建 第二步:项目配置 第三步:选择项目需要的依赖 第五步: ok 创建完成,修改仓库 maven{ url 'http://maven.aliyun.c ...

随机推荐

  1. JavaDailyReports10_18

    学习内容:HTML基本知识 1.通常标记具有默认属性,当一个标记中只有标记名时,使用默认属性. 2.HTML标记有两种:单标记和双标记,单标记的语法格式:  <标记名称/> 3.不同的属性 ...

  2. Linux 如何选择要kill掉的进程

    从网上的找了一个比较全面的如下: OOM Killer在内存耗尽时,会查看所有进程,并分别为每个进程计算分数.将信号发送给分数最高的进程.  计算分数的方法  在OOM Killer计算分数时要考虑很 ...

  3. 二进制格式mysql

    1.二进制MySQL安装 #下载二进制格式的mysql软件包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.31- ...

  4. 2.1 关系型数据的收集--Sqoop

    Sqoop应用场景: 1.数据迁移,将关系型数据库中的数据导入Hadoop存储系统 2.可视化分析结果,将Hadoop处理之后产生的结果导入关系型数据库,以便进行可视化展示 3.数据增量导入:减少ha ...

  5. 我的开源项目在五个月内超过了 600 star

    其实我在 2016 年年底就开始写了这个项目:Forest,一个能够将 HTTP 的所有请求信息(包括 URL .Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能 ...

  6. git版本回滚

    本地版本回滚 git reset --hard <版本号> (git log 可查看版本号,版本号不用写全) 远程仓库版本回滚 先在本地将版本回滚 ,然后git push -f 强制提交

  7. OpenWRT19.07_命令行_重拨wan_重启路由

    OpenWRT19.07_命令行_重拨wan_重启路由 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-10-19. 写OpenWRT的脚本时,需要用到一些重启命令 以下的命令中的参 ...

  8. tf.lin_space

    .lin_spae{ start, stop, num, name=None } start:张量(float32,或者float64类型) stop:张量(和start相同) num:张量(int3 ...

  9. 杭电OJ:1089----1096(c++)(ACM入门第一步:所有的输入输出格式)

    1089:输入输出练习的A + B(I) 问题描述 您的任务是计算a + b. 太容易了?!当然!我专门为ACM初学者设计了这个问题. 您一定已经发现某些问题与此标题具有相同的名称,是的,所有这些问题 ...

  10. Solon rpc 之 SocketD 协议 - 消息订阅模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...