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.properties
或 application.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 中,可以通过方法名中的关键字直接构建条件查询函数,例如 findByName
、findByAgeGreaterThan
等。
// 根据名称查询用户
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()
方法,或者自定义查询条件使用 update
或 updateFirst
。
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 分页与排序
分页和排序可以结合 Pageable
和 Sort
实现。
// 分页查询用户,并按年龄排序
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 进行简单的数据库操作测试:
- 通过
POST
请求向/users
路径添加用户; - 通过
GET
请求访问/users
获取所有用户; - 通过
GET
请求访问/users/{name}
根据用户名查询特定用户。
8. 连接与认证补充说明
-
URI 格式:MongoDB URI 格式为
mongodb://username:password@host:port/database
。如果没有设置认证,可以省略username:password@
部分。 -
认证配置:若启用了 MongoDB 认证,需确保
spring.data.mongodb.uri
中包含正确的用户名与密码,以免连接失败。