Spring Boot之搞定mongoTemplate的知识小结
freephp 人气:0这篇文章主要介绍了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, 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的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。
加载全部内容