Spring Data mongoDB - 图1

Spring Data MongoDB 配置

添加依赖

https://start.spring.io/创建工程时,需要增加依赖
Spring Data mongoDB - 图2

或者可以手动添加依赖库

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </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 ,有的云服务商为安全起见默认关闭了此端口,所以要在安全设置中设置一下。
Spring Data mongoDB - 图3

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 的参数,都可以输入多个子条件,也可以输入子条件数组。
      组合条件情况下,也可以多层组合,子条件也可以是组合而来的。