1. 程式人生 > 程式設計 >Spring Boot之搞定mongoTemplate的知識小結

Spring Boot之搞定mongoTemplate的知識小結

最近開發一些MongoDB+Spring Boot的專案,發現相較於MyBatis來說,Spring Boot對於MongoDB進行操作變化更多,所以總結一下使用mongoTemplate庫的知識點,以備以後查閱方便。

首先在專案中的pom.xml配置檔案中新增如下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

在需要引入mongoTemplate物件的Service檔案中新增該物件即可,如下所示:

public class JobService {

  // 引入mongoTemplate物件
  @Autowired
  MongoTemplate mongoTemplate;

針對CURD操作,常用的API方法有如下4類:

  • 更新: save()。
  • 查詢: findAll()、find()、findOne()。
  • 更新操作:update()。
  • 刪除操作: remove()。

下面以一個實際的CRUD例子來講解具體用法,在註釋中會給出語法。
先還是建立一個數據類,假設我們是對武俠劍客資料進行操作,POJO物件的定義程式碼如下所示。

/**
 * 武俠劍客類
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "my_sworders")
public class MySworder implements Serializable {
  // 劍客的ID
  @Id
  private String id;
  // 姓名
  @Field
  private String name;
  // 生平描述
  @Field
  private String description;
  // 絕招
  @Field
  private String skill;

  // 建立時間
  @Field
  private int created;
}

其中特別注意的是,@Document是mongodb驅動庫提供設定操作的文件集合名稱的註解,這裡設定集合為my_sworders。
然後針對這個劍客類編寫一個Service檔案,命名為SworderService.java:

@Service
public class SworderService {

  @Autowired
  MongoTemplate mongoTemplate;

  /**
   * 新增一個劍客
   * @param mySworder
   * @return
   */
  public boolean add(MySworder mySworder) {
    long unixTime = System.currentTimeMillis() / 1000L;
    int nowUnixTime = (int) unixTime;
    mySworder.setCreated(nowUnixTime);
    /**
     * 語法:<T> T mongoTemplate.save(T objectToSave)
     * save方法用於儲存資料物件,傳遞定義好的JavaBean即可,被儲存的資料物件會作為返回值被返回。
     * 類似地,使用insert也可以達到儲存資料的作用。
     */
    MySworder obj = mongoTemplate.save(mySworder);
    if (obj.getId() > 0) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 獲取所有劍客資料
   * @return
   */
  public List<MySworder> findAll() {
    /**
     * 語法:<T> List<T> findAll(Class<T> entityClass)
     * finAll會返回所有entityClass對應的資料集合的資料,相當於MySQL中select * from xxx_table_name。
     */
    return mongoTemplate.findAll(MySworder.class);
  }


  public boolean update(MySworder mySworder) {
    // 建立查詢物件
    Query query = Query.query(Criteria.where("id").is(mySworder.getId()));
    Update update = new Update();
    update.set("name",mySworder.getName());
    update.set("description",mySworder.getDescription());
    update.set("skill",mySworder.getSkill());

    /**
     * 語法:public UpdateResult updateFirst(Query query,UpdateDefinition update,Class<?> entityClass)
     * updateFirst用於更新第一個被匹配的資料,query引數是查詢條件物件,update是需要更新的資料物件,entityClass就是對應的JavaBean物件(文件集合類)
     */
    UpdateResult updateResult = mongoTemplate.updateFirst(query,update,MyArticle.class);
    if (updateResult.getModifiedCount() > 0) {
      return true;
    } else {
      return false;
    }
  }

  public boolean updateBatchByKeyWords(String searchKey,String replaceString) {
    // 建立模糊查詢物件
    Pattern pattern = Pattern.compile("^.*" + searchKey + ".*$",Pattern.CASE_INSENSITIVE);
    Criteria criteria = Criteria.where("description").regex(pattern);
    Update update = new Update();
    update.set("description",replaceString);
    Query query = new Query();
    query.addCriteria(criteria);

    /**
     * 語法:public UpdateResult updateMulti(Query query,Class<?> entityClass)
     * updateMulti用於所有被匹配的資料,query引數是查詢條件物件,update是需要更新的資料物件,entityClass就是對應的JavaBean物件(文件集合類)
     */
    UpdateResult updateResult = mongoTemplate.updateMulti(query,MySworder.class);
    if (updateResult.getModifiedCount() > 0) {
      return true;
    } else {
      return false;
    }
  }

  public boolean delete(String id) {
    MySworder mySworder = new MySworder();
    mySworder.setId(id);
    /**
     * 語法: DeleteResult remove(Object object)
     * 該方法用於刪除資料,一般都是傳遞一個主鍵ID即可
     */
    DeleteResult deleteResult = mongoTemplate.remove(mySworder);
    if (deleteResult.getDeletedCount() > 0) {
      return true;
    } else {
      return false;
    }
  }
   public MySworder details(String id) {
       Query query = Query.query(Criteria.where("id").is(id));
       /**
        * <T> T findOne(Query query,Class<T> entityClass)
        *
        * findOne就是根據查詢條件(query)獲取一條資料。
        */
       return mongoTemplate.findOne(query,MySworder.class);
   }

}

其中模糊查詢是使用了regex方法,並使用匹配Pattern物件來儲存需要被匹配的字串。

如果是多條件查詢,則需要使用Query物件來儲存多個查詢條件,具體程式碼如下:

// 用於儲存條件物件
Query query = new Query();
Criteria nameCriteria = Criteria.where("name").is(loginUser.getName());
Criteria passwordCriteria = Criteria.where("password").is(loginUser.getPassword());

query.addCriteria(nameCriteria);
query.addCriteria(passwordCriteria);

MyUser hasUser = mongoTemplate.findOne(query,MyUser.class);
Integer userId = hasUser.getId();

如果查詢條件很多,那麼這個addCriteria的程式碼段就會很長,這個時候就考慮自己再封裝一個工具類,把迴圈查詢條件和一些複雜查詢的過程給封裝成一個方法,這樣事半功倍。

到此這篇關於Spring Boot之搞定mongoTemplate的知識小結的文章就介紹到這了,更多相關Spring Boot搞定mongoTemplate內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!