Spring Boot之搞定mongoTemplate的知識(shí)小結(jié)
最近開發(fā)一些MongoDB+Spring Boot的項(xiàng)目,發(fā)現(xiàn)相較于MyBatis來(lái)說(shuō),Spring Boot對(duì)于MongoDB進(jìn)行操作變化更多,所以總結(jié)一下使用mongoTemplate庫(kù)的知識(shí)點(diǎn),以備以后查閱方便。
首先在項(xiàng)目中的pom.xml配置文件中添加如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
在需要引入mongoTemplate對(duì)象的Service文件中添加該對(duì)象即可,如下所示:
public class JobService {
// 引入mongoTemplate對(duì)象
@Autowired
MongoTemplate mongoTemplate;
針對(duì)CURD操作,常用的API方法有如下4類:
- 更新: save()。
- 查詢: findAll()、find()、findOne()。
- 更新操作:update()。
- 刪除操作: remove()。
下面以一個(gè)實(shí)際的CRUD例子來(lái)講解具體用法,在注釋中會(huì)給出語(yǔ)法。
先還是創(chuàng)建一個(gè)數(shù)據(jù)類,假設(shè)我們是對(duì)武俠劍客數(shù)據(jù)進(jìn)行操作,POJO對(duì)象的定義代碼如下所示。
/**
* 武俠劍客類
*/
@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;
// 創(chuàng)建時(shí)間
@Field
private int created;
}
其中特別注意的是,@Document是mongodb驅(qū)動(dòng)庫(kù)提供設(shè)置操作的文檔集合名稱的注解,這里設(shè)置集合為my_sworders。
然后針對(duì)這個(gè)劍客類編寫一個(gè)Service文件,命名為SworderService.java:
@Service
public class SworderService {
@Autowired
MongoTemplate mongoTemplate;
/**
* 添加一個(gè)劍客
* @param mySworder
* @return
*/
public boolean add(MySworder mySworder) {
long unixTime = System.currentTimeMillis() / 1000L;
int nowUnixTime = (int) unixTime;
mySworder.setCreated(nowUnixTime);
/**
* 語(yǔ)法:<T> T mongoTemplate.save(T objectToSave)
* save方法用于保存數(shù)據(jù)對(duì)象,傳遞定義好的JavaBean即可,被保存的數(shù)據(jù)對(duì)象會(huì)作為返回值被返回。
* 類似地,使用insert也可以達(dá)到保存數(shù)據(jù)的作用。
*/
MySworder obj = mongoTemplate.save(mySworder);
if (obj.getId() > 0) {
return true;
} else {
return false;
}
}
/**
* 獲取所有劍客數(shù)據(jù)
* @return
*/
public List<MySworder> findAll() {
/**
* 語(yǔ)法:<T> List<T> findAll(Class<T> entityClass)
* finAll會(huì)返回所有entityClass對(duì)應(yīng)的數(shù)據(jù)集合的數(shù)據(jù),相當(dāng)于MySQL中select * from xxx_table_name。
*/
return mongoTemplate.findAll(MySworder.class);
}
public boolean update(MySworder mySworder) {
// 創(chuàng)建查詢對(duì)象
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());
/**
* 語(yǔ)法:public UpdateResult updateFirst(Query query, UpdateDefinition update, Class<?> entityClass)
* updateFirst用于更新第一個(gè)被匹配的數(shù)據(jù),query參數(shù)是查詢條件對(duì)象,update是需要更新的數(shù)據(jù)對(duì)象,entityClass就是對(duì)應(yīng)的JavaBean對(duì)象(文檔集合類)
*/
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MyArticle.class);
if (updateResult.getModifiedCount() > 0) {
return true;
} else {
return false;
}
}
public boolean updateBatchByKeyWords(String searchKey,String replaceString) {
// 創(chuàng)建模糊查詢對(duì)象
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);
/**
* 語(yǔ)法:public UpdateResult updateMulti(Query query, UpdateDefinition update, Class<?> entityClass)
* updateMulti用于所有被匹配的數(shù)據(jù),query參數(shù)是查詢條件對(duì)象,update是需要更新的數(shù)據(jù)對(duì)象,entityClass就是對(duì)應(yīng)的JavaBean對(duì)象(文檔集合類)
*/
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);
/**
* 語(yǔ)法: DeleteResult remove(Object object)
* 該方法用于刪除數(shù)據(jù),一般都是傳遞一個(gè)主鍵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就是根據(jù)查詢條件(query)獲取一條數(shù)據(jù)。
*/
return mongoTemplate.findOne(query, MySworder.class);
}
}
其中模糊查詢是使用了regex方法,并使用匹配Pattern對(duì)象來(lái)保存需要被匹配的字符串。
如果是多條件查詢,則需要使用Query對(duì)象來(lái)保存多個(gè)查詢條件,具體代碼如下:
// 用于存儲(chǔ)條件對(duì)象
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();
如果查詢條件很多,那么這個(gè)addCriteria的代碼段就會(huì)很長(zhǎng),這個(gè)時(shí)候就考慮自己再封裝一個(gè)工具類,把循環(huán)查詢條件和一些復(fù)雜查詢的過(guò)程給封裝成一個(gè)方法,這樣事半功倍。
到此這篇關(guān)于Spring Boot之搞定mongoTemplate的知識(shí)小結(jié)的文章就介紹到這了,更多相關(guān)Spring Boot搞定mongoTemplate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中關(guān)于String StringBuffer StringBuilder特性深度解析
這篇文章主要介紹了Java中關(guān)于String StringBuffer StringBuilder特性深度解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Java線程之鎖對(duì)象Lock-同步問(wèn)題更完美的處理方式代碼實(shí)例
這篇文章主要介紹了Java線程之鎖對(duì)象Lock-同步問(wèn)題更完美的處理方式代碼實(shí)例,還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考。2017-11-11
SpringBoot使用Validation校驗(yàn)參數(shù)的詳細(xì)過(guò)程
這篇文章主要介紹了SpringBoot使用Validation校驗(yàn)參數(shù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
Java獲取CPU和內(nèi)存占用率最簡(jiǎn)單的方法
這篇文章主要介紹了Java獲取CPU和內(nèi)存占用率最簡(jiǎn)單的方法,文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06
Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Spring Boot集成Redis實(shí)現(xiàn)緩存機(jī)制(從零開始學(xué)Spring Boot)
這篇文章主要介紹了Spring Boot集成Redis實(shí)現(xiàn)緩存機(jī)制(從零開始學(xué)Spring Boot),需要的朋友可以參考下2017-04-04
java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例
定長(zhǎng)隊(duì)列是一種有限容量的隊(duì)列,對(duì)于某些應(yīng)用場(chǎng)景非常有用,本文主要介紹了java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

