Spring Boot 集成 MongoDB
1. 集成简介
spring-data-mongodb 提供了 MongoTemplate 与 MongoRepository 两种方式访问 MongoDB。MongoRepository 操作简单,MongoTemplate 操作灵活,可以在项目中灵活结合使用。MongoRepository 的缺点是不够灵活,MongoTemplate 正好可以弥补不足。
2. 搭建开发环境
2.1 初始化工程
使用 Spring Initializr 快速初始化一个 Spring Boot 工程。
2.2 引入依赖
修改 pom.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.1</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
|
2.3 添加配置
在 application.properties 文件添加配置:
1
| spring.data.mongodb.uri=mongodb://47.93.118.241:27017/test
|
配置类(此类若不加,插入的一行会默认添加一个 _class 字段来存储实体类类型):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
@Configuration @RequiredArgsConstructor public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {
private final MongoTemplate oneMongoTemplate; private static final String TYPEKEY = "_class";
@Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { MongoConverter converter = oneMongoTemplate.getConverter(); if (converter.getTypeMapper().isTypeKey(TYPEKEY)) { ((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null)); } } }
|
3. 基于 MongoTemplate 开发 CRUD
3.1 添加实体
添加 com.atguigu.mongodb.entity.User 类:
1 2 3 4 5 6 7 8 9 10 11 12
| @Data @Document("User") public class User {
@Id private String id; private String name; private Integer age; private String email; private String createDate; }
|
3.2 常用方法
MongoTemplate 常用方法:
mongoTemplate.findAll(User.class):查询 User 文档的全部数据mongoTemplate.findById(<id>, User.class):查询 User 文档 id 为指定值的数据mongoTemplate.find(query, User.class):根据 query 内的查询条件查询mongoTemplate.upsert(query, update, User.class):修改mongoTemplate.remove(query, User.class):删除mongoTemplate.insert(User):新增
Query 对象用法:
- 创建一个
Query 对象(用来封装所有条件对象),再创建一个 Criteria 对象(用来构建条件) - 精准条件:
criteria.and("key").is("条件");模糊条件:criteria.and("key").regex("条件") - 封装条件:
query.addCriteria(criteria) - 大于:
Criteria gt = Criteria.where("key").gt("条件");小于:Criteria lt = Criteria.where("key").lt("条件") Query.addCriteria(new Criteria().andOperator(gt, lt));- 一个 query 中只能有一个
andOperator(),其参数也可以是 Criteria 数组 - 排序:
query.with(new Sort(Sort.Direction.ASC, "age").and(new Sort(Sort.Direction.DESC, "date")))
3.3 添加测试类
在 /test/java 下面添加测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| @SpringBootTest class DemomogoApplicationTests {
@Autowired private MongoTemplate mongoTemplate;
@Test public void createUser() { User user = new User(); user.setAge(20); user.setName("test"); user.setEmail("4932200@qq.com"); User user1 = mongoTemplate.insert(user); System.out.println(user1); }
@Test public void findUser() { List<User> userList = mongoTemplate.findAll(User.class); System.out.println(userList); }
@Test public void getById() { User user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class); System.out.println(user); }
@Test public void findUserList() { Query query = new Query(Criteria .where("name").is("test") .and("age").is(20)); List<User> userList = mongoTemplate.find(query, User.class); System.out.println(userList); }
@Test public void findUsersLikeName() { String name = "est"; String regex = String.format("%s%s%s", "^.*", name, ".*$"); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Query query = new Query(Criteria.where("name").regex(pattern)); List<User> userList = mongoTemplate.find(query, User.class); System.out.println(userList); }
@Test public void findUsersPage() { String name = "est"; int pageNo = 1; int pageSize = 10;
Query query = new Query(); String regex = String.format("%s%s%s", "^.*", name, ".*$"); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); query.addCriteria(Criteria.where("name").regex(pattern)); int totalCount = (int) mongoTemplate.count(query, User.class); List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
Map<String, Object> pageMap = new HashMap<>(); pageMap.put("list", userList); pageMap.put("totalCount",totalCount); System.out.println(pageMap); }
@Test public void updateUser() { User user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class); user.setName("test_1"); user.setAge(25); user.setEmail("493220990@qq.com"); Query query = new Query(Criteria.where("_id").is(user.getId())); Update update = new Update(); update.set("name", user.getName()); update.set("age", user.getAge()); update.set("email", user.getEmail()); UpdateResult result = mongoTemplate.upsert(query, update, User.class); long count = result.getModifiedCount(); System.out.println(count); }
@Test public void delete() { Query query = new Query(Criteria.where("_id").is("5ffbfa2ac290f356edf9b5aa")); DeleteResult result = mongoTemplate.remove(query, User.class); long count = result.getDeletedCount(); System.out.println(count); } }
|
4. 基于 MongoRepository 开发 CRUD
4.1 实现
Spring Data 提供了对 MongoDB 数据访问的支持,我们只需要继承 MongoRepository 类,按照 Spring Data 规范定义方法即可。

Spring Data 方法定义规范:
- 方法声明需要符合一定规范,不能随意声明
- 查询方法以
find、read、get 开头 - 涉及条件查询时,条件的属性用条件关键字连接
- 条件属性首字母需要大写
- 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性;若需要使用级联属性,则属性之间使用
_ 强制连接
4.2 添加 Repository 类
添加 com.atguigu.mongodb.repository.UserRepository 类:
1 2 3 4 5 6 7 8 9 10 11 12
| package com.atguigu.mongodb.repository;
import com.atguigu.mongodb.entity.User; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository;
import java.util.List;
@Repository public interface UserRepository extends MongoRepository<User, String> {
}
|
4.3 添加测试类
在 /test/java 下面添加测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| @SpringBootTest class DemomogoApplicationTests1 {
@Autowired private UserRepository userRepository;
@Test public void createUser() { User user = new User(); user.setAge(20); user.setName("张三"); user.setEmail("3332200@qq.com"); User user1 = userRepository.save(user); }
@Test public void findUser() { List<User> userList = userRepository.findAll(); System.out.println(userList); }
@Test public void getById() { User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get(); System.out.println(user); }
@Test public void findUserList() { User user = new User(); user.setName("张三"); user.setAge(20); Example<User> userExample = Example.of(user); List<User> userList = userRepository.findAll(userExample); System.out.println(userList); }
@Test public void findUsersLikeName() { ExampleMatcher matcher = ExampleMatcher.matching() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) .withIgnoreCase(true); User user = new User(); user.setName("三"); Example<User> userExample = Example.of(user, matcher); List<User> userList = userRepository.findAll(userExample); System.out.println(userList); }
@Test public void findUsersPage() { Sort sort = Sort.by(Sort.Direction.DESC, "age");
Pageable pageable = PageRequest.of(0, 10, sort);
ExampleMatcher matcher = ExampleMatcher.matching() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) .withIgnoreCase(true); User user = new User(); user.setName("三"); Example<User> userExample = Example.of(user, matcher);
Example<User> example = Example.of(user, matcher); Page<User> pages = userRepository.findAll(example, pageable); System.out.println(pages); }
@Test public void updateUser() { User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get(); user.setName("张三_1"); user.setAge(25); user.setEmail("883220990@qq.com"); User save = userRepository.save(user); System.out.println(save); }
@Test public void delete() { userRepository.deleteById("5ffbfe8197f24a07007bd6ce"); } }
|