- 需要引入的 pom 文件
<!-- mongoDb 的包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
- mongoTemplate 封装类
/**1. @description: 抽象操作的 mongoBaseDao2. @author: wang kexin3. @date: 2020-04-27 */
public abstract class AbstractMongoBaseDao<T> {@Resourceprivate 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 {@Idprivate String id;private String collectionName;private long seqId;}@Component
public class SaveEventListener extends AbstractMongoEventListener<Object> {@Resourceprivate MongoTemplate mongoTemplate;@Overridepublic 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())) {// 设置自增IDfield.set(source, getNextId(mongodbAutoIncKey.collectionName()));} else {// 设置自增IDfield.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*/@Overrideprotected Class<MaintenanceResultRecordMongo> getEntityClass() {return MaintenanceResultRecordMongo.class;}
实现以上代码就可以很便捷的使用 mongo 了,实现数据库的各种操作了