MongoDB + SpringBoot
2021-02-26 本文已影响0人
EmmaQin
1添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2配置文件
# mongodb
spring.data.mongodb.host=10.1.255.20
spring.data.mongodb.port=27019
spring.data.mongodb.database=followup
spring.data.mongodb.username=followup
spring.data.mongodb.password=followup
3编写实体
@Document(collection = "demo_auto")
@Data
@ToString
public class MongoDemoDO implements Serializable {
@Id
private String id;
private String name;
private String gender;
private Integer age;
}
spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的。它可以通过注释把java类转换为mongodb的文档。
它有以下几种注释:
@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
@Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。@Document(collection=“mongodb”) mongodb对应表
@DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能。在插入,删除操作时,并不检查对象之间的关联关系就直接操作了
@Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
@CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
@GeoSpatialIndexed - 声明该字段为地理信息的索引。
@Transient - 映射忽略的字段,该字段不会保存到mongodb。
@PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。
4 Service层(增删改查)
接口
public interface MongoDBService {
/**
* 新增或更新一条记录
*
* @param obj
*/
<T> T save(T objectToSave);
/**
* 查询一条记录
*
* @param clazz
* @param query
* @return
*/
<T> T findOne(Query query, Class<T> clazz);
/**
* 查询所有
*
* @param clazz
* @return
*/
<T> List<T> findAll(Class<T> clazz);
/**
* 根据ID查询一个对象
*
* @param clazz
* @param id
* @return
*/
<T> T findById(Object id, Class<T> clazz);
/**
* 根据条件查询集合对象
*
* @param clazz
* @param query
* @return
*/
<T> List<T> list(Query query, Class<T> clazz);
/**
* 分页查询
*/
<T> Page<T> page(int currentPage, int pageSize, Query query, Class<T> clazz);
/**
* 根据条件查询总条数
*
* @param clazz
* @param query
* @return
*/
<T> long count(Query query, Class<T> clazz);
/**
* 根据条件更新记录
*
* @param query 条件
* @param update 需要更新的字段
* @param clazz
* @return
*/
<T> long update(Query query, Update update, Class<T> clazz);
/**
* 根据id删除记录
*
* @param clazz
* @param query
* @return
*/
<T> long deleteById(Object id, Class<T> clazz);
}
实现
@Service
public class MongoDBServiceImpl implements MongoDBService {
@Resource
private MongoTemplate mongoTemplate;
@Override
public <T> T save(T objectToSave) {
return mongoTemplate.save(objectToSave);
}
@Override
public <T> T findOne(Query query, Class<T> clazz) {
return mongoTemplate.findOne(query, clazz);
}
@Override
public <T> List<T> findAll(Class<T> clazz) {
return mongoTemplate.findAll(clazz);
}
@Override
public <T> T findById(Object id, Class<T> clazz) {
return mongoTemplate.findById(id, clazz);
}
@Override
public <T> List<T> list(Query query, Class<T> clazz) {
return mongoTemplate.find(query, clazz);
}
@Override
public <T> Page<T> page(int currentPage, int pageSize, Query query, Class<T> clazz) {
query.limit(pageSize);
query.skip(pageSize * (currentPage - 1));
Page page = new Page();
page.setPageNumber(currentPage);
page.setPageSize(pageSize);
long total = mongoTemplate.count(query, clazz);
List<T> list = mongoTemplate.find(query, clazz);
page.setList(list);
page.setTotalNumber(total);
page.setTotalPage(total / pageSize);
return page;
}
@Override
public <T> long count(Query query, Class<T> clazz) {
return mongoTemplate.count(query, clazz);
}
@Override
public <T> long update(Query query, Update update, Class<T> clazz) {
return mongoTemplate.updateMulti(query, update, clazz).getModifiedCount();
}
@Override
public <T> long deleteById(Object id, Class<T> clazz) {
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
return mongoTemplate.remove(query, clazz).getDeletedCount();
}@Service
public class MongoDBServiceImpl implements MongoDBService {
@Resource
private MongoTemplate mongoTemplate;
@Override
public <T> T save(T objectToSave) {
return mongoTemplate.save(objectToSave);
}
@Override
public <T> T findOne(Query query, Class<T> clazz) {
return mongoTemplate.findOne(query, clazz);
}
@Override
public <T> List<T> findAll(Class<T> clazz) {
return mongoTemplate.findAll(clazz);
}
@Override
public <T> T findById(Object id, Class<T> clazz) {
return mongoTemplate.findById(id, clazz);
}
@Override
public <T> List<T> list(Query query, Class<T> clazz) {
return mongoTemplate.find(query, clazz);
}
@Override
public <T> Page<T> page(int currentPage, int pageSize, Query query, Class<T> clazz) {
query.limit(pageSize);
query.skip(pageSize * (currentPage - 1));
Page page = new Page();
page.setPageNumber(currentPage);
page.setPageSize(pageSize);
long total = mongoTemplate.count(query, clazz);
List<T> list = mongoTemplate.find(query, clazz);
page.setList(list);
page.setTotalNumber(total);
page.setTotalPage(total / pageSize);
return page;
}
@Override
public <T> long count(Query query, Class<T> clazz) {
return mongoTemplate.count(query, clazz);
}
@Override
public <T> long update(Query query, Update update, Class<T> clazz) {
return mongoTemplate.updateMulti(query, update, clazz).getModifiedCount();
}
@Override
public <T> long deleteById(Object id, Class<T> clazz) {
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
return mongoTemplate.remove(query, clazz).getDeletedCount();
}
单元测试
@SpringBootTest
@Slf4j
class DemoApplicationTests {
@Resource
MongoDBService mongoDBService;
@Test
void save() {
MongoDemoDO save = new MongoDemoDO();
save.setName("戚薇");
save.setGender("女");
save.setAge(20);
MongoDemoDO result = mongoDBService.save(save);
log.info("ressult:{}", result);
}
@Test
void findById() {
MongoDemoDO result = mongoDBService.findById("603750ab5f3ee121e806620a", MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void findOne() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("戚薇"));
MongoDemoDO result = mongoDBService.findOne(query, MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void findAll() {
List<MongoDemoDO> result = mongoDBService.findAll(MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void list() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("戚薇"));
List<MongoDemoDO> result = mongoDBService.list(query, MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void page() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("戚薇"));
Page<MongoDemoDO> result = mongoDBService.page(2, 1, query, MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void count() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("戚薇"));
long result = mongoDBService.count(query, MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void remove() {
long result = mongoDBService.deleteById("603771a05f3ee121e806620b", MongoDemoDO.class);
log.info("ressult:{}", result);
}
@Test
void update() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("戚薇"));
Update update = new Update();
update.set("age","12");
long result = mongoDBService.update(query,update, MongoDemoDO.class);
log.info("ressult:{}", result);
}
}