springboot集成MongoDB
springboot集成spring-data数据库的三步骤:
- pom引入jar包
- yml添加连接配置
- 书写代码,注入XXXTemplate调用数据库的api 或者 使用JPA集成操作
第一步:pom引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
第二步:yml添加配置
spring:
data:
mongodb:
database: mymongo
port: 27017
host: 127.0.0.1
第三步:书写代码
定义文档实体
@Data
@Document("col00")
public class Document01 {
private String _id;
private String name;
private Integer age;
private String status;
private List<String> permissions;
}
// 视图类 可以没有
@Data
public class Document01Vo implements Serializable {
private String _id;
private String name;
private Integer age;
private String status;
private List<String> permissions;
}
注意:在文档类定义时如果没有使用@Document(“col00”)指定集合,默认会寻找文档类类名首字母小写的集合,即使集合不存在也不会报异常。
# 开发时在yml添加日志配置
logging:
level:
org .springframework.data.mongodb.core: debug
# 做一次mongodb查询 会看到以下日志
find using query: {} fields: Document{{}} for class: class com.example.demo.mongo.bean.Document01 in collection: document01
mongoTemplate
提供的api复杂而灵活,完全掌握需要仔细研究,使用mongoTemplate
的crud基本操作示例如下:
public interface MongoService {
/**
* 插入文档
*
* @param document01Vo 文档
* @return Object
*/
Object insertOne(Document01Vo document01Vo);
/**
* 批量插入文档
*
* @param document01Vos 文档
* @return Object
*/
Object insertMany(List<Document01Vo> document01Vos);
/**
* 更新一个文档
*
* @param id 文档id
* @param document01Vo 文档
* @return Object
*/
Object updateOne(String id, Document01Vo document01Vo);
/**
* 删除一个文档
*
* @param id 文档id
* @return Object
*/
Object deleteOne(String id);
/**
* 根据id一个文档
*
* @param id 文档id
* @return Object
*/
Object findOne(String id);
/**
* 分页查询
*
* @param document01Vo 查询参数
* @param index 页数
* @param size 每页的数目
* @return Object
*/
Object findByPage(Document01Vo document01Vo, int index, int size);
}
@Service
public class MongoServiceImpl implements MongoService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public Object insertOne(Document01Vo document01Vo) {
Document01 document = JSON.parseObject(JSON.toJSONString(document01Vo), Document01.class);
// mongo插入数据可以选择insert或者save方法
return mongoTemplate.insert(document);
// return mongoTemplate.save(document);
}
@Override
public Object insertMany(List<Document01Vo> document01Vos) {
List<Document01> documents = JSON.parseArray(JSON.toJSONString(document01Vos), Document01.class);
// 批量插入不能用save() insert()
return mongoTemplate.insertAll(documents);
}
@Override
public Object updateOne(String id, Document01Vo document01Vo) {
Document01 document = JSON.parseObject(JSON.toJSONString(document01Vo), Document01.class);
document.set_id(id);
// // save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
// return mongoTemplate.save(document);
// // findAndReplace()方法通过传入的文档来替换已有文档, _id 主键存在就更新,不存在不操作
// Query query = new org.springframework.data.mongodb.core.query.Query();
// query.addCriteria(Criteria.where("_id").is(id));
// return mongoTemplate.findAndReplace(query, document);
// // updateFirst() 使用UpdateDefinition指定要更新的key,_id 主键存在就更新,不存在不操作
// Query query = new org.springframework.data.mongodb.core.query.Query();
// query.addCriteria(Criteria.where("_id").is(id));
// Update update = new Update();
// update.set("status", document01Vo.getStatus());
// return mongoTemplate.updateFirst(query, update, Document01.class);
// upsert() 使用UpdateDefinition指定要更新的key,_id 主键存在就更新,不存在就插入 插入的文档只保留UpdateDefinition指定的key
Query query = new org.springframework.data.mongodb.core.query.Query();
query.addCriteria(Criteria.where("_id").is(id));
Update update = new Update();
update.set("status", document01Vo.getStatus());
return mongoTemplate.upsert(query, update, Document01.class);
}
@Override
public Object deleteOne(String id) {
Query query = new org.springframework.data.mongodb.core.query.Query();
query.addCriteria(Criteria.where("_id").is(id));
return mongoTemplate.remove(query, Document01.class);
}
@Override
public Object findOne(String id) {
// return mongoTemplate.findById(id, Document01.class);
Query query = new org.springframework.data.mongodb.core.query.Query();
query.addCriteria(Criteria.where("_id").is(id));
return mongoTemplate.findOne(query, Document01.class);
}
@Override
public Object findByPage(Document01Vo document01Vo, int index, int size) {
// 查询条件拼接(条件拼接注意数据类型,比如:数据库的类型是number 如果is()传入了字符串类型不会编译报错,但会查询不到数据)
Criteria criteria = new Criteria();
if (null != document01Vo.getName() && !"".equals(document01Vo.getName())) {
criteria.and("name").is(document01Vo.getName());
}
if (null != document01Vo.getAge()) {
criteria.and("age").is(document01Vo.getAge());
}
Query query = new org.springframework.data.mongodb.core.query.Query(criteria);
// 查询总数
long amount = mongoTemplate.count(query, Document01.class);
// 查询获取第n页
query.with(Sort.by(Sort.Direction.DESC, "name")); // 排序
query.with(Pageable.ofSize(size <= 0 ? 10 : size).withPage(index <= 0 ? 0 : index - 1)); // 分页
List<Document01> document01s = mongoTemplate.find(query, Document01.class);
Map<String, Object> pageResult = new HashMap<>();
pageResult.put("index", index);
pageResult.put("size", size);
pageResult.put("amount", amount);
pageResult.put("records", document01s);
return pageResult;
}
}