Spring Data MongoDB 配置
添加依赖
在 https://start.spring.io/创建工程时,需要增加依赖
或者可以手动添加依赖库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置
在 src/main/resources/application.properties
中配置,
# 购买的云服务器的公网 IP
spring.data.mongodb.host=xxx.xxx.xxx.xxx
# MongoDB 服务的端口号
spring.data.mongodb.port=27017
# 创建的数据库及用户名和密码
spring.data.mongodb.database=practice
spring.data.mongodb.username=pppp
spring.data.mongodb.password=111aaa
云服务器安全设置
MongoDB
的端口为 27017
,有的云服务商为安全起见默认关闭了此端口,所以要在安全设置中设置一下。
CURD
SpringMVC
的经典架构设计:
对数据库的操作一定放在 @Service
类中,且 @controller
类可以调用 @Service
类的方法,反之则不行。
新增数据
import org.springframework.data.mongodb.core.MongoTemplate;
@Autowired
private MongoTemplate mongoTemplate;
public void test() {
Song song = new Song();
song.setSubjectId("s001");
song.setLyrics("...");
song.setName("成都");
mongoTemplate.insert(song);
}
查询数据
mongoTemplate.findById(songId, Song.class)
修改数据
修改操作分为两部分:修改条件和修改的字段,以下是一个修改歌曲的例子
@Override
public boolean modify(Song song) {
// 作为服务,要对入参进行判断,不能假设被调用时,入参一定正确
if (song == null || !StringUtils.hasText(song.getId())) {
LOG.error("input song data is not correct.");
return false;
}
// 主键不能修改
Query query = new Query(Criteria.where("id").is(song.getId()));
Update updateData = new Update();
// 值为 null 表示不修改。值为长度为 0 的字符串 "" 表示清空此字段
if (song.getName() != null) {
updateData.set("name", song.getName());
}
if (song.getLyrics() != null) {
updateData.set("lyrics", song.getLyrics());
}
if (song.getSubjectId() != null) {
updateData.set("subjectId", song.getSubjectId());
}
UpdateResult result = mongoTemplate.updateFirst(query, updateData, Song.class);
return result != null && result.getModifiedCount() > 0;
}
删除数据
Song song = new Song();
//通过主键来删除数据,是保证不误删的一个比较好的办法
song.setId(songId);
// 执行删除
DeleteResult result = mongoTemplate.remove(song);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());
多条件查询
查询操作的核心方法是:
List<Song> songs = mongoTemplate.find(query, Song.class);
因为可能查出多条数据,所以返回结果是对象的集合,第一个参数是查询对象 Query
实例,第二个参数是查询的对象。
查询操作的复杂性在于条件,需要用构建好的 Criteria
条件对象的实例来构建 Query
实例。
构建 Criteria
条件对象
一般有两种情况:
- 单一条件:用
Criteria criteria = Criteria.where("条件字段名").is("条件值")
即可返回一个条件对象的实例。 组合条件:根据或、且的关系进行组合,多个子条件对象组合成一个总条件对象
or
或Criteria cirteria = new Criteria(); criteria.orOperator(criteria1, criteria2);
and
且Criteria criteria = new Criteria(); criteria.andOperator(criteria1, criteria2);
orOperator()
和andOperator
的参数,都可以输入多个子条件,也可以输入子条件数组。
组合条件情况下,也可以多层组合,子条件也可以是组合而来的。