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<String><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<MongoCompressor><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; }
}
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; }
}
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;
}
}
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();
}
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 >= params.length || index < 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); }
}
}
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>