Spring Boot之搞定mongoTemplate的知识小结

网友投稿 1143 2023-02-28

Spring Boot之搞定mongoTemplate的知识小结

Spring Boot之搞定mongoTemplate的知识小结

最近开发一些MongoDB+Spring Boot的项目,发现相较于MyBatis来说,Spring Boot对于MongoDB进行操作变化更多,所以总结一下使用mongoTemplate库的知识点,以备以后查阅方便。

首先在项目中的pom.xml配置文件中添加如下依赖:

org.springframework.boot

spring-boot-starter-data-mongodb

在需要引入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 mongoTemplate.save(T objectToSave)

* save方法用于保存数据对象,传递定义好的JavaBean即可,被保存的数据对象会作为返回值被返回。

* 类似地,使用insert也可以达到保存数据的作用。

*/

MySworder obj = mongoTemplate.save(mySworder);

if (obj.getId() > 0) {

return true;

} else {

return false;

}

}

/**

* 获取所有剑客数据

* @return

*/

public List findAll() {

/**

* 语法: List findAll(Class 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.Chttp://ASE_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 findOne(Query query, Class 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的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue开发小程序技术(vue可以开发小程序吗)
下一篇:SpringBoot应用快速部署到K8S的详细教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~