SpringBoot MongoDB与MongoDB GridFS基本使用

SpringBoot MongoDB与MongoDB GridFS基本使用

1. 前言

在开发过程中,我们经常需要使用到数据库进行数据的存储和管理。MongoDB是一个开源的,高性能,面向文档的NoSQL数据库。在Java中,我们可以使用SpringBoot框架来连接MongoDB数据库,并支持使用MongoDB的GridFS进行文件的存储和管理。

2. MongoDB的基本介绍

如果您对MongoDB还不了解,可以先了解一下MongoDB的基本概念。

MongoDB是一种文档导向数据库管理系统(Document-Oriented Database Management System,简称Document DBMS),由C++语言编写。MongoDB的数据结构是由文档(document)组成的,一个文档相当于一个数据记录,可以包含任意数量的字段。MongoDB的数据存储格式是BSON(Binary JSON),它是一种二进制格式的JSON(JavaScript Object Notation)。

3. MongoDB的安装与配置

这一部分不详细说明,仅在此做简要介绍,读者可自行查阅相关文献。

在MongoDB官网下载适合自己操作系统的版本,然后进行安装。

安装完成后,在MongoDB的bin目录下,启动mongod服务:mongod.exe --dbpath "D:\MongoDB\data"。

4. SpringBoot连接MongoDB

在SpringBoot中连接MongoDB,需要使用MongoDB的官方Java驱动包"mongodb-driver"。实现步骤如下:

  1. 添加依赖

在SpringBoot的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>3.11.2</version>
</dependency>
  1. 配置MongoDB连接信息

在SpringBoot的application.properties文件中,配置MongoDB的连接信息:

spring.data.mongodb.uri=mongodb://localhost:27017/test
  1. 编写Java代码

定义一个MongoDBRepository接口并继承MongoRepository,用于操作MongoDB中的数据。可以定义一些常用的操作方法,如下所示:

@Repository
public interface MongoDBRepository extends MongoRepository<User, Long> {

    User findByUsername(String username);

    List<User> findByAgeGreaterThan(int age);
}

在SpringBoot的启动类中添加@ComponentScan注解,用于扫描MongoDBRepository接口所在的包。

然后,在需要操作MongoDB的地方,进行MongoDBRepository的注入,就可以使用MongoDB进行数据的存储和管理了。

5. MongoDB GridFS的基本介绍

MongoDB GridFS是一种MongoDB存储机制,用于存储大文件。

MongoDB GridFS将文件分为两个部分:元数据和数据。元数据保存在files集合中,数据保存在chunks集合中。元数据中保存了文件的名称、大小、上传日期、类型等信息。数据则是将文件切分为若干个chunk进行存储。

6. SpringBoot使用MongoDB GridFS

在SpringBoot中使用MongoDB GridFS,需要使用MongoDB的官方Java驱动包"mongodb-driver"和"mongodb-driver-core"。实现步骤如下:

  1. 添加依赖

在SpringBoot的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>3.11.2</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-core</artifactId>
    <version>3.11.2</version>
</dependency>
  1. 配置MongoDB连接信息

在SpringBoot的application.properties文件中,配置MongoDB的连接信息(同第4步)。

  1. 编写Java代码

使用以下代码,可以将一个文件保存到MongoDB GridFS中:

@Autowired
private GridFsTemplate gridFsTemplate;

public String storeFile(MultipartFile file) throws IOException {
    DBObject metaData = new BasicDBObject();
    metaData.put("userId", "12345");
    metaData.put("fileName", file.getOriginalFilename());
    metaData.put("fileType", file.getContentType());
    GridFSFile gridFSFile = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType(), metaData);
    return gridFSFile.getId().toString();
}

使用以下代码,可以从MongoDB GridFS中读取一个文件:

@Autowired
private GridFsTemplate gridFsTemplate;

public Resource loadFile(String fileId) throws IOException {
    GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(fileId)));
    if (gridFSFile == null) {
        throw new FileNotFoundException("File not found with id " + fileId);
    }
    GridFsResource resource = gridFsTemplate.getResource(gridFSFile);
    return resource;
}

注意:在使用GridFsTemplate时,需要先进行注入。

7. 示例说明

下面提供两个示例,用于展示SpringBoot MongoDB与MongoDB GridFS的基本使用方法。

示例一:使用MongoDB

在使用MongoDB的示例中,我们将定义一个User类,然后使用MongoDBRepository对User类进行操作。

  1. 定义User类

User类定义如下:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(collection="user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Long id;
    private String username;
    private Integer age;
    private Date birthday;
}
  1. 编写操作类

在我们的操作类中,进行MongoDBRepository的注入。然后,我们定义了一些基本的操作方法:

@Service
public class MongoDBService {

    @Autowired
    private MongoDBRepository mongoDBRepository;

    public User saveUser(User user) {
        return mongoDBRepository.save(user);
    }

    public void deleteUser(Long id) {
        mongoDBRepository.deleteById(id);
    }

    public User getUserByUsername(String username) {
        return mongoDBRepository.findByUsername(username);
    }

    public List<User> getUsersByAgeGreaterThan(int age) {
        return mongoDBRepository.findByAgeGreaterThan(age);
    }
}
  1. 编写测试类

在测试类中,我们进行了一些简单的测试:

@SpringBootTest
class MongoDBServiceTest {

    @Autowired
    private MongoDBService mongoDBService;

    @Test
    void saveUser() {
        User user = new User();
        user.setId(1L);
        user.setUsername("张三");
        user.setAge(20);
        user.setBirthday(new Date());
        mongoDBService.saveUser(user);
    }

    @Test
    void deleteUser() {
        mongoDBService.deleteUser(1L);
    }

    @Test
    void getUserByUsername() {
        User user = mongoDBService.getUserByUsername("张三");
        System.out.println(user);
    }

    @Test
    void getUsersByAgeGreaterThan() {
        List<User> userList = mongoDBService.getUsersByAgeGreaterThan(15);
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

示例二:使用MongoDB GridFS

在使用MongoDB GridFS的示例中,我们将定义一个FileService类,用于操作MongoDB GridFS进行文件的上传和下载。

  1. 编写FileService类

在FileService类中,我们进行了GridFsTemplate的注入,并定义了进行文件上传和下载的方法:

@Service
public class FileService {

    @Autowired
    private GridFsTemplate gridFsTemplate;

    public String storeFile(MultipartFile file) throws IOException {
        DBObject metaData = new BasicDBObject();
        metaData.put("userId", "12345");
        metaData.put("fileName", file.getOriginalFilename());
        metaData.put("fileType", file.getContentType());
        GridFSFile gridFSFile = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType(), metaData);
        return gridFSFile.getId().toString();
    }

    public Resource loadFile(String fileId) throws IOException {
        GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(fileId)));
        if (gridFSFile == null) {
            throw new FileNotFoundException("File not found with id " + fileId);
        }
        GridFsResource resource = gridFsTemplate.getResource(gridFSFile);
        return resource;
    }
}
  1. 编写控制器类

在控制器类中,我们进行了FileService的注入,并定义了文件上传和下载的接口:

@RestController
@RequestMapping("/file")
public class FileController {

    @Autowired
    private FileService fileService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        return fileService.storeFile(file);
    }

    @GetMapping("/download/{fileId}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileId) throws IOException {
        Resource resource = fileService.loadFile(fileId);
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(resource.getFilename()))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }
}
  1. 编写测试类

在使用MongoDB GridFS进行文件上传和下载的测试类中,代码如下:

@SpringBootTest
class FileControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void uploadFile() throws Exception {
        File file = new File("D:\\图片\\1.jpg");
        FileInputStream input = new FileInputStream(file);
        MockMultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", input);
        mockMvc.perform(MockMvcRequestBuilders.multipart("/file/upload")
                .file(multipartFile))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("60d8b807c8addb32c7cc74b5"));
    }

    @Test
    void downloadFile() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/file/download/60d8b807c8addb32c7cc74b5"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.header().exists(HttpHeaders.CONTENT_DISPOSITION));
    }
}

注意:在测试FileController类时,我们需要使用MockMvc来进行测试。在本例中,使用MockMultipartFile对象来模拟文件上传。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot MongoDB与MongoDB GridFS基本使用 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • mongodb数据库迁移变更的解决方案

    以下是针对mongodb数据库迁移变更的解决方案的完整攻略。 1. 准备工作 在进行数据库迁移变更之前,我们需要做好一些准备工作。具体包括: 安装最新版本的MongoDB。 安装合适的工具来管理和迁移数据库,如MongoDB Compass、Robo 3T等。 确认新数据库所需的配置和性能需求,如CPU、内存、存储等。 2. 数据库结构变更 在迁移数据库结构…

    MongoDB 2023年5月16日
    00
  • 详解MongoDB的角色管理

    详解MongoDB的角色管理 MongoDB是一款非常流行的NoSQL数据库,具有较高的灵活性和可扩展性。在使用MongoDB进行应用开发时,角色管理是非常重要的一个方面。本文将详细讲解MongoDB的角色管理,包括如何创建角色、如何添加/删除用户、如何授权等内容。 创建角色 在MongoDB中,可以通过角色来管理用户的权限。角色可以是系统角色,也可以是用户…

    MongoDB 2023年5月16日
    00
  • mongodb在建立一个T级别的数据库时,进程挂掉的解决方法

    建立一个T级别的数据库意味着创建一个在特定时间内可以执行特定任务的系统。MongoDB为开发人员提供了一个名为createIndex()的方法来创建索引。当然,还有很多其他的方法可以在MongoDB中使用来提高查询效率。但建立T级别的数据库时,进程偶尔会挂掉,这是可以采取一些措施来解决的。 以下是在建立一个T级别的数据库时进程挂掉的解决方法的攻略: 1.增加…

    MongoDB 2023年5月16日
    00
  • MongoDB使用场景总结

    以下是详细的“MongoDB使用场景总结”的攻略。 MongoDB的使用场景 数据分析:MongoDB的聚合功能和灵活的文档结构,可以帮助存储和分析大量的非结构化数据,例如日志数据、社交媒体数据和物联网数据等。 内容管理:MongoDB可以存储各种类型的文档,适合存储视频、音频、图片等各种类型的媒体文件,并提供高可用性和可扩展性。 实时推送:MongoDB可…

    MongoDB 2023年5月16日
    00
  • MongoDB排序方法详解

    MongoDB是一个非关系型数据库,它支持排序操作。排序在MongoDB中非常重要,它可以帮助用户获取按特定要求排序的数据,提高数据库的性能。本文将详细介绍MongoDB排序的完整攻略,包括排序操作的语法、排序规则、代码示例等。 语法 在MongoDB中,排序功能由sort()方法实现。sort()方法的语法如下: db.collection.find().…

    MongoDB 2023年3月14日
    00
  • MongoDB数据库两阶段提交实现事务的方法详解

    MongoDB数据库两阶段提交实现事务的方法详解 什么是事务 事务指的是一组数据库操作,它们被视为单个工作单元并且必须全部成功或全部失败才能提交或回滚。事务的目的是保证数据的一致性和完整性。 MongoDB中的事务 MongoDB在版本4.0中引入了事务的支持。事务在MongoDB中被定义为一组读写操作,这些操作被视为单个工作单元,它们必须要么全部成功,要么…

    MongoDB 2023年5月16日
    00
  • ubuntu 16.04 LTS 安装mongodb 3.2.8教程

    下面是“ubuntu 16.04 LTS 安装mongodb 3.2.8教程”的完整攻略: 准备工作 首先,我们需要在Ubuntu 16.04 LTS系统中安装MongoDB 3.2.8之前,需要先确认系统是最新的版本,然后更新apt: sudo apt update && sudo apt upgrade -y 安装MongoDB 安装Mo…

    MongoDB 2023年5月16日
    00
  • MongoDB4.28开启权限认证配置用户密码登录功能

    下面是MongoDB4.28开启权限认证配置用户密码登录功能的完整攻略: 第一步:启用安全认证 首先,需要启用MongoDB的安全认证。进入mongo shell,在admin数据库中运行以下命令启用认证功能: use admin db.runCommand({ "setParameter": 1, "authenticatio…

    MongoDB 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部