Spring Data MongoDB 提供了两种主要的操作MongoDB的方式:
我们将分别展示如何使用这两种方式来操作MongoDB。
在开始编写代码之前,我们需要进行一些基本的项目配置。
首先,我们创建一个SpringBoot项目,并在pom.xml
文件中引入MongoDB相关的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
接下来,我们在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;
}
首先,我们创建一个接口UserRepository
,它继承自MongoRepository
:
public interface UserRepository extends MongoRepository<User, ObjectId> {
}
在测试类中,我们可以轻松地进行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
进行操作:
@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则在你需要更复杂的查询或更新操作时提供了更大的灵活性。