SpringBoot集成MongoDB
Spring Data : Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。
spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,其中MongoTemplate操作灵活而MongoRepository操作简单。项目中可以灵活使用。
以Spring Date为中心的方法,基于所有Spring数据项目中众所周知的访问模式,提供更加灵活和复杂的api操作。
使用MongoRepository可以不写相关的查询组合语句,它会内部为我们实现这样的一个类。
按规定定义好接口名就可以免去写查询组合语句。
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
Spring Data可以允许只定义接口,只要遵循 Spring Data的规范,就无需写实现类。
在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性,与继承 Repository 等价。
MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面.
MongoTemplate的两大核心类
Criteria类:封装所有的语句,以方法的形式查询。
Query类:将语句进行封装或者添加排序之类的操作。
MongoTemplate提供了很多操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。
MongoDB documents和domain classes之间的映射关系是通过实现了MongoConverter这个接口来实现的
步骤
1、导入依赖
org.springframework.boot
spring-boot-starter-data-mongodb
2、配置文件添加配置(结合自己应用做修改,这只是基础学习测试)
spring.data.mongodb.uri=mongodb://userName:[email protected]:27017/dbName
3、创建对应实体类
实体类上添加@Document(“集合/表名”),id属性由于MongoDB会生成24位的字符串需要设置为String类型且需要添加注解@Id。
4、
1、创建数据访问层集成MongoRepository
public interface UserRepository extends MongoRepository {
}
//MongoRepository 方法
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) 加入多条数据
2、编写测试类
//注入刚刚定义的数据访问层的接口
@Autowired
private UserRepository userRepository;
//添加
@Test
void create() {
User u=new User();
u.setEmail("[email protected]");
u.setAge(21);
u.setName("xiaowang");
User user = userRepository.insert(u);
System.out.println(user);
}
//查询所有
@Test
void find(){
List users = userRepository.findAll();
System.out.println(users);
}
//通过id查询
@Test
void findById(){
//Optional用来解决null判断问题的类
Optional byId = userRepository.findById("6271dd84dac52a06a5dde65e");
User user = byId.get();
System.out.println(byId);
System.out.println(user);
}
//多条件查询
@Test
void findByCondition(){
/**
* 关于Example 示例查询
* 1、由Probe和ExampleMatcher构成,他可以动态构建查询体,不需要开发者便携包含字段名的查询
* 2、Probe可以理解为查询构建的实例对象,ExampleMatcher匹配器
* 3、限制:不支持嵌套或者分组、不支持字符串的开始、包含、结束和正则表达式匹配
* 4、默认情况下实例对象的属性值为null时会被忽略,如果不是就会取值作为sql匹配条件,字符串
类型的数据将会被特定的默认值匹配。
* 注意:如果一个字段不是包装类型,而是基础类型,他也会参与到where条件中去,值为默认值。
* 5、of()为工厂方法,用来构建示例
* 6、除字符串类型属性外,其他属性只支持精准查询,且字符串类型默认也为精准查询
* 7、匹配器可以用来对匹配方式自定义操作,类似改变字符串为模糊查询、执行后缀字符串查询。
* 注意:默认情况匹配器期望实例对象上的所有属性都匹配,但也可以在内部为单个属性设置特
有的处理方式
*
*/
User u=new User();
u.setName("xiaolu");
u.setAge(21);
Example userExample =Example.of(u);
System.out.println(userExample);
List users = userRepository.findAll(userExample);
System.out.println(users);
}
//模糊查询
@Test
void findLikeUser(){
ExampleMatcher exampleMatcher=ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//设置字符串模糊查询规则
.withIgnoreCase(true);//设置忽略大小写
User u=new User();
u.setName("lu");
u.setEmail("123");
Example userExample = Example.of(u, exampleMatcher);
List users = userRepository.findAll(userExample);
System.out.println(users);
}
//分页查询
@Test
void findByPage(){
/**
* 设置分页查询 可设置当前页数、每页条数,也可设置指定的Sort排序规则等
* 注意:该当前页从0开始
*/
Pageable pageable = PageRequest.of(1, 3);
User u=new User();
Example userExample = Example.of(u);
Page userPage = userRepository.findAll(userExample, pageable);
System.out.println(userPage);
System.out.println(userPage.getContent());
System.out.println(userPage.getTotalPages());
}
//更新
@Test
void update(){
User user = userRepository.findById("627120bf48f3efd7bcb4348b").get();
user.setEmail("[email protected]");
//带id的user save方法会做修改逻辑 不带id 执行添加逻辑
User save = userRepository.save(user);
System.out.println(save);
}
//删除
@Test
void delete(){
userRepository.deleteById("6271e3c3d86e9b3c0b4f4e57");
}
方式二、MongoTemplate
//注入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
//添加
@Test
void create() {
User user=new User();
user.setName("xiaodeng");
user.setAge(21);
user.setEmail("[email protected]");
User u = mongoTemplate.insert(user);
System.out.println(u);
}
//查询所有
@Test
void find(){
List users = mongoTemplate.findAll(User.class);
for (User user : users) {
System.out.println(user);
}
}
//通过id查询
@Test
void findById(){
User user = mongoTemplate.findById("627120bf48f3efd7bcb4348b", User.class);
System.out.println(user);
}
//条件组合查询
@Test
void findByCondition(){
/**
* name = xiaodeng and age = 21 组合查询
*/
Query query=new Query(
Criteria.where("name").is("xiaodeng").and("age").is(21)
);
List users = mongoTemplate.find(query, User.class);
for (User user : users) {
System.out.println(user);
}
}
//模糊查询
@Test
void findLikeUser(){
/**
* name like deng
*/
String name="deng";
//正则规则
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 users = mongoTemplate.find(query, User.class);
for (User user : users) {
System.out.println(user);
}
}
//分页查询
@Test
void findByPage(){
Integer pageNum=1;
Integer pageSize=2;
Query query=new Query();
//查询记录数 query必须填写可以不构建条件,但不能类似mp直接写null
long count = mongoTemplate.count(query, User.class);
//分页 skip为跳过这几条数据意味着开始位置,limit为每页的数据量
List users = mongoTemplate.find(query.skip((pageNum - 1) *
pageSize).limit(pageSize), User.class);
for (User user : users) {
System.out.println(user);
}
System.out.println(count);
}
//修改
@Test
void update(){
Query query=new Query(
Criteria.where("_id").is("6271223648f3efd7bcb4348c")
);
Update update=new Update();
update.set("name","xiaozuo");
update.set("age",22);
update.set("email","[email protected]");
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long matchedCount = upsert.getMatchedCount();//影响行数
System.out.println(upsert);
}
//删除
@Test
void delete(){
Query query=new Query(
Criteria.where("_id").is("6271223648f3efd7bcb4348c")
);
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deletedCount = remove.getDeletedCount();//影响行数
System.out.println(deletedCount);//1 成功 0 失败
}