在SpringBoot中优雅整合MongoDB——让你的数据存储更灵活


在现代开发中,关系型数据库如MySQL虽然常见,但在某些场景下,非关系型数据库(NoSQL)如MongoDB更能满足需求。尤其是在需要存储灵活的数据结构时,MongoDB的文档模型比起传统的表格结构更加适合。今天,我将带你一步步整合SpringBoot与MongoDB,让你能轻松驾驭这个强大的数据库。

一、两种整合方式:MongoTemplate 与 MongoRepository

Spring Data MongoDB 提供了两种主要的操作MongoDB的方式:

  1. MongoTemplate:提供了更细粒度的控制,适合复杂查询和操作。
  2. MongoRepository:基于Spring Data Repository的简化操作,更加符合Spring Data的风格,适合CRUD操作。

我们将分别展示如何使用这两种方式来操作MongoDB。

二、准备工作

在开始编写代码之前,我们需要进行一些基本的项目配置。

第一步:创建SpringBoot项目并引入MongoDB依赖

首先,我们创建一个SpringBoot项目,并在pom.xml文件中引入MongoDB相关的依赖:

<dependencies>
    <!-- Spring Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MongoDB Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <!-- Testing Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
第二步:配置MongoDB连接

接下来,我们在application.yml文件中配置MongoDB的连接信息:

spring:
  data:
    mongodb:
      database: daijia
      host: 192.168.2.129
      port: 27017
第三步:创建实体类

我们创建一个User实体类,它将映射到MongoDB中的user集合。

@Data
@Document("user")
public class User {

    @Id
    private ObjectId id;
    
    private String name;
    private Integer age;
    private String email;
    private Date createDate;
}

三、使用MongoRepository进行操作

1. 创建Repository接口

首先,我们创建一个接口UserRepository,它继承自MongoRepository

public interface UserRepository extends MongoRepository<User, ObjectId> {
}
2. 编写测试类

在测试类中,我们可以轻松地进行CRUD操作:

@SpringBootTest
public class MongoRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    // 添加用户
    @Test
    public void add() {
        User user = new User();
        user.setName("mary");
        user.setAge(30);
        user.setCreateDate(new Date());
        userRepository.save(user);
    }

    // 查询所有用户
    @Test
    public void findAll() {
        List<User> list = userRepository.findAll();
        System.out.println(list);
    }

    // 根据ID查询用户
    @Test
    public void testFindById() {
        Optional<User> optional = userRepository.findById(new ObjectId("666a9a85f5294513720647ff"));
        optional.ifPresent(System.out::println);
    }

    // 条件查询 + 排序
    @Test
    public void testFindCondition() {
        User user = new User();
        user.setAge(20);
        Example<User> example = Example.of(user);
        Sort sort = Sort.by(Sort.Direction.DESC, "name");
        List<User> list = userRepository.findAll(example, sort);
        System.out.println(list);
    }

    // 分页查询
    @Test
    public void testPage() {
        PageRequest pageable = PageRequest.of(0, 2);
        Page<User> page = userRepository.findAll(pageable);
        System.out.println(page.getContent());
    }

    // 更新用户信息
    @Test
    public void testUpdateUser() {
        Optional<User> optional = userRepository.findById(new ObjectId("64eee9dff317c823c62b4faf"));
        optional.ifPresent(user -> {
            user.setAge(100);
            userRepository.save(user);
            System.out.println(user);
        });
    }

    // 删除用户
    @Test
    public void testDeleteUser() {
        userRepository.deleteById(new ObjectId("64eee9dff317c823c62b4faf"));
    }
}

四、使用MongoTemplate进行操作

如果你需要更灵活的操作,可以选择使用MongoTemplate

1. 使用示例

同样,我们编写一个测试类来演示如何使用MongoTemplate进行操作:

@SpringBootTest
public class MongoTemplateTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    // 添加用户
    @Test
    public void add() {
        User user = new User();
        user.setName("test");
        user.setAge(20);
        user.setCreateDate(new Date());
        mongoTemplate.insert(user);
    }

    // 查询所有用户
    @Test
    public void findAll() {
        List<User> list = mongoTemplate.findAll(User.class);
        list.forEach(System.out::println);
    }

    // 根据ID查询用户
    @Test
    public void testFindId() {
        User user = mongoTemplate.findById("666a9b5e9a3653796627bb3c", User.class);
        System.out.println(user);
    }

    // 条件查询
    @Test
    public void testCondition() {
        Criteria criteria = Criteria.where("name").is("test").and("age").is(20);
        Query query = new Query(criteria);
        List<User> list = mongoTemplate.find(query, User.class);
        System.out.println(list);
    }

    // 分页查询
    @Test
    public void testPage() {
        Query query = new Query();
        List<User> list = mongoTemplate.find(query.skip(0).limit(2), User.class);
        list.forEach(System.out::println);
    }

    // 更新用户信息
    @Test
    public void testUpdateUser() {
        Criteria criteria = Criteria.where("_id").is("64eeeae31711344f35635788");
        Query query = new Query(criteria);
        Update update = new Update();
        update.set("name", "zhangsan");
        update.set("age", 99);
        UpdateResult result = mongoTemplate.upsert(query, update, User.class);
        System.out.println(result.getModifiedCount());
    }

    // 删除用户
    @Test
    public void testRemove() {
        Criteria criteria = Criteria.where("_id").is("64eeeae31711344f35635788");
        Query query = new Query(criteria);
        DeleteResult result = mongoTemplate.remove(query, User.class);
        System.out.println(result.getDeletedCount());
    }
}

五、总结

通过这篇博客,你已经了解了如何在SpringBoot中整合MongoDB,并通过两种不同的方式(MongoRepository和MongoTemplate)进行数据操作。对于简单的CRUD操作,MongoRepository可以让你的代码更加简洁;而MongoTemplate则在你需要更复杂的查询或更新操作时提供了更大的灵活性。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 获取 MongoDB 的 GridFSBucket 数据,可以通过使用 Spring Data MongoDB 提供的 GridFsTemplate 类来实现。 首先,确保你的 Spring Boot 项目已经添加了 Spring Data MongoDB 的依赖。然后,创建一个 GridFsTemplate 的实例,并注入 MongoDB 的 MongoDatabase 对象。 ```java import com.mongodb.client.gridfs.GridFSBucket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.stereotype.Component; @Component public class GridFSExample { private final GridFsTemplate gridFsTemplate; private final GridFSBucket gridFSBucket; @Autowired public GridFSExample(MongoDbFactory mongoDbFactory, GridFsTemplate gridFsTemplate) { this.gridFsTemplate = gridFsTemplate; this.gridFSBucket = GridFSBuckets.create(mongoDbFactory.getDb()); } // 在这里可以编写其他方法来获取 GridFSBucket 数据 } ``` 现在,你可以在 `GridFSExample` 类编写其他方法来获取 GridFSBucket 数据。例如,你可以使用 `gridFsTemplate` 对象来获取文件的元数据信息: ```java import com.mongodb.client.gridfs.model.GridFSFile; import org.springframework.stereotype.Component; @Component public class GridFSExample { // ... public GridFSFile getFileMetaData(String fileId) { return gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId))); } // ... } ``` 你还可以使用 `gridFSBucket` 对象来获取文件的输入流,以及执行其他操作: ```java import org.bson.types.ObjectId; import org.springframework.stereotype.Component; import java.io.InputStream; @Component public class GridFSExample { // ... public InputStream getFileInputStream(ObjectId fileId) { return gridFSBucket.openDownloadStream(fileId); } // ... } ``` 这样,你就可以在 Spring Boot 通过 GridFsTemplate 和 GridFSBucket 来获取 MongoDB 的 GridFSBucket 数据了。记得在使用前配置好 MongoDB 的连接信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值