接下来介绍一下 NoSQL ,相比于 Mysql 等关系型的数据库,NoSQL (文档型数据库)由于存储的数据之间无关系,因此具备大数据量,高性能等特点,用于解决大规模数据集合多重数据种类带来的挑战,而 MongoDB 正是其中的代表,下一篇文章会介绍同类型的 Redis。
目录
2 SpringBoot 连接 MongoDB 及实现简单操作
2.3 基于 MongoRepository 实现 CRUD
源码地址:尹煜 / mongo_study · GitCode
趁着学生优惠购进了腾讯云轻量服务器,然后就倒腾各种服务器的配置了,为了简化搭建时的工作,直接上 Docker 容器,初次选择系统和重装系统都可以选择 Docker 镜像:

docker pull mongo
输出下载 mongo 的信息👇

docker run --name mongo -p 27017:27017 -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=root -d mongo
反馈信息👇


使用 navicat 测试连接是否成功👇,这就大功告成了,Windows的话过程类似(前提是有Docker环境)~

然后在 navicat 新建数据库👇

通过编译器 IDEA 实现:
ⅠNew Project

Ⅱ 添加 MongoDB 依赖

也可在之前的项目的 pom.xml 文件中直接添加,Spring 是对 MongoDB 做了进一步封装,放在Spring Data。
Ⅰ配置properties
若 Spring Boot 版本合适,那么配置完 properties 后,就可以实现自动注入了
路径:application.properties
- #springboot MongoDB配置
- spring.data.mongodb.username=root
- spring.data.mongodb.password=root
- spring.data.mongodb.authentication-database=root
- spring.data.mongodb.database=test
- spring.data.mongodb.host=localhost
- spring.data.mongodb.port=27017
- spring.data.mongodb.auto-index-creation=true
Ⅱ 配置properties
不过很可惜,由于我的 Spring Boot 版本过高-2.7.5,不支持自动注入MongoTemplate,因此需要手动创建 MongoDB 配置类👇
路径:src/main/java/com/yinyu/mongodemo/config/MongoDBConfig.java
- @Configuration
- public class MongoDBConfig{
-
- @Bean
- public MongoClient mongoClient() {
- return MongoClients.create("mongodb://账号:密码@127.0.0.1:27017/");
- }
- @Bean
- public MongoTemplate mongoTemplate() {
- return new MongoTemplate(mongoClient(),"数据库");
- }
-
- }
Ⅲ 继承 MongoDataAutoConfiguration
也可在启动类中继承自动装配类👇,这样就不用手动写 Bean 了,当然也可在 MongoDB 配置类中继承
路径:src/main/java/com/yinyu/mongodemo/MongodemoApplication.java
- @SpringBootApplication
- public class MongodemoApplication extends MongoDataAutoConfiguration {
-
- public static void main(String[] args) {
- SpringApplication.run(MongodemoApplication.class, args);
- }
-
- }
路径:src/main/java/com/yinyu/mongodemo/mongopojo/User.java
- @Builder
- @Data
- @Document("User")
- @AllArgsConstructor
- @NoArgsConstructor
- public class User {
-
- @Id
- private String id;
- @Indexed
- private String name;
- private Integer age;
- private String email;
- private String createDate;
-
- }
mongoTemplate.insert(User)
mongoTemplate.remove(query, User.class)
mongoTemplate.upsert(query, update, User.class)
mongoTemplate.findAll(User.class)
mongoTemplate.findById(, User.class)
mongoTemplate.find(query, User.class)
Query query = new Query(Criteria.where("name").is("yinyu").and("age").is(18));
Ⅰ精准条件:Criteria.and(“key”).is(“条件”)
Ⅱ 模糊条件:Criteria.and(“key”).regex(“条件”)
Ⅲ 大于:Criteria.where(“key”).gt(“条件”)
Ⅳ 小于:Criteria.where(“key”).lt(“条件”)
Ⅵ 排序:query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))
Ⅶ 添加封装条件:一个query中只能有一个andOperator(),其中 criteria 可为多个
query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu")));
首先注入 MongoTemplate 👇
- @Autowired
- private MongoTemplate mongoTemplate;
Ⅰinsert 新增
- @Test
- public void createUser() {
- User user = User.builder()
- .age(18)
- .name("yinyu")
- .email("yinyu@163.com")
- .createDate(new Date().toString()).build();
- User user1 = mongoTemplate.insert(user);
- System.out.println(user1);
- }
可以看到数据插入成功,id 自动生成 👇 ,属于 User 类!

Ⅱ findAll 查询所有
- @Test
- public void findAllUser() {
- List
userList = mongoTemplate.findAll(User.class); - userList.forEach(System.out::println);
- }
查询成功👇

Ⅲ findById 根据 Id 查询
- @Test
- public void findByIdUser() {
- User user = mongoTemplate.findById("6374e0b28c8fca48987da076",User.class);
- System.out.println(user);
- }
Ⅳ find 根据query内的查询条件
查询 name 包含 yin 、 age 大于 18 的记录:
- @Test
- public void findUser1() {
- Query query = new Query(Criteria
- .where("name").regex("yin")
- .and("age").gt(18));
- List
userList = mongoTemplate.find(query, User.class); - System.out.println(userList);
- }
Ⅴ 添加封装条件
查询 name = yinyu 、 age = 18 的记录,可能这样会好理解一些
- @Test
- public void findUser2() {
- Query query = new Query();
- query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18)));
- List
userList = mongoTemplate.find(query, User.class); - System.out.println(userList);
- }
-
-
- @Test
- public void findUser3() {
- Criteria criteria = new Criteria();
- criteria.andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18));
- List
userList = mongoTemplate.find(new Query(criteria), User.class); - System.out.println(userList);
- }
查询成功:👇

Spring Data 提供了对 mongodb 数据访问的支持,我们只需要继承 MongoRepository 类,按照 Spring Data 规范就可以了。
路径:src/main/java/com/yinyu/mongodemo/repository/UserRepository.java
- @Repository
- public interface UserRepository extends MongoRepository
{ -
-
- }
首先注入 MongoRepository 👇
- @Autowired
- private UserRepository userRepository;
Ⅰsave 新增
- @Test
- public void saveTest(){
- User user = User.builder()
- .age(12)
- .name("yinyinyu")
- .email("yinyu@163.com")
- .createDate(new Date().toString()).build();
- User user1 = userRepository.save(user);
- System.out.println(user1);
- }
新增成功👇

Ⅱ findAll 查询所有
和 MongoTemplate 不一样是,MongoRepository 的 findAll 不需要入参,因为在 Repository 类已经指定 User 类
- @Test
- public void findAllTest() {
- List
userList = userRepository.findAll(); - userList.forEach(System.out::println);
- }
查询成功👇

Ⅲ findById 根据 id 查询
注:结尾需要加 .get 才能获得获得数据,同时也可加 isPresent 用于判断该数据是否存在
- @Test
- public void getByIdTest1() {
- //获取数据
- User user = userRepository.findById("6374e0b28c8fca48987da076").get();
- System.out.println(user);
- }
-
- @Test
- public void getByIdTest2() {
- //判断该数据是否存在
- Boolean b = userRepository.findById("6374e0b28c8fca48987da076").isPresent();
- System.out.println(b);
- }
Ⅳ findAll 根据Example
- @Test
- public void findExampleTest1() {
- User user = User.builder().name("yinyu").age(18).build();
- Example
userExample = Example.of(user); - List
userList = userRepository.findAll(userExample); - userList.forEach(System.out::println);
- }
Ⅴ findAll 添加匹配器-matcher 模糊查询
- @Test
- public void findExampleTest2() {
- User user = User.builder().name("yinyu").age(18).build();
- //创建匹配器,即如何使用查询条件
- ExampleMatcher matcher = ExampleMatcher.matching()
- .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
- .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
- Example
userExample = Example.of(user,matcher); - List
userList = userRepository.findAll(userExample); - System.out.println(userList);
- }
SpringBoot 2.5 整合MongoDB踩坑记录及解决方法_HellHellNo的博客-CSDN博客
SpringBoot整合MongoDB及简单的操作_活跃的咸鱼的博客-CSDN博客_springboot+mongodb项目创建