距离上一次更新该文章已经过了 757 天,文章所描述的內容可能已经发生变化,请留意。
Spring boot集成mongodb
1、集成简介
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,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.findAll(User.class): 查询User文档的全部数据
mongoTemplate.findById(, User.class): 查询User文档id为id的数据
mongoTemplate.find(query, User.class);: 根据query内的查询条件查询
mongoTemplate.upsert(query, update, User.class): 修改
mongoTemplate.remove(query, User.class): 删除
mongoTemplate.insert(User): 新增
Query对象
1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)
2、 精准条件:criteria.and(“key”).is(“条件”)
模糊条件:criteria.and(“key”).regex(“条件”)
3、封装条件:query.addCriteria(criteria)
4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)
小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)
5、Query.addCriteria(new Criteria().andOperator(gt,lt));
6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。
7、排序 :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规范就可以了
SpringData 方法定义规范

1、不是随便声明的,而需要符合一定的规范
2、 查询方法以find | read | get开头
3、 涉及条件查询时,条件的属性用条件关键字连接
4、 要注意的是:条件属性首字母需要大写
5、 支持属性的级联查询,但若当前类有符合条件的属性则优先使用,而不使用级联属性,若需要使用级联属性,则属性之间使用_强制进行连接
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"); } }
|