Spring Data MongoDB 配置
依赖库:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置:
修改src/main/resources/application.properties
文件,增加配置项:
# 购买的云服务器的公网 IP
spring.data.mongodb.host=192.168.0.1
# MongoDB 服务的端口号
spring.data.mongodb.port=27017
# 创建的数据库及用户名和密码
spring.data.mongodb.database=practice
要检查云服务器的安全设置,必须开放27017端口
Spring Data CRUD
对数据库的操作一定要放在@Service
类中,@Controller
可以调用@Service
类的方法,反之不行
@Service
类主要用于不易变的核心业务逻辑@Controller
类主要与前端页面紧密结合,调用@Service
服务读写数据,从而响应前端请求
1.新增数据
就是在数据库中插入一条数据也就是实例对象
import org.springframework.data.mongodb.core.MongoTemplate;
//@Autowired可以让系统自动注入MongoTemplate的实例
@Autowired
private MongoTemplate mongoTemplate;
public void test() {
Song song = new Song();
Q
mongoTemplate.insert(song);
}
只需要调用mongoTemplate.insert()
方法就能把对象存入数据库
2.查询数据
mongoTemplate.findById(id, 类名.class)
findById
第一个参数就是id,第二个参数是具体的类,写法就是类名.class
3.修改数据
修改操作:修改条件和修改字段
// 修改 id=1 的数据
Query query = new Query(Criteria.where("id").is("1"));
// 把名字修改为 “new name”
Update updateData = new Update();
updateData.set("name", "new name");
// 执行修改,修改返回结果的是一个对象
UpdateResult result = mongoTemplate.updateFirst(query, updateData, Song.class);
// 修改的记录数大于 0 ,表示修改成功
System.out.println("修改的数据记录数量:" + result.getModifiedCount());
先使用条件对象Criteria
构建条件对象Query
实例,然后调用修改对象Update
方法.set()
设置要修改的字段.
最后调用mongoTemplate.updateFirst(query, updateData, 类名.class)
方法完成修改
4.删除数据
调用mongoTemplate.remove()
方法可以删除数据,参数是对象,表示要删除的数据.
Song song = new Song();
song.setId(songId);
// 执行删除
DeleteResult result = mongoTemplate.remove(song);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());
删除数据一定要谨慎,通过主键来删除数据保证不误删
Spring Data Query
List<Song> songs = mongoTemplate.find(query, 类名.class);
因为可能查询到很多条数据,所以返回的结果是对象的集合,第一个参数是查询对象Query
实例,第二个参数表示查询什么对象.
查询操作复杂在于条件,需要构建好的Criteria
条件对象的实例:
Query query = new Query(criteria);
- 单一条件用:
Criteria criteria1 = Criteria.where("条件字段名").is("条件值")
- 组合条件,多个子条件对象组合成一个总条件对象:
或(or)关系
Criteria criteria = new Criteria();
criteria.orOperator(criteria1, criteria2);
且(and)关系:
Criteria criteria = new Criteria();
criteria.andOperator(criteria1, criteria2);
orOperator()和andOperator()的参数可以是多个子条件也可以是子条件数组
Spring Data 分页
分页是查询中最常用的功能,同时也为了防止查询的数据量太大而影响性能
查询支持分页只需要调用PageRequest.of()
方法构建分页对象,然后注入到查询对象即可
PageRequest.of()
方法第一个参数是页码,从0开始计数,第一页的值是0,第二个参数是每页的数量
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
Pageable pageable = PageRequest.of(0 , 20);
query.with(pageable);
要实现完整的分页还要两个步骤:
- 调用
count(query, XXX.class)
方法查询总数,第一个参数是查询条件,第二个参数表示查询什么样的对象 - 根据结果,分页条件,总数三个数据构建分页器对象
import org.springframework.data.domain.Page;
import org.springframework.data.repository.support.PageableExecutionUtils;
// 总数
long count = mongoTemplate.count(query, Song.class);
// 构建分页器
Page<Song> pageResult = PageableExecutionUtils.getPage(songs, pageable, new LongSupplier() {
@Override
public long getAsLong() {
return count;
}
});
PageableExecutionUtils.getPage()
方法第一个参数是查询结果,第二个参数是分页对象,第三个参数是实现一个LongSupplier
接口的匿名类,在匿名类的getAsLong()
方法中返回结果总数.