首页 > 编程语言 > Spring Boot之搞定mongoTemplate的知识小结
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的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。

到此这篇关于Spring Boot之搞定mongoTemplate的知识小结的文章就介绍到这了,更多相关Spring Boot搞定mongoTemplate内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

编程技巧