这里写目录标题
Spring boot集成mongodb
1、集成简介
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
2、搭建开发环境
2.1 初始化工程
使用 Spring Initializr 快速初始化一个 Spring Boot 工程
Group:com.atguigu
Artifact:mongodb
2.2 引入依赖
修改pom.xml
<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文件添加配置
spring.data.mongodb.uri=mongodb://47.93.118.241:27017/test
3、基于MongoTemplate 开发CRUD
3.1 添加实体
添加com.atguigu.mongodb.entity.User类
@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(<id>, 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下面添加测试类:
@SpringBootTest class DemomogoApplicationTests { @Autowired private MongoTemplate mongoTemplate; //添加 @Test public void createUser() { User user = new User(); user.setAge(20); user.setName("test"); user.setEmail("
[email protected]"); User user1 = mongoTemplate.insert(user); System.out.println(user1); } //查询所有 @Test public void findUser() { List<User> userList = mongoTemplate.findAll(User.class); System.out.println(userList); } //根据id查询 @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("[email protected]"); 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类
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下面添加测试类: @SpringBootTest class DemomogoApplicationTests1 { @Autowired private UserRepository userRepository; //添加 @Test public void createUser() { User user = new User(); user.setAge(20); user.setName("张三"); user.setEmail("
[email protected]"); User user1 = userRepository.save(user); } //查询所有 @Test public void findUser() { List<User> userList = userRepository.findAll(); System.out.println(userList); } //id查询 @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"); //0为第一页 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("[email protected]"); User save = userRepository.save(user); System.out.println(save); } //删除 @Test public void delete() { userRepository.deleteById("5ffbfe8197f24a07007bd6ce"); } }