关于MongoDB的简单理解(三)--Spring Boot篇
一、前言
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篇的更多相关文章
- Spring Boot 项目学习 (三) Spring Boot + Redis 搭建
0 引言 本文主要介绍 Spring Boot 中 Redis 的配置和基本使用. 1 配置 Redis 1. 修改pom.xml,添加Redis依赖 <!-- Spring Boot Redi ...
- 【swagger】1.swagger提供开发者文档--简单集成到spring boot中【spring mvc】【spring boot】
swagger提供开发者文档 ======================================================== 作用:想使用swagger的同学,一定是想用它来做前后台 ...
- Spring Boot系列(三) Spring Boot 之 JDBC
数据源 类型 javax.sql.DataSource javax.sql.XADataSource org.springframework.jdbc.datasource.embedded,Enbe ...
- spring boot:用redis+lua实现基于ip地址的分布式流量限制(限流/简单计数器算法)(spring boot 2.2.0)
一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处 ...
- 关于MongoDB的简单理解(二)--Java篇
一.声明 本文依赖于 MongoDB JVM DRIVERS 4.1 版本编写. 本文案例依赖于 Maven 项目管理工具. 二.本文主要讲解哪些内容? 如何连接到MongoDB 通过TLS/SSL连 ...
- 从源码看Spring Security之采坑笔记(Spring Boot篇)
一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...
- 关于MongoDB的简单理解(一)--基础篇
一.什么是MongoDB? MongoDB是一个基于分布式文件存储的文档数据库,旨在简化开发和扩展,为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之 ...
- 简单使用:spring boot整合spring Data JPA
JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.jpa具有什么优势? (1).标准 ...
- 简单使用idea Spring Boot搭建项目
第一步:使用Spring Initializr创建 第二步:项目配置 第三步:选择项目需要的依赖 第五步: ok 创建完成,修改仓库 maven{ url 'http://maven.aliyun.c ...
随机推荐
- ArrayList之SubList源码解析
subList是ArrayList的内部类, public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck( ...
- RTC_Configuration
Void RTC_Configuration(void)// 实时时钟的初始化配置 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Peri ...
- win8.1下jdk的安装和环境变量的配置 eclipse的安装和汉化
1.首先下载jdk安装包,安装的时候会有两个文件安装,一个是jdk一个是jre建议两个文件不要安装在一个目录下 2.安装jdk后面就是配置环境变量,path和classpath,path要在用户变量中 ...
- JUC包-原子类(AtomicInteger为例)
目录 JUC包-原子类 为什么需要JUC包中的原子类 原子类原理(AtomicInteger为例) volatile CAS CAS的缺点 ABA问题 什么是ABA问题 ABA问题的解决办法 JUC包 ...
- Python 日志打印之logging.config.dictConfig使用总结
日志打印之logging.config.dictConfig使用总结 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.confi ...
- 痞子衡嵌入式:MCUBootUtility v3.0发布,开始支持LPC, Kinetis啦
-- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.4.0)发布过去2个半月了,这一次痞子衡为大家带来了全新版本v3.0.0,从这个版本开始,NXP-MCUBootUtil ...
- Akka Typed 官方文档之随手记
️ 引言 近两年,一直在折腾用FP与OO共存的编程语言Scala,采取以函数式编程为主的方式,结合TDD和BDD的手段,采用Domain Driven Design的方法学,去构造DDDD应用(Dom ...
- ForwardProcess
共享式网络中,发送的报文所有设备都可以收到 0.0.0.0/0 缺省路由 可以到达任意网络 From WizNote
- Linux常用命令(df&dh)
在Linux下查看磁盘空间使用情况,最常使用的就是du和df了.然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊. du的工作原理 du命令会对待统计文件逐个调用fstat这个系统调用,获取文件 ...
- WebSocket协议中文版
WebSocket协议中文版 摘要 WebSocket协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信.用于这个安全模型是通常由web浏览器使用 ...