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类:

  1. 更新: save()。
  2. 查询: findAll()、find()、findOne()。
  3. 更新操作:update()。
  4. 删除操作: 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的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。

发表评论

相关文章