本篇博客主讲如何使用SpringBoot操作MongoDB。
SpringBoot操作MongoDB实现增删改查
(1)pom.xml引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>1234(2)创建application.yml
spring: data: mongodb: host: 192.168.72.129 database: studentdb12345(3)创建实体类创建包com.changan.mongodb,包下建包pojo 用于存放实体类,创建实体类
package com.changan.mongdb.pojo;
import org.springframework.data.annotation.Id;import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
@Document(collection = "student")public class Student implements Serializable {
@Id private Long id;
private String name;
private String sex;
private String age;
private String introduce;
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; }
public String getAge() { return age; }
public void setAge(String age) { this.age = age; }
public String getIntroduce() { return introduce; }
public void setIntroduce(String introduce) { this.introduce = introduce; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162(4)创建数据访问接口com.changan.mongodb包下创建dao包,包下创建接口
package com.changan.mongdb.dao;
import com.changan.mongdb.pojo.Student;
import java.util.List;import java.util.Map;
public interface StudentDao {
void save(Student student);
void update(Student student);
List<Student> findAll();
void delete(Integer id);}
12345678910111213141516171819(5)创建业务逻辑类com.changan.mongodb包下创建impl包,包下创建类
package com.changan.mongdb.dao.impl;
import com.changan.mongdb.dao.StudentDao;import com.changan.mongdb.pojo.Student;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.aggregation.Aggregation;import org.springframework.data.mongodb.core.aggregation.LookupOperation;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.stereotype.Component;
import java.util.List;
@Componentpublic class StudentDaoImpl implements StudentDao {
@Autowired private MongoTemplate mongoTemplate;
/** * 新增信息 * @param student */ @Override public void save(Student student) { mongoTemplate.save(student); }
/** * 修改信息 * @param student */ @Override public void update(Student student) { //修改的条件 Query query = new Query(Criteria.where("id").is(student.getId()));
//修改的内容 Update update = new Update(); update.set("name",student.getName());
mongoTemplate.updateFirst(query,update,Student.class); }
/** * 查询所有信息 * @return */ @Override public List<Student> findAll() { return mongoTemplate.findAll(Student.class); }
/** * 根据id查询所有信息 * @param id */ @Override public void delete(Integer id) { Student byId = mongoTemplate.findById(1,Student.class); mongoTemplate.remove(byId); }
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566(6)创建测试类
package com.changan.mongdb;
import com.changan.mongdb.dao.StudentDao;import com.changan.mongdb.pojo.Student;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;import java.util.Map;
@RunWith(SpringRunner.class)@SpringBootTestpublic class MongdbApplicationTests {
@Autowired private StudentDao studentDao;
/** * 查询所有信息 */ @Test public void findAll() { List<Student> all = studentDao.findAll(); System.out.println(all.size()); }
/** * 新增信息 */ @Test public void save() { Student student = new Student(); student.setId(6l); student.setName("宋人头"); studentDao.save(student); }
/** * 修改信息 */ @Test public void update() { Student student = new Student(); student.setId(2l); student.setName("吴很帅"); studentDao.update(student); }
/** * 删除信息 */ @Test public void delete(http://www.my516.com) { studentDao.delete(3); }}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
---------------------
SpringBoot操作MongoDB实现增删改查
标签:factory bean HERE etag with vat save database mongdb
小编还为您整理了以下内容,可能对您也有帮助:
MongoDB内嵌数组文档,怎么只针对数组里的数据做增删改查
有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下:
<!-- lang: js -->
{
"_id" : "195861",
"tags" : [
{
"tagId" : NumberLong(766),
"optDate" : ISODate("2013-08-12T15:21:02.930Z"),
"enable" : true
},
{
"tagId" : NumberLong(778),
"optDate" : ISODate("2013-08-12T15:21:02.930Z"),
"enable" : true
}
]
}
下面对这个文档中的tag进行增删该查操作,这里用到了spring mongodb 里面的MongoTemplate类。我这里把tags里的内嵌文档抽象成了Tag类。代码删除和修改本身就包含查询方法,所以没写查询方法
代码如下:
<!-- lang: java -->
/**
*
* @author zhangdonghao
*
*/
@Component("UserrTagServiceImpl")
public class UserrTagServiceImpl implements UserrTagService {
/**
* Mongo DB Spring Template
*/
@Resource
protected MongoTemplate mongoTemplate = null;
public UserrTagServiceImpl() {
}
/**
**给tags数组添加一个元素
*/
@Override
public Response<Integer> addTag(String id, Long tagId) {
try {
Tag tag = new Tag(tagId);
tag.setOptDate(new Date());
tag.setEnable(true);
Query query = Query.query(Criteria.where("_id").is(id));
Update update = new Update();
update.addToSet("tags", tag);
mongoTemplate.upsert(query, update, User.class);
} catch (Exception e) {
return new Response<Integer>(0);
}
return new Response<Integer>(1);
}
/**
**修改tags数组中内嵌文档指定一个元素的值
*/
@Override
public Response<Integer> disableTag(String id, Long tagId) {
try {
Query query = Query.query(Criteria.where("_id").is(id)
.and("tags.tagId").is(tagId));
Update update = new Update();
update.set("tags.$.enable", false);
mongoTemplate.updateFirst(query, update, User.class);
} catch (Exception e) {
return new Response<Integer>(0);
}
return new Response<Integer>(1);
}
/**
**删除tags数组中指定的内嵌文档
*/
@Override
public Response<Integer> removeTag(String id, Long tagId) {
try {
Query query = Query.query(Criteria.where("_id").is(id)
.and("tags.tagId").is(tagId));
Update update = new Update();
update.unset("tags.$");
mongoTemplate.updateFirst(query, update, User.class);
} catch (Exception e) {
return new Response<Integer>(0);
}
return new Response<Integer>(1);
}
public MongoTemplate getMongoTemplate() {
return mongoTemplate;
}
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
}
SpringBoot WebFlux整合MongoDB实现CRUD及分页功能
环境:Springboot2.5.8
请先阅读:
Reactor响应式编程(Flux、Mono)基本用法
Spring WebFlux入门实例并整合数据库实现基本的增删改查
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
特点:
Spring框架中包含的原始web框架Spring Web MVC是专门为ServletAPI和Servlet容器构建的。反应式堆栈web框架Spring Web Flux后来在5.0版中添加。它是完全非阻塞的,支持反应流背压(由消费者控制生产者的速度),并在Netty、Undertow和Servlet 3.1+容器等服务器上运行。
这两个web框架都反映了它们的源模块(Spring Web MVC和Spring Web Flux)的名称,并在Spring框架存。每个模块都是可选的。应用程序可以使用一个或另一个模块,在某些情况下,可以同时使用这两个模块 — 例如,带有反应式WebClient的Spring MVC控制器。
配置文件
完毕!!!
Spring Cloud 中断路器 Circuit Breaker的应用
Spring Cloud Gateway应用详解1之谓词
SpringCloud Feign实现原理源分析
SpringCloud Nacos 服务动态配置
SpringCloud Hystrix实现资源隔离应用
SpringCloud zuul 动态网关配置
Spring Cloud全链路追踪SkyWalking及整合Elasticsearch
SpringBoot整合MongoDB实战
MongoTemplate配置
一般情况下,按照如下配置,springboot会进行自动装配,但是如果需要实现一些自定义的功能,例如密码加解密,类型转换等功能需要手写配置MongoTemplate。
@EnableMongoRepositories()表示支持Spring JPA,即通过规范命名的接口来实现简单的DB操作,不需要自己写Query,可以通过该注解的value属性来指定注解的作用范围。
ReUtil是一个正则表达式的工具类,用于判断配置文件的格式是否正确,配置MongoDatabaseFactory过程中实现一个比较简单的配置文件解密的过程,解密方法用简单的字符串翻转来实现。
通过MappingMongoConverter来实现java中的对象与MongoDB中的Document进行一些复杂的映射,默认情况下一个java域对象存入MongoDB时会生成一个"_class"的key对应存储Java对象类型,通过
来取消每条记录生成一个"-class"的数据。
通过MappingMongoConverter实现一个简单的时间转化功能TimestampConverter,如下所示
还可以进行更加精细化的配置,例如
可以通过WritingConverter和ReadingConverter配置Document和Java对象相互转化。
MongoTemplate实战
例如一个博客系统,我们通过MongoDB存储用户的浏览记录,浏览记录的实体如下所示,
如上所示,每个人对应每篇文章有一条浏览记录,每次访问都会对访问次数viewCount进行+1操作.下文针对这个场景介绍MongoTemplate的基本操作。
这些操作用法基本一样,如下所示,传入一个封装查询条件的对象Query,Java中映射的对象entityClass和MongoDB中对应的Document的名称。
例如我们想要查询某个用户某篇博客的访问次数,我们只需要通过博客id和访问者构建查询条件进行查询即可。
findAndModify表示更新符合查询条件的记录,其方法如下所示,
Query封装查询条件,Update封装的是更新内容。例如用户每次刷新页面浏览次数会+1操作,我们可以使用findAndModify操作,如下所示
如上所示,首先判断用户是否存在访问记录,如果存在则通过Update对访问次数viewCount进行+1操作,若不存在访问记录则新建访问记录。
保存操作包括主要包括insert和save方法,这两个方法都没有返回值,同时两个方法有一些区别,
该方法如下所示,
注释说明该方法的功能是,如果存在与查询条件匹配的文档,则根据Update中的内容进行更新,如果不存在符合查询条件的内容,则根据查询条件和Update插入新的文档。
聚合查询 MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。本文侧重于Java实现。
结合上述中的访问记录的场景,如果我们需要统计某个博主某个专栏下面所有文章的访问记录,包括访问总人数,访问总次数,以及每个访客对应的访问次数详情,并且要满足分页需求,那么我们需要用到MongoDB的聚合操作,具体实现如下所示
总结
本文详细介绍了SpringBoot如何整合MongoDB,并且结合博客系统的访问记录展示了MongoTemplate的基本用法。
spring mongodb 查询去重数据
引用相关的命名空间xmlns:mongo="http://www.springframework.org/schema/data/mongo"
,并且在名为mongoTemplate中注入相关的数据库地址,数据库名即可,使用方法如下:
ApplicationContext ctx = new GenericXmlApplicationContext("mongo-config.xml");追问Query query = Query.query(Criteria
.where("").is())
spring 整合的 上面语句 QUERY CRITERIA