使用SpringBoot-data-mongodb操作MongoDB
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
数据库配置
spring.data.mongodb.host=
# MongoDB 服务的端口号
spring.data.mongodb.port=27017
# 创建的数据库及用户名和密码
spring.data.mongodb.database=
增删改查:
增加数据:
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);
}
对于有id属性的实体类用save添加数据
UserLog userLog = new UserLog(2, 2, "test1", "test1", "test1", new Date(), "test");
UserLog save = mongoTemplate.save(userLog);
用findAll查询所有数据
System.out.println("插入成功"+save);
List<UserLog> all = mongoTemplate.findAll(UserLog.class);
System.out.println("查询成功"+all);
UserLog byId = mongoTemplate.findById(1, UserLog.class);
System.out.println(byId);
用findById查询单条数据
修改数据
// 修改 id=1 的数据
Query query = new Query(Criteria.where("id").is(userLog.getId()));
System.out.println(query);
Update update = new Update();
update.set("oldValue", userLog.getOldValue());
// 执行修改,修改返回结果的是一个对象
UpdateResult result = mongoTemplate.updateFirst(query, update, UserLog.class);
// 修改的记录数大于 0 ,表示修改成功
System.out.println("修改的数据记录数量:" + result.getModifiedCount());
UserLog byId = mongoTemplate.findById(2, UserLog.class);
System.out.println(byId);
删除数据
DeleteResult result = mongoTemplate.remove(userLog);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());
}
根据多条件查询SpringDataQuery
List<Song> songs = mongoTemplate.find(query, Song.class);
因为可能查看到多条数据,所以返回的结果就是对象的集合,第一个参数是查询对象Query实例,第二个参数是查询什么对象.class
先构建Query实例
Query query = new Query(criteria);
构建情况(两种):
- Criteria criteria1 = Criteria.where("条件字段名").is("条件值")
- 组合条件:
Criteria criteria = new Criteria();
criteria.orOperator(criteria1, criteria2);
Criteria criteria = new Criteria();
criteria.andOperator(criteria1, criteria2);
多重条件混合
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Criteria;
public List<Song> list(Song songParam) {
// 总条件
Criteria criteria = new Criteria();
// 可能有多个子条件
List<Criteria> subCris = new ArrayList();
if (StringUtils.hasText(songParam.getName())) {
subCris.add(Criteria.where("name").is(songParam.getName()));
}
if (StringUtils.hasText(songParam.getLyrics())) {
subCris.add(Criteria.where("lyrics").is(songParam.getLyrics()));
}
if (StringUtils.hasText(songParam.getSubjectId())) {
subCris.add(Criteria.where("subjectId").is(songParam.getSubjectId()));
}
// 必须至少有一个查询条件
if (subCris.isEmpty()) {
LOG.error("input song query param is not correct.");
return null;
}
// 三个子条件以 and 关键词连接成总条件对象,相当于 name='' and lyrics='' and subjectId=''
criteria.andOperator(subCris.toArray(new Criteria[]{}));
// 条件对象构建查询对象
Query query = new Query(criteria);
// 仅演示:由于很多同学都在运行演示程序,所以需要限定输出,以免查询数据量太大
query.limit(10);
List<Song> songs = mongoTemplate.find(query, Song.class);
return songs;
}
SpringData分页
查询支持分页比较简单只要调用PageRequest.of();
第一个参数是页码,从0开始,第二个是每页的数量
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
Pageable pageable = PageRequest.of(0 , 20);
query.with(pageable);
对于分页来说,除了要查询结果意外,还需要查询总数,才能进一步计算出总共多少页,实现完整的分页功能,因此还需要两个步骤:
1.调用count(query,xx.class)查询总数
2.根据结果,分页条件,总数三个数据,构建分页器对象
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() 方法中返回结果总数。方法返回值是一个 Page分页器对象,使用起来比较方便