关于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 ...
随机推荐
- 听说又有兄弟因为用YYYY-MM-dd被锤了...
还记得去年分享过一篇日期格式化使用 YYYY-MM-dd 的潜在问题的文章不? 历史又重演了... 事故现场 我们来写个单元测试,重现一下这个问题. 测试逻辑: 创建两个日期格式化,一个是出问题的YY ...
- 二本非科班,秋招,实习,面试,offer之路
不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...
- 第13章节 BJROBOT 雷达跟随【ROS全开源阿克曼转向智能网联无人驾驶车】
雷达跟随说明:注意深度摄像头的 USB 延长线,可能会对雷达扫描造成影响, 所以在雷达跟随前,把深度摄像头的 USB 延长线取下.另外雷达跟随范围大概是前方 50cm 和 120°内扫描到的物体都可以 ...
- swing桌面四子棋程序开发过程中遇到的一些问题记录(二)
第二个遇到的问题是将JButton按钮设置成透明的按钮.首先UI给我一张透明的图片,如果我直接给Button按钮设置背景图片的话,是没有透明的效果的,只会留下白色的底,设置前后的效果如下图 制作透明的 ...
- ASP.NET Core路由中间件[3]: 终结点(Endpoint)
到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...
- Apache的Mod_rewrite学习(RewriteRule重写规则的语法) 转
RewriteRuleSyntax: RewriteRule Pattern Substitution [flags] 一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要.对Apa ...
- Nginx集成Naxsi防火墙
前言 因工作原因,接触到了WAF,今天部署了一下Naxsi,记录一下 GitHub 正文 环境 Centos 7 下载 更新yum yum update -y 安装必要依赖 yum install g ...
- linux + svn提交日志不能显示 日期一直都是1970-01-01
网上很多都是说将svn安装目录下的svnserve.conf文件中的anon-access 设置为read,但是 经查阅并测试, 设置为: anon-access = none 是正确的,设置成 r ...
- Linux 服务器安装node环境
Linux 装 node 环境 我的是 CentOS 查看服务器是多少位系统 getconf LONG_BIT 下载地址, 下载对应的版本: http://nodejs.cn/download/ 我这 ...
- drop table 命令不回收以前的相关访问权限
drop table 命令不回收以前的相关访问权限,也就是说假如我现在把表删除了,然后再创建一个同名的表时,会自动赋予权限的.