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
| 12
 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字段来存储实体类类型)
| 12
 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类
| 12
 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下面添加测试类:
| 12
 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
 
 | @SpringBootTestclass 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类
| 12
 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下面添加测试类:
| 12
 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
 
 | @SpringBootTestclass 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");
 }
 }
 
 
 |