- 需要引入的 pom 文件
<!-- mongoDb 的包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- mongoTemplate 封装类
/**
1. @description: 抽象操作的 mongoBaseDao
2. @author: wang kexin
3. @date: 2020-04-27
*/
public abstract class AbstractMongoBaseDao<T> {
@Resource
private MongoTemplate mongoTemplate;
/**
* 构建子方法,由子类实现返回反射对象的类型
*
* @return
*/
protected abstract Class<T> getEntityClass();
/**
* 为属性注入bean服务
*
* @param mongoTemplate
*/
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
/**
* 保存对象信息
*
* @param t
*/
public void save(T t) {
mongoTemplate.save(t);
}
/**
* 保存对象信息到指定的collection
*
* @param t
* @param collectionName
*/
public void save(T t, String collectionName) {
mongoTemplate.save(t, collectionName);
}
/**
* 保存对象集合信息
*
* @param t
* @param collectionName
*/
public void save(List<T> t, String collectionName) {
mongoTemplate.insert(t, collectionName);
}
/**
* 保存对象集合信息
*
* @param t
*/
public void save(List<T> t) {
mongoTemplate.insertAll(t);
}
/**
* 修改满足条件的第一条记录
*
* @param query
* @param update
*/
public void updateFirst(Query query, Update update, String collectionName) {
mongoTemplate.updateFirst(query, update, getEntityClass(), collectionName);
}
/**
* 修改满足条件的所有记录
*
* @param query
* @param update
*/
public void updateMulti(Query query, Update update, String collectionName) {
mongoTemplate.updateMulti(query, update, getEntityClass(), collectionName);
}
/**
* 删除对象信息
*
* @param t
*/
public void delete(T t) {
mongoTemplate.remove(t);
}
/**
* 删除collection中对象信息
*
* @param t
*/
public void delete(T t, String collectionName) {
mongoTemplate.remove(t, collectionName);
}
/**
* 根据字段删除对象信息
*
* @param idName
* @param idValue
*/
public void deleteById(String idName, Object idValue) {
mongoTemplate.remove(new Query(Criteria.where(idName).is(idValue)), getEntityClass());
}
/**
* 根据字段删除collection中对象信息
*
* @param idName
* @param idValue
*/
public void deleteById(String idName, Object idValue, String collectionName) {
mongoTemplate.remove(new Query(Criteria.where(idName).is(idValue)), getEntityClass(), collectionName);
}
/**
* 根据字段获取对象信息
*
* @param idName key
* @param idValue v
* @return
*/
public T findOne(String idName, Object idValue) {
return (T) mongoTemplate.findOne(new Query(Criteria.where(idName).is(idValue)), getEntityClass());
}
/**
* 根据字段获取collection中对象信息
*
* @param idName key
* @param idValue v
* @return T
*/
public T findOne(String idName, Object idValue, String collectionName) {
return (T) mongoTemplate.findOne(new Query(Criteria.where(idName).is(idValue)), getEntityClass(), collectionName);
}
/**
* 获取对象所有信息
*
* @return
*/
public List<T> findAll() {
return (List<T>) mongoTemplate.findAll(getEntityClass());
}
/**
* 获取指定的collection中所有对象的信息
*
* @param collectionName
* @return
*/
public List<T> findAll(String collectionName) {
return (List<T>) mongoTemplate.findAll(getEntityClass(), collectionName);
}
/**
* 查询某一个对象信息
*
* @param query
* @return
*/
public T queryOne(Query query) {
return mongoTemplate.findOne(query, getEntityClass());
}
/**
* 查询collection中某一个对象信息
*
* @param query
* @param collectionName
* @return
*/
public T queryOne(Query query, String collectionName) {
return mongoTemplate.findOne(query, getEntityClass(), collectionName);
}
/**
* 根据条件分页查询
*
* @param query
* @param start
* @param size
* @return
*/
public List<T> getPage(Query query, int start, int size) {
query.skip(start);
query.limit(size);
return mongoTemplate.find(query, getEntityClass());
}
/**
* 根据条件查询总量
*
* @param query
* @return
*/
public Long getCount(Query query) {
return mongoTemplate.count(query, getEntityClass());
}
/**
* 根据条件分页查询collection中对象信息
*
* @param query
* @param start
* @param size
* @return
*/
public List<T> getPage(Query query, int start, int size, String collectionName) {
query.skip(start);
query.limit(size);
return mongoTemplate.find(query, getEntityClass(), collectionName);
}
/**
* 根据条件查询collection中对象的总量
*
* @param query
* @return
*/
public Long getCount(Query query, String collectionName) {
return mongoTemplate.count(query, getEntityClass(), collectionName);
}
/**
* 获取对象信息
*
* @param query
* @return List<T>
*/
public List<T> findList(Query query) {
return (List<T>) mongoTemplate.find(query, getEntityClass());
}
/**
* 获取指定的collection中对象的信息
*
* @param query Query
* @param collectionName collectionName
* @return
*/
public List<T> findList(Query query, String collectionName) {
return (List<T>) mongoTemplate.find(query, getEntityClass(), collectionName);
}
/**
* 根据主键查找
*
* @param id id
*/
public T findById(Object id) {
return mongoTemplate.findById(id, getEntityClass());
}
}
- 主键自增(项目中增加以下类)
/**
* @description: 主键自增注解
* @author: wang kexin
* @date: 2020-04-27
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface MongodbAutoIncKey {
String collectionName() default "";
}
@Data
@Document(collection = "sequence")
class SeqInfo {
@Id
private String id;
private String collectionName;
private long seqId;
}
@Component
public class SaveEventListener extends AbstractMongoEventListener<Object> {
@Resource
private MongoTemplate mongoTemplate;
@Override
public void onBeforeConvert(BeforeConvertEvent<Object> event) {
final Object source = event.getSource();
if (source != null) {
ReflectionUtils.doWithFields(source.getClass(), field -> {
ReflectionUtils.makeAccessible(field);
// 如果字段添加了我们自定义的AutoIncKey注解
if (field.isAnnotationPresent(MongodbAutoIncKey.class)) {
MongodbAutoIncKey mongodbAutoIncKey = field.getAnnotation(MongodbAutoIncKey.class);
if (!StringUtils.isEmpty(mongodbAutoIncKey.collectionName())) {
// 设置自增ID
field.set(source, getNextId(mongodbAutoIncKey.collectionName()));
} else {
// 设置自增ID
field.set(source, getNextId(source.getClass().getSimpleName()));
}
}
});
}
}
/**
* 获取下一个自增ID
*
* @param collName 集合(这里用类名,就唯一性来说最好还是存放长类名)名称
* @return 序列值
*/
private Long getNextId(String collName) {
Query query = new Query(Criteria.where("collectionName").is(collName));
Update update = new Update();
update.inc("seqId", 1);
FindAndModifyOptions options = new FindAndModifyOptions();
options.upsert(true);
options.returnNew(true);
SeqInfo seq = mongoTemplate.findAndModify(query, update, options, SeqInfo.class);
assert seq != null;
return seq.getSeqId();
}
}
- 新建一个集合,存放 mongodb 库表的名字
/**
* @description: MongodbCollections 存放 mongo 的表的名字
* @author: wang kexin
* @date: 2020-04-27
*/
public class MongodbCollections {
/********************** 物流信息同步记录 ************/
public static final String OPERATION_RECORD = "lm_operation_node_record";å
}
- mongo 数据库表的使用
- MongodbCollections 就是存放数据表名字的引用
- 使用主键自增的注解 :
@Id
@MongodbAutoIncKey(collectionName = MongodbCollections.MESSAGE_RECORD)
@Data
@Document(collection = MongodbCollections.MAINTENANCE_RECORD)
public class MaintenanceResultRecordMongo {
/**
* 主键 id
*/
@Id
@MongodbAutoIncKey(collectionName = MongodbCollections.MESSAGE_RECORD)
private long id;
/**
* 维保下单返回的 code
*/
private String thirdMaintenanceOrderCode;
/**
* 维保查询返回的 url
*/
private String maintenanceResultUrl;
/**
* 维保查询返回的数据
*/
private String maintenanceResultData;
/**
* 创建时间
*/
private String createTime;
/**
* 修改时间
*/
private String modifiedTime;
}
- 标准的实现类的使用
- 实现 AbstractMongoBaseDao<数据表名称>
- 重写 getEntityClass
@Service
public class MaintenanceMongoServiceImpl extends AbstractMongoBaseDao<MaintenanceResultRecordMongo> implements MaintenanceMongoService {
/**
* 构建子方法,由子类实现返回反射对象的类型
*
* @return
*/
@Override
protected Class<MaintenanceResultRecordMongo> getEntityClass() {
return MaintenanceResultRecordMongo.class;
}
实现以上代码就可以很便捷的使用 mongo 了,实现数据库的各种操作了