Spring Boot之搞定mongoTemplate的知识小结

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Spring Boot之搞定mongoTemplate的知识小结

freephp   2020-12-16 我要评论
这篇文章主要介绍了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的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们