Bootstrap

使用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分页器对象,使用起来比较方便

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;