MongoDB的安装和整合SpringBoot

目录

[什么是 MongoDB?](#什么是 MongoDB?)

[MongoDB 的主要特点](#MongoDB 的主要特点)

与Redis的对比

安装

2.SpringBoot整合MangoDB

(1)创建数据库

(2)创建SpringBoot项目

依赖和配置文件

pojo实体类

Repository接口

前端Controller

(3)测试

保存书籍

​编辑

添加书籍

通过表单添加书籍

根据id查找

根据名称查找

根据名称模糊查找

修改价格

根据名称删除

根据id删除


什么是 MongoDB?

MongoDB 是一个开源、面向文档的 NoSQL 数据库 ,它使用类似 JSON 的 BSON(Binary JSON)格式存储数据。与传统的关系型数据库不同,MongoDB 是非关系型的,具有高度的灵活性和可扩展性。

MongoDB 的主要特点

  1. 文档型:数据以 JSON 格式存储,非常灵活

  2. 动态模式:同一集合中的文档可以有不同的字段

  3. 高可用性:支持副本集,自动故障转移

  4. 水平扩展:支持分片,可以轻松扩展存储容量

  5. 丰富的查询语言:支持 CRUD、聚合管道、地理空间查询等

  6. 索引支持:支持各种类型的索引,提高查询性能

与Redis的对比

安装

找到官网下载:

MangoDB下载路径https://www.mongodb.com/try/download/community

进入安装界面时,注意修改数据的安装路径

可以在next之后勾选Install MangoDB Compass(MangoDB的图形化界面),也可以取消勾选单独安装

等待安装完成

GUI界面如图所示

点击Add new connection

填写连接名字之后其他使用默认值,点击Save&Connect就可以连接了

连接成功如图

2.SpringBoot整合MangoDB

(1)创建数据库

输入DataBase Name和Collection Name之后点击创建

(2)创建SpringBoot项目

注意自己的SpringBoot与mongoDB版本的适配:

依赖和配置文件

导入项目的依赖:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qcby</groupId>
    <artifactId>MyFirstMongoDBDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.5</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

配置application.yml文件

XML 复制代码
spring:
  data:
    mongodb:
      uri: mongodb://localhost/MyFirstMongoDB

pojo实体类

创建实体类Book,使用@Document(collation = "book")注解通过collation参数指定Book类声明为MongoDB的文档集合book

java 复制代码
package com.qcby.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("book")
public class Book {

    @id  //主键,不可重复,自带索引
    private Integer id;
    private String name;
    private Double price;

}

Repository接口

java 复制代码
package com.qcby.repository;

import com.qcby.pojo.Book;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface BookRepository extends MongoRepository<Book, Integer> {

    Book findBookById(Integer id);
    Book findByName(String name);
    List<Book> findBooksByNameContains(String name);

}

注意:@Mapper是Mybatis的注释,不能代替@Repository

MongoRepository<Book, Integer>为什么要这样写?

这是 Spring Data 的泛型设计,MongoRepository<T, ID> 有两个泛型参数:

第一个参数 Book:实体类型

告诉 Spring Data 这个 Repository 要操作的是哪个实体类

对应 MongoDB 中的文档(Document)

第二个参数 Integer:主键类型

指定实体类中 @Id 注解的字段类型

在Book 类中,id 字段的类型是 Integer

继承后可以获得这些方法:

java 复制代码
// 继承后自动获得这些方法
bookRepository.save(book);        // 增/改
bookRepository.findById(id);      // 查单个
bookRepository.findAll();         // 查所有
bookRepository.deleteById(id);    // 删
bookRepository.count();           // 计数

方法名字会自动解析:

java 复制代码
// Spring Data 会根据方法名自动实现
Book findBookById(Integer id);     // 自动实现:根据ID查询
Book findByName(String name);      // 自动实现:根据name查询

前端Controller

java 复制代码
package com.qcby.controller;

import com.qcby.pojo.Book;
import com.qcby.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    /**
     * 保存书籍
     * @return
     */
    @GetMapping("/saveBooks")
    public List<Book> saveBooks(){
        List<Book> list = new ArrayList<>();
        for(int i = 0; i < 4; i++) {
            list.add(new Book(i, "书本"+i, 66.6));
        }
        return bookRepository.saveAll(list);
    }

    /**
     * 添加书籍
     */
    @GetMapping("/addBook")
    public void addBook(){
        Book book = new Book(4, "书本4", 55.3);
        bookRepository.insert(book);
    }

    /**
     * 通过表单参数添加书
     * @param id
     * @param name
     * @param price
     */
    @GetMapping("/insertBook")
    public void updateBook(Integer id,String name,Double price){
        Book book = new Book(id,name,price);
        bookRepository.insert(book);
    }

    /**
     * 根据id查找
     * @param id
     * @return
     */
    @GetMapping("/findById")
    public Book findById(Integer id){
        return bookRepository.findBookById(id);
    }

    /**
     * 根据名称查找
     * @param name
     * @return
     */
    @GetMapping("/findByName")
    public Book findByName(String name){
        return bookRepository.findByName(name);
    }

    /**
     * 姓名模糊查询
     * @param name
     * @return
     */
    @GetMapping("/findByNameContains")
    public List<Book> findByNameContains(String name){
        return bookRepository.findBooksByNameContains(name);
    }

    /**
     * 修改价格
     * @param id
     * @param price
     * @return
     */
    @GetMapping("/updateBook")
    public Book updateBook(int id,double price){
        Book book = bookRepository.findBookById(id);
        if(book != null){
            book.setPrice(price);
        }
        return bookRepository.save(book);
    }

    /**
     * 根据名字删除
     * @param name
     */
    @GetMapping("/deleteBookByName")
    public void deleteBookByName(String name){
        Book book = bookRepository.findByName(name);
        bookRepository.delete(book);
    }

    /**
     * 根据id删除
     * @param id
     */
    @GetMapping("/deleteBookById")
    public void deleteBookById(Integer id){
        Book book = bookRepository.findBookById(id);
        bookRepository.delete(book);
    }
}

(3)测试

保存书籍

http://localhost:8080/saveBooks

添加书籍

http://localhost:8080/addBook

通过表单添加书籍

http://localhost:8080/insertBook?id=5&name=SpringBoot%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3&price=87.1

根据id查找

http://localhost:8080/findById?id=4

根据名称查找

http://localhost:8080/findByName?name=书本4

根据名称模糊查找

http://localhost:8080/findByNameContains?name=%E4%B9%A6%E6%9C%AC

修改价格

http://localhost:8080/updateBook?id=0&price=888.88

根据名称删除

http://localhost:8080/deleteBookByName?name=%E4%B9%A6%E6%9C%AC4

书本4被删除

根据id删除

http://localhost:8080/deleteBookById?id=0

书本0被删除

相关推荐
XLYcmy20 分钟前
信息检索报告数字经济赋能城市低碳治理的路径研究——基于“传统数据库 + 生成式人工智能”双轮驱动的检索实践 检索实施与结果分析 Web of Science
数据库·ai·llm·prompt·ssci·deepseek·wos
Decay__25 分钟前
21_MySQL 优化案例集 —— 慢 SQL 优化、索引重构与参数调整收益对比
运维·数据库·sql·mysql·架构
codigger1 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
数据库·sql·mysql·程序员
麦壳饼2 小时前
SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写
数据库·人工智能·sql·sonnetdb
nice_lcj5202 小时前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
Decay__11 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
java_logo11 小时前
Docker 部署 Liquibase:轻松搭建数据库变更管理
数据库·docker·容器·数据库管理·liquibase·轩辕镜像·数据库变更
凤凰院凶涛QAQ12 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
码农小河6612 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
张小姐的猫12 小时前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节