SpringBoot2.3集成mongdb并封装CRUD基类

上篇写到,将设备数据改传到 monggodb,本篇博文记录一下具体过程。
SpringBoot 内置 Mongdb 模块 MongoTemplate, 类似于 RedisTemplate

1. 添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

2. 增加配置

spring:
  data:
    mongodb:
      uri: mongodb://username:password@ip:posrt/database

3. 配置连接信息(这里简单连接,如果需要配置连接池等信息,可自行查看源码,在 URL 后拼接参数)

com.mongodb.MongoClientSettings.Builder#applyConnectionString

 

 private static final String MONGODB_PREFIX = "mongodb://";
    private static final String MONGODB_SRV_PREFIX = "mongodb+srv://";
    private static final Set<String> ALLOWED_OPTIONS_IN_TXT_RECORD = new HashSet<String>(asList("authsource", "replicaset"));
    private static final String UTF_8 = "UTF-8";
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> Logger LOGGER = Loggers.getLogger("uri"<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> MongoCredential credential;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> isSrvProtocol;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> List&lt;String&gt;<span style="color: rgba(0, 0, 0, 1)"> hosts;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> String database;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> String collection;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> String connectionString;

</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> ReadPreference readPreference;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WriteConcern writeConcern;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Boolean retryWrites;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Boolean retryReads;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> ReadConcern readConcern;

</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer minConnectionPoolSize;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer maxConnectionPoolSize;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer maxWaitTime;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer maxConnectionIdleTime;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer maxConnectionLifeTime;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer connectTimeout;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer socketTimeout;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Boolean sslEnabled;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Boolean sslInvalidHostnameAllowed;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String requiredReplicaSetName;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer serverSelectionTimeout;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer localThreshold;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Integer heartbeatFrequency;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String applicationName;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;MongoCompressor&gt;<span style="color: rgba(0, 0, 0, 1)"> compressorList;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> UuidRepresentation uuidRepresentation;

4. 去除 _class, 添加自动索引

/**

  • @program:
  • @description: 芒果 DBhepper 配置项
  • @Author: Zhangyb
  • @CreateDate: 15:37
  • @UpdateUser:
  • @UpdateDate
  • @UpdateRemark:
  • @Version: 1.0
    */

@Configuration
//@ComponentScan(basePackages = {"com.bysk.base.mongodb"}) // 聚合工程,
public class MongoConfig {
@Autowired
private MongoDatabaseFactory mongoDatabaseFactory;

@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoMappingContext mongoMappingContext;

@Bean
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MappingMongoConverter mappingMongoConverter() {
    mongoMappingContext.setAutoIndexCreation(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
    mongoMappingContext.afterPropertiesSet();
    DbRefResolver dbRefResolver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DefaultDbRefResolver(mongoDatabaseFactory);
    MappingMongoConverter converter </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MappingMongoConverter(dbRefResolver, mongoMappingContext);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 此处是去除插入数据库的 _class 字段</span>
    converter.setTypeMapper(<span style="color: rgba(0, 0, 255, 1)">new</span> DefaultMongoTypeMapper(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">));

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> converter;
}

}

View Code

4. 去除 _class, 添加自动索引

/**
 * @program: 
 * @description: 芒果 DBhepper 配置项
 * @Author: Zhangyb
 * @CreateDate: 15:37
 * @UpdateUser:
 * @UpdateDate
 * @UpdateRemark:
 * @Version: 1.0
 */

@Configuration
//@ComponentScan(basePackages = {"com.bysk.base.mongodb"}) // 聚合工程,
public class MongoConfig {
@Autowired
private MongoDatabaseFactory mongoDatabaseFactory;

@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoMappingContext mongoMappingContext;

@Bean
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MappingMongoConverter mappingMongoConverter() {
    mongoMappingContext.setAutoIndexCreation(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
    mongoMappingContext.afterPropertiesSet();
    DbRefResolver dbRefResolver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DefaultDbRefResolver(mongoDatabaseFactory);
    MappingMongoConverter converter </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MappingMongoConverter(dbRefResolver, mongoMappingContext);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 此处是去除插入数据库的 _class 字段</span>
    converter.setTypeMapper(<span style="color: rgba(0, 0, 255, 1)">new</span> DefaultMongoTypeMapper(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">));

    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> converter;
}

}

View Code

5. 创建集合实体类

/**
 * 设备数据
 *
 * @author Mark sunlightcs@gmail.com
 * @since 1.0.0 2020-11-06
 */
@Data
@Document(value="device_monitor_record")
@ToString
public class MgdbDeviceMonitorRecord  {
@Id
String id;

@ApiModelProperty(value </span>= "mqtt上传的设备序列号"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String equipmentId;

</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String monitorTime;

@ApiModelProperty(</span>"空气湿度"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> BigDecimal airHumidity;

@ApiModelProperty(</span>"大气温度"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> BigDecimal airTemperature;

}

6. 分页对象

import java.io.Serializable;
import java.util.List;

/**

  • @program: bysk

  • @Description: mongodb 分页对象

  • @Author: johnny

  • @CreateDate: 2021/1/8 16:07

  • @UpdateUser: 更新者

  • @UpdateDate: 2021/1/8 16:07

  • @UpdateRemark: 更新说明

  • @Version: 1.0
    */
    public class Page<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**

    • 总数
      */
      protected long total = 0;
      /**
    • 每页显示条数,默认 10
      */
      protected long size = 10;

    /**

    • 当前页
      */
      protected long current = 1;

    /**

    • 总页数
      */
      protected long pages = 1;

    /**

    • 结果列表
      */
      private List<T> rows;

    public Page(){
    this.current = 1;
    this.size = 10;
    }
    public Page(int currentPage, int pageSize){
    this.current=currentPage<=0?1:currentPage;
    this.size=pageSize<=0?1:pageSize;
    }
    public long getSize() {
    return size;
    }
    public void setSize(long pageSize) {
    this.size = pageSize;
    }
    public long getCurrent() {
    return this.current;
    }

    public Page<T> setCurrent(long current) {
    this.current = current;
    return this;
    }
    public long getTotal() {
    return this.total;
    }

    public Page<T> setTotal(long total) {
    this.total = total;
    return this;
    }
    public void setPages(long pages){
    this.pages = pages;
    }
    public long getPages(){
    return this.pages;
    }

    /**

    • 设置结果 及总页数
    • @param rows
      */
      public void build(List<T> rows) {
      this.setRows(rows);
      long count = this.getTotal();
      long divisor = count / this.getSize();
      long remainder = count % this.getSize();
      this.setPages(remainder == 0 ? divisor == 0 ? 1 : divisor : divisor + 1);
      }
      public List<T> getRows() {
      return rows;
      }
      public void setRows(List<T> rows) {
      this.rows = rows;
      }
      }
View Code

7.CRUDbase 接口

import com.bysk.base.mongdb.pojo.Page;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.List;

/**

  • @program: bysk

  • @Description: 作用描述

  • @Author: johnny

  • @CreateDate: 2021/1/8 16:20

  • @UpdateUser: 更新者

  • @UpdateDate: 2021/1/8 16:20

  • @UpdateRemark: 更新说明

  • @Version: 1.0
    */
    public interface IBaseMongoService<T> {
    /**

    • 保存一个对象到 mongodb
    • @param entity
    • @return
      */
      public T save(T entity) ;

    /**

    • 根据 id 删除对象
      */
      public void deleteById(String id);

    /**

    • 根据对象的属性删除
    • @param t
      */
      public void deleteByCondition(T t);

    /**

    • 根据 id 进行更新
    • @param id
    • @param t
      */
      public void updateById(String id, T t);

    /**

    • 根据对象的属性查询
    • @param t
    • @return
      */
      public List<T> findByCondition(T t);

    /**

    • 通过条件查询实体 (集合)
    • @param query
      */
      public List<T> find(Query query) ;

    /**

    • 通过一定的条件查询一个实体
    • @param query
    • @return
      */
      public T findOne(Query query) ;
      /**
    • 通过一定的条件查询一个实体
    • @param t
    • @return
      */
      public T findOne(T t) ;

    /**

    • 通过条件查询更新数据
    • @param query
    • @param update
    • @return
      */
      public void update(Query query, Update update) ;

    /**

    • 通过 ID 获取记录
    • @param id
    • @return
      */
      public T findById(String id) ;

    /**

    • 通过 ID 获取记录, 并且指定了集合名 (表的意思)
    • @param id
    • @param collectionName
    •        集合名
      
    • @return
      */
      public T findById(String id, String collectionName) ;

    /**

    • 通过条件查询, 查询分页结果
    • @param page
    • @param query
    • @return
      */
      public Page<T> findPage(Page<T> page, Query query);

    public Page<T> findPageByCondition(Page<T> page,T t);

    /**

    • 求数据总和
    • @param query
    • @return
      */
      public long count(Query query);

    /**

    • 获取 MongoDB 模板操作
    • @return
      */
      public MongoTemplate getMongoTemplate();
      }
View Code

8.CRUDbase 接口实现(这里 mongdb 住建名称默认 ID,如果要灵活控制,可根据反射获取 @ID 注解设置)

import cn.craccd.mongoHelper.utils.FormatUtils;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.bysk.base.mongdb.servicebase.IBaseMongoService;
import com.bysk.base.mongdb.pojo.Page;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.QueryMapper;
import org.springframework.data.mongodb.core.convert.UpdateMapper;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import javax.annotation.PostConstruct;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**

  • @program: bysk

  • @Description: 作用描述

  • @Author: johnny

  • @CreateDate: 2021/1/8 16:21

  • @UpdateUser: 更新者

  • @UpdateDate: 2021/1/8 16:21

  • @UpdateRemark: 更新说明

  • @Version: 1.0
    */
    @Slf4j
    public abstract class BaseMongoServiceImpl<T> implements IBaseMongoService<T> {
    @Autowired
    protected MongoTemplate mongoTemplate;
    @Autowired
    MongoConverter mongoConverter;
    QueryMapper queryMapper;
    UpdateMapper updateMapper;

    @Value("${spring.profiles.active}")
    private String env;
    private Boolean print;
    @PostConstruct
    public void init() {
    queryMapper
    = new QueryMapper(mongoConverter);
    updateMapper
    = new UpdateMapper(mongoConverter);
    print
    = StrUtil.containsAny(env,"dev","test");
    print
    =false;
    }

    /**

    • 保存一个对象到 mongodb
    • @param bean
    • @return
      */
      @Override
      public T save(T bean) {
      logSave(bean);
      mongoTemplate.save(bean);
      return bean;
      }

    /**

    • 根据 id 删除对象
      */
      @Override
      public void deleteById(String id) {
      Query query
      = new Query();
      query.addCriteria(Criteria.where(
      "id").is(id));
      logDelete(query);
      mongoTemplate.remove(
      this.findById(id));
      }

    /**

    • 根据对象的属性删除
    • @param t
      */
      @Override
      public void deleteByCondition(T t) {
      Query query
      = buildBaseQuery(t);
      logDelete(query);
      mongoTemplate.remove(query, getEntityClass());
      }

    /**

    • 根据 id 进行更新
    • @param id
    • @param t
      */
      @Override
      public void updateById(String id, T t) {
      Query query
      = new Query();
      query.addCriteria(Criteria.where(
      "id").is(id));
      Update update
      = buildBaseUpdate(t);
      logUpdate(query,update,
      false);
      update(query, update);
      }

    /**

    • 根据对象的属性查询
    • @param t
    • @return
      */
      @Override
      public List<T> findByCondition(T t) {
      Query query
      = buildBaseQuery(t);
      logQuery(query);
      return mongoTemplate.find(query, getEntityClass());
      }

    /**

    • 通过条件查询实体 (集合)
    • @param query
    • @return
      */
      @Override
      public List<T> find(Query query) {
      logQuery(query);
      return mongoTemplate.find(query, this.getEntityClass());
      }

    /**

    • 通过一定的条件查询一个实体
    • @param query
    • @return
      */
      @Override
      public T findOne(Query query) {
      logQuery(query);
      return mongoTemplate.findOne(query, this.getEntityClass());
      }
      @Override
      public T findOne(T t) {
      Query query
      = buildBaseQuery(t);
      return findOne(query);
      }
      /**
    • 通过条件查询更新数据
    • @param query
    • @param update
      */
      @Override
      public void update(Query query, Update update) {
      logUpdate(query,update,
      false);
      mongoTemplate.updateMulti(query, update,
      this.getEntityClass());
      }

    /**

    • 通过 ID 获取记录
    • @param id
    • @return
      */
      @Override
      public T findById(String id) {
      Class
      <T> entityClass = this.getEntityClass();
      logQuery(
      new Query(Criteria.where("id").is(id)));
      return mongoTemplate.findById(id, entityClass);
      }

    /**

    • 通过 ID 获取记录, 并且指定了集合名 (表的意思)
    • @param id
    • @param collectionName
    • @return
      */
      @Override
      public T findById(String id, String collectionName) {
      return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
      }

    /**

    • 通过条件查询, 查询分页结果
    • @param page
    • @param query
    • @return
      */
      @Override
      public Page<T> findPage(Page<T> page, Query query) {
      //如果没有条件 则所有全部
      query=query==null?new Query(Criteria.where("_id").exists(true)):query;
      long count = this.count(query);
      // 总数
      page.setTotal(count);
      long currentPage = page.getCurrent();
      long pageSize = page.getSize();
      query.skip((currentPage
      - 1) * pageSize).limit(Convert.toInt(pageSize));
      logQuery(query);
      List
      <T> rows = this.find(query);
      page.build(rows);
      return page;
      }

    @Override
    public Page<T> findPageByCondition(Page<T> page,T t){
    Query query
    = buildBaseQuery(t);
    return findPage(page,query);
    }
    /**

    • 求数据总和
    • @param query
    • @return
      */
      @Override
      public long count(Query query){
      return mongoTemplate.count(query, this.getEntityClass());
      }

    /**

    • 根据 vo 构建查询条件 Query

    • @param t

    • @return
      */
      private Query buildBaseQuery(T t) {
      Query query
      = new Query();

      Field[] fields = t.getClass().getDeclaredFields();
      for (Field field : fields) {
      field.setAccessible(
      true);
      try {
      Object value
      = field.get(t);
      if (value != null) {
      query.addCriteria(Criteria.where(field.getName()).is(value));
      }
      }
      catch (IllegalArgumentException e) {
      e.printStackTrace();
      }
      catch (IllegalAccessException e) {
      e.printStackTrace();
      }
      }
      return query;
      }

    /**

    • 根据 vo 构建更新条件 Query

    • @param t

    • @return
      */
      private Update buildBaseUpdate(T t) {
      Update update
      = new Update();

      Field[] fields = t.getClass().getDeclaredFields();
      for (Field field : fields) {
      field.setAccessible(
      true);
      try {
      Object value
      = field.get(t);
      if (value != null) {
      update.set(field.getName(), value);
      }
      }
      catch (Exception e) {
      e.printStackTrace();
      }
      }
      return update;
      }

    /**

    • 获取需要操作的实体类 class
    • @return
      */
      @SuppressWarnings(
      "unchecked")
      protected Class<T> getEntityClass() {
      return getSuperClassGenricType(getClass(),0);
      }

    /**

    • 获取 MongoDB 模板操作
    • @return
      */
      @Override
      public MongoTemplate getMongoTemplate() {
      return mongoTemplate;
      }

    private Class getSuperClassGenricType(final Class clazz, final int index){
    Type genType
    = clazz.getGenericSuperclass();

     </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!(genType <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> ParameterizedType)) {
         log.warn(clazz.getSimpleName() </span>+ "'s superclass not ParameterizedType"<span style="color: rgba(0, 0, 0, 1)">);
         </span><span style="color: rgba(0, 0, 255, 1)">return</span> Object.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;
     }
    
     Type[] params </span>=<span style="color: rgba(0, 0, 0, 1)"> ((ParameterizedType) genType).getActualTypeArguments();
    
     </span><span style="color: rgba(0, 0, 255, 1)">if</span> (index &gt;= params.length || index &lt; 0<span style="color: rgba(0, 0, 0, 1)">) {
         log.warn(</span>"Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
                 +<span style="color: rgba(0, 0, 0, 1)"> params.length);
         </span><span style="color: rgba(0, 0, 255, 1)">return</span> Object.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;
     }
     </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!(params[index] <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> Class)) {
         log.warn(clazz.getSimpleName() </span>+ " not set the actual class on superclass generic parameter"<span style="color: rgba(0, 0, 0, 1)">);
         </span><span style="color: rgba(0, 0, 255, 1)">return</span> Object.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;
     }
    
     </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (Class) params[index];
    

    }

    /**

    • 打印查询语句

    • @param query
      */
      private void logQuery(Query query) {
      if (print) {
      Class
      <?> clazz = this.getEntityClass();
      MongoPersistentEntity
      <?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
      Document mappedQuery
      = queryMapper.getMappedObject(query.getQueryObject(), entity);
      Document mappedField
      = queryMapper.getMappedObject(query.getFieldsObject(), entity);
      Document mappedSort
      = queryMapper.getMappedObject(query.getSortObject(), entity);

       String logStr </span>= "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".find("<span style="color: rgba(0, 0, 0, 1)">;
      
       logStr </span>+= FormatUtils.bson(mappedQuery.toJson()) + ")"<span style="color: rgba(0, 0, 0, 1)">;
      
       </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">query.getFieldsObject().isEmpty()) {
           logStr </span>+= ".projection("<span style="color: rgba(0, 0, 0, 1)">;
           logStr </span>+= FormatUtils.bson(mappedField.toJson()) + ")"<span style="color: rgba(0, 0, 0, 1)">;
       }
      
       </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (query.isSorted()) {
           logStr </span>+= ".sort("<span style="color: rgba(0, 0, 0, 1)">;
           logStr </span>+= FormatUtils.bson(mappedSort.toJson()) + ")"<span style="color: rgba(0, 0, 0, 1)">;
       }
      
       </span><span style="color: rgba(0, 0, 255, 1)">if</span> (query.getLimit() != 0l<span style="color: rgba(0, 0, 0, 1)">) {
           logStr </span>+= ".limit(" + query.getLimit() + ")"<span style="color: rgba(0, 0, 0, 1)">;
       }
      
       </span><span style="color: rgba(0, 0, 255, 1)">if</span> (query.getSkip() != 0l<span style="color: rgba(0, 0, 0, 1)">) {
           logStr </span>+= ".skip(" + query.getSkip() + ")"<span style="color: rgba(0, 0, 0, 1)">;
       }
       logStr </span>+= ";"<span style="color: rgba(0, 0, 0, 1)">;
      
       log.info(logStr);
      

      }
      }

    /**

    • 打印查询语句

    • @param query
      */
      private void logCount(Query query) {
      if (print) {
      Class
      <?> clazz = this.getEntityClass();
      MongoPersistentEntity
      <?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
      Document mappedQuery
      = queryMapper.getMappedObject(query.getQueryObject(), entity);

       String logStr </span>= "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".find("<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= FormatUtils.bson(mappedQuery.toJson()) + ")"<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= ".count();"<span style="color: rgba(0, 0, 0, 1)">;
      
       log.info(logStr);
      

      }
      }

    /**

    • 打印查询语句

    • @param query
      */
      private void logDelete(Query query) {
      if (print) {
      Class
      <?> clazz = this.getEntityClass();
      MongoPersistentEntity
      <?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
      Document mappedQuery
      = queryMapper.getMappedObject(query.getQueryObject(), entity);

       String logStr </span>= "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".remove("<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= FormatUtils.bson(mappedQuery.toJson()) + ")"<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= ";"<span style="color: rgba(0, 0, 0, 1)">;
       log.info(logStr);
      

      }
      }

    /**

    • 打印查询语句

    • @param query
      */
      private void logUpdate( Query query, Update update, boolean multi) {
      if (print) {
      Class
      <?> clazz = this.getEntityClass();
      MongoPersistentEntity
      <?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
      Document mappedQuery
      = queryMapper.getMappedObject(query.getQueryObject(), entity);
      Document mappedUpdate
      = updateMapper.getMappedObject(update.getUpdateObject(), entity);

       String logStr </span>= "\ndb." + StrUtil.lowerFirst(clazz.getSimpleName()) + ".update("<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= FormatUtils.bson(mappedQuery.toJson()) + ","<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= FormatUtils.bson(mappedUpdate.toJson()) + ","<span style="color: rgba(0, 0, 0, 1)">;
       logStr </span>+= FormatUtils.bson("{multi:" + multi + "})"<span style="color: rgba(0, 0, 0, 1)">);
       logStr </span>+= ";"<span style="color: rgba(0, 0, 0, 1)">;
       log.info(logStr);
      

      }

    }

    /**

    • 打印查询语句
    • @param object

    */
    private void logSave(Object object) {
    if (print) {
    String logStr
    = "\ndb." + StrUtil.lowerFirst(object.getClass().getSimpleName()) + ".save(";
    logStr
    += JSONUtil.toJsonPrettyStr(object);
    logStr
    += ");";
    log.info(logStr);
    }
    }

    /**

    • 打印查询语句

    */
    private void logSave(List<?> list) {
    if (print && list.size() > 0) {
    Object object
    = list.get(0);

         String logStr </span>= "\ndb." + StrUtil.lowerFirst(object.getClass().getSimpleName()) + ".save("<span style="color: rgba(0, 0, 0, 1)">;
         logStr </span>+=<span style="color: rgba(0, 0, 0, 1)"> JSONUtil.toJsonPrettyStr(list);
         logStr </span>+= ");"<span style="color: rgba(0, 0, 0, 1)">;
         log.info(logStr);
     }
    

    }

}

View Code

10. 仿 mybatisplus 方式实现单表 CRUD 接口以及接口实现类 (注入接口后可使用基础方法,也可以使用自定义方法)

import com.bysk.base.mongdb.pojo.MgdbDeviceMonitorRecord;
import com.bysk.base.mongdb.servicebase.IBaseMongoService;

public interface MgdbDeviceMonitorRecordService extends IBaseMongoService<MgdbDeviceMonitorRecord> {

}

import com.bysk.base.mongdb.pojo.MgdbDeviceMonitorRecord;
import com.bysk.base.mongdb.service.MgdbDeviceMonitorRecordService;
import com.bysk.base.mongdb.servicebase.impl.BaseMongoServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class MgdbDeviceMonitorRecordServiceImpl extends BaseMongoServiceImpl<MgdbDeviceMonitorRecord> implements MgdbDeviceMonitorRecordService {

}

11. 使用

    @Autowired
    MgdbDeviceMonitorRecordService mgdbDeviceMonitorRecordService;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>  <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> saveOrUpdateForMgDb(String equipmentId, DeviceMonitorRecordDTO bean) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1.取得数据存储时间</span>
    LocalDateTime monitorTime =<span style="color: rgba(0, 0, 0, 1)"> bean.getMonitorTime();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2.计算时间偏移量</span>
    LocalDateTime frontTime =<span style="color: rgba(0, 0, 0, 1)"> monitorTime.minusSeconds(dataRangeTime);
    LocalDateTime backTime </span>=<span style="color: rgba(0, 0, 0, 1)"> monitorTime.plusSeconds(dataRangeTime);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3.构建查询条件</span>
    Query query = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query();
    query.addCriteria(Criteria.where(</span>"equipmentId").is(equipmentId).and("monitorTime"<span style="color: rgba(0, 0, 0, 1)">)
                            .gte(LocalDateTimeUtil.format(frontTime, DatePattern.NORM_DATETIME_PATTERN))
                            .lte(LocalDateTimeUtil.format(backTime, DatePattern.NORM_DATETIME_PATTERN)));
    MgdbDeviceMonitorRecord oneByQuery1 </span>=<span style="color: rgba(0, 0, 0, 1)"> mgdbDeviceMonitorRecordService.findOne(query);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 5.存储逻辑</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (oneByQuery1 == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不存在 保存_</span>
        String beanStr =<span style="color: rgba(0, 0, 0, 1)"> JSONUtil.toJsonStr(bean);
        MgdbDeviceMonitorRecord mgdbDeviceMonitorRecord </span>= JSONUtil.toBean(beanStr, MgdbDeviceMonitorRecord.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
        mgdbDeviceMonitorRecord.setMonitorTime(LocalDateTimeUtil.format(bean.getMonitorTime(), DatePattern.NORM_DATETIME_PATTERN));
        mgdbDeviceMonitorRecord.setId(</span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
        mgdbDeviceMonitorRecordService.save(mgdbDeviceMonitorRecord);
        log.info(monitorTime</span>+"==数据存储芒果DB成功=="<span style="color: rgba(0, 0, 0, 1)">);
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
        String beanStr </span>=<span style="color: rgba(0, 0, 0, 1)"> JSONUtil.toJsonStr(bean);
        MgdbDeviceMonitorRecord mgdbDeviceMonitorRecord </span>= JSONUtil.toBean(beanStr, MgdbDeviceMonitorRecord.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
        mgdbDeviceMonitorRecord.setMonitorTime(LocalDateTimeUtil.format(bean.getMonitorTime(), DatePattern.NORM_DATETIME_PATTERN));
        mgdbDeviceMonitorRecord.setId(oneByQuery1.getId());
        mgdbDeviceMonitorRecordService.updateById(oneByQuery1.getId(),mgdbDeviceMonitorRecord);
        log.info(monitorTime</span>+"==数据更新芒果DB成功=="<span style="color: rgba(0, 0, 0, 1)">);
    }
}</span></pre>