SpringBoot集成MongoDB
Spring boot集成mongodb简介
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb。
MongoRepository操作简单
MongoTemplate操作灵活
我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
搭建项目环境
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.yaml
spring:
data:
mongodb:
uri: mongodb://root:123456@192.168.0.103:27017/myMongo
# 如果高版本mongodb
spring:
data:
mongodb:
uri: mongodb://root:123456@192.168.0.103:27017/myMongo?authSource=admin&authMechanism=SCRAM-SHA-1
实战基础CRUD
创建基础集合类
/**
* 对应mongo中集合类
* */
@Data
public class Person {
private String id;
private String name;
private Integer age;
}
MongoRepository方式
以Spring Date为中心的方法,基于所有Spring数据项目中众所周知的访问模式,提供更加灵活和复杂的api操作。
使用MongoRepository可以不写相关的查询组合语句,它会内部为我们实现这样的一个类。
按规定定义好接口名就可以免去写查询组合语句。
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
Spring Data可以允许只定义接口,只要遵循 Spring Data的规范,就无需写实现类。 在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性,与继承 Repository 等价。
Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository:继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository:继承 CrudRepository,实现了一组分页排序相关的方法
MongoRepository:继承 PagingAndSortingRepository,实现一组 mongodb规范相关的方法
创建数据访问层
/**
* 创建数据访问层集成MongoRepository<User, String>,第一个参数为实体类,后一个为主键ID的类型
*/
public interface PersonRepository extends MongoRepository<Person, String> {
}
新增
@Test
void save() {
Person person = new Person();
person.setId("5");
person.setName("你好");
Person person1 = personRepository.save(person);
System.out.println(person1);
}
修改
@Test
public void updateUser() {
Person person = personRepository.findById("4").get();
person.setName("张三_1");
person.setAge(25);
Person save = personRepository.save(person);
System.out.println(save);
}
删除
@Test
public void delete() {
personRepository.deleteById("5");
}
查询所有
@Test
public void findUser() {
List<Person> list = personRepository.findAll();
System.out.println(list);
}
id查询
@Test
public void getById() {
Person person = personRepository.findById("1").get();
System.out.println(person);
}
条件查询
@Test
public void findUserList() {
Person person = new Person();
person.setName("李四");
person.setAge(30);
Example<Person> example = Example.of(person);
List<Person> list = personRepository.findAll(example);
System.out.println(list);
}
模糊查询
@Test
public void findUsersLikeName() {
//创建匹配器,即如何使用查询条件
ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
Person user = new Person();
user.setName("孙");
Example<Person> example = Example.of(user, matcher);
List<Person> list = personRepository.findAll(example);
System.out.println(list);
}
分页查询
@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); //改变默认大小写忽略方式:忽略大小写
Person person = new Person();
person.setName("孙");
//创建实例
Example<Person> example = Example.of(person, matcher);
Page<Person> pages = personRepository.findAll(example, pageable);
System.out.println(pages.getContent());
}
方法API汇总
count()统计总数
count(Example< S > example)条件统计总数
delete(T entities)通过对象信息删除某条数据
deleteById(ID id)通过id删除某条数据
deleteALL(Iterable<? extends T> entities)批量删除某条数据
deleteAll() 清空表中所有的数据
existsById(ID id) 判断数据是否存在
exists(Example< T > example) 判断某特定数据是否存在
findAll() 获取表中所有的数据
findAll(Sort sort) 获取表中所有的数据,按照某特定字段排序
findAll(Pageable pageAble) 获取表中所有的数据,分页查询
findAll(Example< T > example) 条件查询
findAll(Iterable ids) 条件查询
findAll(Example< T > example,Pageable pageable) 条件分页查询
findAll(Example< T > example,Sort sort) 条件查询排序
findOneById(ID id) 通过id查询一条数据
findOne(Example example) 通过条件查询一条数据
insert(S entities) 插入一条数据
insert(Iterable< T > entities) 插入多条数据
save(S entities) 保存一条数据
saveAll(Iterable< T > entities)
save(Iterable< T > iterable) 加入多条数据
MongoTemplate方式
MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面
MongoTemplate的两大核心类
Criteria类:封装所有的语句,以方法的形式查询。
Query类:将语句进行封装或者添加排序之类的操作。
MongoTemplate提供了很多操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。
MongoDB documents和domain classes之间的映射关系是通过实现了MongoConverter这个接口来实现的
注入MongoTemplate
@Autowired
private MongoTemplate template;
新增
@Test
void save() {
Person person = new Person();
person.setId("2");
person.setName("张三三");
template.save(person);
}
修改
@Test
void update() {
Query query = new Query(Criteria.where("id").is("1"));
Update update = new Update().set("name", "李四").set("age", 30);
template.updateFirst(query, update, Person.class);
}
删除
@Test
void delete() {
Query query = new Query(Criteria.where("id").is("2"));
template.remove(query, Person.class);
}
查询所有
@Test
public void findUser() {
List<Person> list = template.findAll(Person.class);
System.out.println(list);
}
条件查询
@Test
public void findUserList() {
Query query = new Query(Criteria
.where("name").is("孙悟空")
.and("age").is(20));
List<Person> list = template.find(query, Person.class);
System.out.println(list);
}
模糊查询
@Test
public void findUsersLikeName() {
String name = "孙";
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<Person> list = template.find(query, Person.class);
System.out.println(list);
}
- 感谢你赐予我前进的力量