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類:

  1. 更新: save()。
  2. 查詢: findAll()、find()、findOne()。
  3. 更新操作:update()。
  4. 刪除操作: 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, UpdateDefinition update, Class<?> entityClass)
         * updateMulti用於所有被匹配的數據,query參數是查詢條件對象,update是需要更新的數據對象,entityClass就是對應的JavaBean對象(文檔集合類)
         */
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, 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的代碼段就會很長,這個時候就考慮自己再封裝一個工具類,把循環查詢條件和一些復雜查詢的過程給封裝成一個方法,這樣事半功倍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM