Spring Boot应用MongoDB

时间:2024-11-02 14:12:38

1. 添加 Maven 依赖

在 Spring Boot 项目中,引入 spring-boot-starter-data-mongodb 依赖:

<dependencies>
    <!-- MongoDB starter dependency for Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

2. 配置 MongoDB 连接参数

application.propertiesapplication.yml 文件中设置 MongoDB 的连接信息,包括 URI、数据库名称、认证信息等。

application.properties 配置示例

# MongoDB 连接 URI(带有用户名、密码、IP地址和端口号)
spring.data.mongodb.uri=mongodb://username:password@localhost:27017/mydatabase
# 指定默认的 MongoDB 数据库
spring.data.mongodb.database=mydatabase

application.yml 配置示例

spring:
  data:
    mongodb:
      uri: mongodb://username:password@localhost:27017/mydatabase
      database: mydatabase

3. 定义 MongoDB 模型类

我们可以定义一个 POJO 类(Plain Old Java Object)来映射 MongoDB 文档。通过在类上使用 @Document 注解,Spring Data MongoDB 可以将该类与指定的集合关联。

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "users") // 将类映射到 MongoDB 的 "users" 集合
public class User {
    @Id
    private String id; // MongoDB 的主键字段
    private String name;
    private int age;

    // Getters 和 Setters
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

4. 创建 Repository 接口

在 Spring Data MongoDB 中,通过继承 MongoRepository 接口,能够简化 CRUD 操作。MongoRepository 还提供了一些常用的查询和分页方法,满足大部分基本操作需求。

import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;

public interface UserRepository extends MongoRepository<User, String> {
    // 可以根据需求自定义查询方法,例如根据姓名查找用户
    List<User> findByName(String name);
}

5. 编写 Service 层逻辑

在业务逻辑层中,通过 @Autowired 注入 UserRepository,即可轻松实现数据库操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    // 保存用户
    public void saveUser(User user) {
        userRepository.save(user);
    }

    // 获取所有用户
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    // 根据名称查询用户
    public List<User> getUsersByName(String name) {
        return userRepository.findByName(name);
    }
}

6. 使用 Controller 进行测试

可以创建一个简单的控制器接口来测试 MongoDB 连接与数据操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    // 添加用户
    @PostMapping
    public String addUser(@RequestBody User user) {
        userService.saveUser(user);
        return "User added successfully!";
    }

    // 获取所有用户
    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    // 根据名称查询用户
    @GetMapping("/{name}")
    public List<User> getUsersByName(@PathVariable String name) {
        return userService.getUsersByName(name);
    }
}

7. Spring Boot 中 MongoDB 的常用函数

以下内容涵盖了文档的增删改查操作,聚合操作,以及条件查询和分页排序。

7.1 增加(Create)操作

在 MongoDB 中,创建文档可以使用 save()insert() 方法。

  • save():如果文档已经存在,则更新文档;若不存在,则插入新文档。
  • insert():仅用于插入新的文档,如果文档存在,则抛出错误。
public void createUser(User user) {
    userRepository.save(user); // 保存用户数据
}

public void createMultipleUsers(List<User> users) {
    userRepository.insert(users); // 批量插入数据
}
7.2 查询(Read)操作

Spring Data MongoDB 提供了多种查询方式,包含简单查询、条件查询、分页、排序等功能。

7.2.1 基本查询函数
  • findAll():获取集合中的所有文档。
  • findById():根据 ID 查找单个文档。
  • existsById():检查指定 ID 的文档是否存在。
// 获取所有用户
public List<User> getAllUsers() {
    return userRepository.findAll();
}

// 根据 ID 获取用户
public Optional<User> getUserById(String id) {
    return userRepository.findById(id);
}

// 检查用户是否存在
public boolean isUserExist(String id) {
    return userRepository.existsById(id);
}
7.2.2 条件查询函数

在 Spring Data MongoDB 中,可以通过方法名中的关键字直接构建条件查询函数,例如 findByNamefindByAgeGreaterThan 等。

// 根据名称查询用户
public List<User> getUsersByName(String name) {
    return userRepository.findByName(name);
}

// 查询年龄大于特定值的用户
public List<User> getUsersByAgeGreaterThan(int age) {
    return userRepository.findByAgeGreaterThan(age);
}
7.2.3 多条件查询函数

多条件查询可以利用 @Query 注解实现,也可以通过方法名中的关键字实现。

// 查找年龄在特定范围内的用户,并且按名称排序
@Query("{ 'age': { '$gte': ?0, '$lte': ?1 } }")
public List<User> findUsersByAgeBetween(int startAge, int endAge) {
    return userRepository.findUsersByAgeBetween(startAge, endAge);
}
7.3 更新(Update)操作

在 MongoDB 中,更新操作可以使用 save() 方法,或者自定义查询条件使用 updateupdateFirst

7.3.1 基本更新函数
  • save():根据 _id 更新文档,不存在则插入新文档。
  • updateFirst():更新符合条件的第一条记录。
  • updateMulti():更新所有符合条件的记录。
// 使用 save() 方法进行更新(存在则更新,不存在则插入)
public void updateUser(User user) {
    userRepository.save(user);
}

// 使用 Query 和 Update 操作符更新年龄字段
public void incrementUserAge(String userId, int increment) {
    Query query = new Query(Criteria.where("id").is(userId));
    Update update = new Update().inc("age", increment);
    mongoTemplate.updateFirst(query, update, User.class);
}
7.4 删除(Delete)操作

Spring Data MongoDB 支持单条和批量删除。

  • deleteById():根据 ID 删除文档。
  • deleteAll():删除集合中的所有文档。
  • deleteAllById():根据 ID 列表批量删除文档。
// 根据 ID 删除用户
public void deleteUserById(String userId) {
    userRepository.deleteById(userId);
}

// 删除所有用户
public void deleteAllUsers() {
    userRepository.deleteAll();
}

// 根据条件删除用户
public void deleteUserByName(String name) {
    Query query = new Query(Criteria.where("name").is(name));
    mongoTemplate.remove(query, User.class);
}
7.5 分页与排序

分页和排序可以结合 PageableSort 实现。

// 分页查询用户,并按年龄排序
public Page<User> getUsersWithPagination(int page, int size) {
    Pageable pageable = PageRequest.of(page, size, Sort.by("age").descending());
    return userRepository.findAll(pageable);
}
7.6 聚合操作

聚合操作使用 Aggregation 类来构建查询步骤,例如分组、计数、求和等。常见的聚合操作包括 $group$match$sort 等。

import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;

// 根据年龄进行分组并统计数量
public List<AgeCount> groupByAgeAndCountUsers() {
    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group("age").count().as("userCount"),
            Aggregation.project("userCount").and("age").previousOperation()
    );
    AggregationResults<AgeCount> results = mongoTemplate.aggregate(aggregation, "user", AgeCount.class);
    return results.getMappedResults();
}

在这个示例中,groupByAgeAndCountUsers() 方法返回每个年龄的用户数量。mongoTemplate 提供了更复杂的聚合操作实现方式,使得我们可以灵活处理 MongoDB 数据分析。

7. 启动 Spring Boot 项目进行测试

启动项目后,可以通过 API 进行简单的数据库操作测试:

  1. 通过 POST 请求向 /users 路径添加用户;
  2. 通过 GET 请求访问 /users 获取所有用户;
  3. 通过 GET 请求访问 /users/{name} 根据用户名查询特定用户。
8. 连接与认证补充说明
  • URI 格式:MongoDB URI 格式为 mongodb://username:password@host:port/database。如果没有设置认证,可以省略 username:password@ 部分。
  • 认证配置:若启用了 MongoDB 认证,需确保 spring.data.mongodb.uri 中包含正确的用户名与密码,以免连接失败。