一、前言

  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. 本地缓存性能之王Caffeine

    前言 随着互联网的高速发展,市面上也出现了越来越多的网站和app.我们判断一个软件是否好用,用户体验就是一个重要的衡量标准.比如说我们经常用的微信,打开一个页面要十几秒,发个语音要几分钟对方才能收到. ...

  2. JVM内存设置多大合适?Xmx和Xmn如何设置?

    JVM内存设置多大合适?Xmx和Xmn如何设置?   问题:新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢? 分析:依 ...

  3. dede织梦技巧:教你彻底解决dede按权重排序的问题(转)

    dede排序对网站来说一直存在问题,默认是按照最新发布时间排序.这样排序有个问题,一旦更新之后即被视为最新发布,于是原本做好的排序瞬间就乱了. 这种时候,按权重排序是个很好的选择,但按权重排序到处存在 ...

  4. 安卓手机使用Termux及搭建FTP服务器

    Termux安装配置设置参见: 国光:Termux高级终端使用配置教程 搭建FTP服务器参见: Termux安装使用FTP服务器

  5. PHP 导入Excel数据 到数据库

    /** * 导入excel * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception */ public function ...

  6. Java 安全之Weblogic 2017-3248分析

    Java 安全之Weblogic 2017-3248分析 0x00 前言 在开头先来谈谈前面的绕过方式,前面的绕过方式分别使用了streamMessageImpl 和MarshalledObject对 ...

  7. LeetCode707 设计链表

    设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...

  8. Docker学习笔记之基本命令使用

    测试的环境为Ubuntu1804. 1. search命令搜索镜像 sudo docker search centos 搜索centos相关的镜像,可以看到第一个最多星的的centos是官方的镜像,而 ...

  9. 【原创】X86_64汇编、寄存器、内嵌汇编

    整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...

  10. 【ORACLE】ASMM和AMM的相关问题

    转自:http://m.blog.itpub.net/31397003/viewspace-2137469/ 关于ASMM和AMM http://blog.itpub.net/29800581/vie ...