SpringBoot整合MongoDB
前言
了解Spring Data。
Spring Data 是 Spring 框架的一个子项目,旨在简化与各种数据存储技术(如关系型数据库、NoSQL数据库、图数据库等)的集成和操作。它提供了一种统一的编程模型和API,使开发人员能够以一致的方式访问和操作不同类型的数据存储。Spring Data 通过提供通用的 CRUD 操作、查询方法、事务管理和数据访问抽象层等功能,简化了数据访问层的开发工作。它还提供了与 Spring 框架其他模块(如Spring Boot、Spring MVC等)的无缝集成,使开发人员能够更轻松地构建全栈应用程序。
官网地址:https://springdoc.cn/spring-data/
一、环境搭建
1、引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
2、编写配置文件
# mongodb 没有开启任何安全协议
# mongodb(协议)://192.168.10.130(主机):27017(端口)/gedeshidai(库名)
spring.data.mongodb.uri=mongodb://192.168.10.130:27017/gedeshidai
# mongodb 存在密码
#spring.data.mongodb.host=192.168.10.130
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=gedeshidai
#spring.data.mongodb.username=root
#spring.data.mongodb.password=root
二、集合
1、创建集合
@Test
public void testCreateCollection(){
mongoTemplate.createCollection("users");//参数: 创建集合名称
}
注意: 创建的集合已经存在时,再次创建会报错,因此创建前需要判断集合时候已经存在
/**
* 创建集合
*/
@Test
public void testCreateCollection(){
// 判断集合是否存在
boolean isExist = mongoTemplate.collectionExists("products");
// 不存在时创建集合
if (!isExist) {
mongoTemplate.createCollection("products");
}
}
2、删除集合
/**
* 删除集合
*/
@Test
public void testDropCollection(){
mongoTemplate.dropCollection("products");
}
三、文档
1、相关注解
-
@Document 对应 类
-
修饰范围: 用在类上
-
作用: 用来映射这个类的一个对象为 mongo 中一条文档数据
-
属性:(value 、collection )用来指定操作的集合名称
-
-
@Id 对应 要指定为_id的变量名
-
修饰范围: 用在成员变量、方法上,只能出现一次
-
作用: 用来将成员变量的值映射为文档的_id 的值
-
-
@Field 对应 剩余变量名(变量名都按照类中属性名定义时,可以不指定,即同名时可不指定)
-
修饰范围: 用在成员变量、方法上
-
作用: 用来将成员变量以及值映射为文档中一个key、value对
-
属性: ( name,value)用来指定在文档中 key 的名称,默认为成员变量名
-
-
@Transient 不参与文档转换
-
修饰范围: 用在成员变量、方法上
-
作用 : 用来指定改成员变量,不参与文档的序列化
-
2、文档操作
2.1、查询
-
Criteria
-
常见查询
@Test
public void testQuery(){
//基于 id 查询
template.findById("1",User.class);
//查询所有
template.findAll(User.class);
template.find(new Query(),User.class);
//等值查询
template.find(Query.query(Criteria.where("name").is("哥的时代")),
User.class);
// > gt < lt >= gte <= lte
template.find(Query.query(Criteria.where("age").lt(25)),
User.class);
template.find(Query.query(Criteria.where("age").gt(25)),
User.class);
template.find(Query.query(Criteria.where("age").lte(25)),
User.class);
template.find(Query.query(Criteria.where("age").gte(25)),
User.class);
//and
template.find(Query.query(Criteria.where("name").is("哥的时代")
.and("age").is(23)),User.class);
//or
Criteria criteria = new Criteria()
.orOperator(Criteria.where("name").is("哥的时代_1"),
Criteria.where("name").is("哥的时代_2"));
template.find(Query.query(criteria), User.class);
//and or
Criteria criteria1 = new Criteria()
.and("age").is(23)
.orOperator(
Criteria.where("name").is("哥的时代_1"),
Criteria.where("name").is("哥的时代_2"));
template.find(Query.query(criteria1), User.class);
//sort 排序
Query query = new Query();
query.with(Sort.by(Sort.Order.desc("age")));//desc 降序 asc 升序
template.find(query, User.class);
//skip limit 分页
Query queryPage = new Query();
queryPage.with(Sort.by(Sort.Order.desc("age")))//desc 降序 asc 升序
.skip(0) //起始条数
.limit(4); //每页显示记录数
template.find(queryPage, User.class);
//count 总条数
template.count(new Query(), User.class);
//distinct 去重
//参数 1:查询条件 参数 2: 去重字段 参数 3: 操作集合 参数 4: 返回类型
template.findDistinct(new Query(), "name",
User.class, String.class);
//使用 json 字符串方式查询
Query query = new BasicQuery(
"{$or:[{name:'哥的时代'},{name:'徐凤年'}]}",
"{name:0}");
template.find(query, User.class);
}
2.2、添加
@Test
public void testSaveOrUpdate(){
User user = new User();
user.setId("1");
user.setAge(23);
user.setName("哥的时代_1");
user.setBir(new Date());
User userDB = mongoTemplate.insert(user);//返回保存的对象 insert or save
System.out.println(userDB);
}
-
插入重复数据时:
-
insert报DuplicateKeyException提示主键重复;
-
save对已存在的数据进行更新。
-
-
批处理操作时:
-
insert可以一次性插入整个数据,效率较高;
-
save需遍历整个数据,一次插入或更新,效率较低。
-
2.3、更新
@Test
public void testUpdate(){
//1.更新条件
Query query = Query.query(Criteria.where("age").is(23));
//2.更新内容
Update update = new Update();
update.set("name","哥的时代");
//单条更新
mongoTemplate.updateFirst(query, update, User.class);
//多条更新
mongoTemplate.updateMulti(query, update, User.class);
//更新插入
mongoTemplate.upsert(query,update,User.class);
//返回值均为 updateResult
//System.out.println("匹配条数:" + updateResult.getMatchedCount());
//System.out.println("修改条数:" + updateResult.getModifiedCount());
//System.out.println("插入id_:" + updateResult.getUpsertedId());
}
2.4、删除
@Test
public void testDelete(){
//删除所有
mongoTemplate.remove(new Query(),User.class);
//条件删除
mongoTemplate.remove(
Query.query(Criteria.where("name").is("哥的时代")),
User.class
);
}
四、整合
1、pom.xml依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2、application.properties配置
# mongodb 没有开启任何安全协议
# mongodb(协议)://192.168.10.130(主机):27017(端口)/gedeshidai(库名)
spring.data.mongodb.uri=mongodb://192.168.10.130:27017/gedeshidai
# mongodb 存在密码
#spring.data.mongodb.host=192.168.10.130
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=gedeshidai
#spring.data.mongodb.username=root
#spring.data.mongodb.password=root
3、实体类User
package com.study.entity;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.Date;
@Data
@Accessors(chain = true)
@Document(value = "users")
public class User {
@Id
private Integer id;
@Field(value = "username")
private String name;
@Field
private Double salary;
@Field
private Date birthday;
}
4、测试类
package com.study.test;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.study.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.BasicQuery;
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 java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SpringBootTest
public class MongodbTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 创建集合
*/
@Test
public void testCreateCollection() {
// 判断集合是否存在
boolean isExist = mongoTemplate.collectionExists("products");
// 不存在时创建集合
if (!isExist) {
mongoTemplate.createCollection("products");
}
}
/**
* 删除集合
*/
@Test
public void testDropCollection() {
mongoTemplate.dropCollection("products");
}
/**
* 添加单个文档1
*/
@Test
public void testSaveDocument() {
User user = new User();
user.setId(1)
.setName("熊大")
.setSalary(800.0)
.setBirthday(new Date());
mongoTemplate.save(user);
}
/**
* 添加单个文档2
*/
@Test
public void testAddDocument() {
User user = new User();
user.setId(2)
.setName("熊二")
.setSalary(500.0)
.setBirthday(new Date());
mongoTemplate.insert(user);
}
/**
* 批量添加文档
*/
@Test
public void testBatchInsertDocument() {
List<User> userList = new ArrayList<>();
userList.add(new User().setId(6).setName("猪猪侠").setSalary(1000.0).setBirthday(new Date()));
userList.add(new User().setId(7).setName("小呆呆").setSalary(600.0).setBirthday(new Date()));
userList.add(new User().setId(8).setName("波比").setSalary(50.0).setBirthday(new Date()));
// mongoTemplate.insert(userList, User.class);
// 上下两种方式均可,上面指定类名,下面指定集合名
mongoTemplate.insert(userList, "users");
}
/**
* 查询操作
*/
@Test
public void testFind() {
// 1.查询所有
List<User> users = mongoTemplate.findAll(User.class, "users");
users.forEach(System.out::println);
System.out.println();
// 或
List<User> userList = mongoTemplate.findAll(User.class);
userList.forEach(System.out::println);
System.out.println();
// 2.基于id查一个
User user = mongoTemplate.findById(1, User.class, "users");
System.out.println(user);
System.out.println();
// 或
User user2 = mongoTemplate.findById(1, User.class);
System.out.println(user2);
System.out.println();
// 3.条件查询
// 3.1 查询所有
List<User> users2 = mongoTemplate.find(
new Query(), User.class, "users"
);
users2.forEach(System.out::println);
System.out.println();
// 或
List<User> usersList2 = mongoTemplate.find(
new Query(), User.class
);
usersList2.forEach(System.out::println);
System.out.println();
// 3.2 等值查询:注意值要写对类型,例如不要将Integer写成String
List<User> users3 = mongoTemplate.find(
new Query(Criteria.where("salary").is(600)), User.class
);
users3.forEach(System.out::println);
System.out.println();
// 3.3 不等值查询
List<User> users1 = mongoTemplate.find(
new Query().addCriteria(Criteria.where("salary").gt(800)), User.class
);
users1.forEach(System.out::println);
System.out.println();
// 3.4 and查询
List<User> users4 = mongoTemplate.find(
new Query().addCriteria(Criteria.where("salary").gt(800).and("name").is("光头强")), User.class
);
users4.forEach(System.out::println);
System.out.println();
// 3.5 or查询
List<User> users5 = mongoTemplate.find(
new Query().addCriteria(
new Criteria().orOperator(
Criteria.where("salary").gt(800),
Criteria.where("name").is("小呆呆"))),
User.class
);
users5.forEach(System.out::println);
System.out.println();
// 3.6 and、or查询连用
List<User> users6 = mongoTemplate.find(
new Query().addCriteria(
new Criteria().orOperator(
Criteria.where("name").in("光头强", "小呆呆")))
.addCriteria(Criteria.where("salary").is(600)), User.class
);
users6.forEach(System.out::println);
System.out.println();
// 4.排序
List<User> users7 = mongoTemplate.find(
new Query().with(Sort.by(Sort.Order.desc("salary"))), User.class
);
users7.forEach(System.out::println);
System.out.println();
// 5.排序后分页
List<User> users8 = mongoTemplate.find(
new Query().with(Sort.by(Sort.Order.asc("salary")))
.skip(0)
.limit(2), User.class
);
users8.forEach(System.out::println);
System.out.println();
// 6.查询总条数
long count = mongoTemplate.count(new Query(), User.class);
System.out.println("count = " + count);
System.out.println();
// 7.去重
List<Double> salaryList = mongoTemplate.findDistinct(new Query(), "salary", User.class, Double.class);
salaryList.forEach(System.out::println);
System.out.println();
// 8.使用json字符串方式查询
Query query = new BasicQuery("{$or: [{name:'小呆呆'},{name:'光头强'}]}", "{birthday:0}");
List<User> users9 = mongoTemplate.find(
query, User.class
);
users9.forEach(System.out::println);
}
/**
* 更新文档
*/
@Test
public void testUpdateDocument() {
Update update = new Update();
update.set("salary", 2500);
// 更新一条
mongoTemplate.updateFirst(
Query.query(Criteria.where("salary").is(1000)),
update,
User.class);
update.set("salary", 1500);
// 更新多条
mongoTemplate.updateMulti(
Query.query(Criteria.where("salary").lt(200)),
update,
User.class
);
// 插入更新
update.setOnInsert("id", 10);
update.set("name", "我是之前没有的");
// 更新多条
UpdateResult updateResult = mongoTemplate.upsert(
Query.query(Criteria.where("salary").gt(30000)),
update,
User.class
);
System.out.println("updateResult.getMatchedCount() = " + updateResult.getMatchedCount());
System.out.println("updateResult.getModifiedCount() = " + updateResult.getModifiedCount());
System.out.println("updateResult.getUpsertedId() = " + updateResult.getUpsertedId());
}
/**
* 文档删除
*/
@Test
public void testRemoveDocument() {
DeleteResult deleteResult = mongoTemplate.remove(Query.query(Criteria.where("id").is(9)), User.class);
System.out.println("deleteResult.getDeletedCount() = " + deleteResult.getDeletedCount());
}
}
总结
以上就是SpringBoot整合MongoDB的相关知识,希望对你有所帮助。
积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!
- 点赞
- 收藏
- 关注作者
评论(0)