首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

SpringBoot操作MongoDB实现增删改查

2023-11-12 来源:花图问答

本篇博客主讲如何使用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

显示全文