zoukankan      html  css  js  c++  java
  • 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的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。

  • 相关阅读:
    flask(十)使用alembic,进行数据库结构管理,升级,加表,加项
    Python sqlalchemy使用
    flask+script命令行交互工具
    flask+APScheduler 任务调度,计划任务,定时任务
    DBA日常工作职责
    Oracle 的 VKTM 进程
    linux
    UF2.0、O4、UFT、TA众明星背后的秘密
    ORA-01502: 索引或这类索引的分区处于不可用状态
    关于Optimizer_index_cost_adj参数的设置
  • 原文地址:https://www.cnblogs.com/freephp/p/14140921.html
Copyright © 2011-2022 走看看