文章目录
引言
应用程序中,通常会使用两种数据库,一种是关系型数据库如mysql等,另一种则是非关系型数据库例如mongodb,今天我们就来讲一讲如何在springboot中使用mongodb。
依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置文件
这里配置的单点
yaml
spring:
data:
mongodb:
username: calculate
password: 1234calculate
host: 120.79.128.190
port: 27017
database: data_db
代码编写
1、实体类
这里新建了一个新闻类的实体来做出说明
java
@Data
@Document(value = "test")
public class NewsMg {
@Id
private String id;
/**
* 标题
*/
@Field(value = "title")
private String title;
/**
* 分类
*/
@Field(value = "news_type")
private String type;
/**
* 描述
*/
@Field(value = "abstract")
private String describe;
/**
* 链接
*/
@Field(value = "link")
private String link;
/**
* 来源
*/
@Field(value = "source")
private String source;
/**
* 作者
*/
@Field(value = "author")
private String author;
/**
* 发表时间
*/
@Field(value = "date")
private Long resourceTime;
/**
* 重要性
*/
@Field(value = "importance")
private String importance;
}
- @Document注解
这是第一个核心注解,mongodb中我们不是以表来指明,而是以文档,而这个注解最核心的就是collection或者是value,例如 @Document(value = "news"),这里注解在实体类上,表示将此实体类标注为文档类型,并且文档名为news,当然也可以不用使用这个文档名,后续会讲解 - @Field(value = "vol")
这个和@TableField一样,指定是一个字段 - @Id
这个注解会指定mongodb的id,插入文档时会自动生成这个id - 无需注意字段的类型,这里通过springboot会自动把字段映射到我们的实体上
2、使用repository查询
我们只需要继承接口MongoRepository<T,ID>接口即可
java
/**
* 使用注解@Repository
* 继承后实体类和主键类型
*/
@Repository
public interface newsRepository extents MongoRepository<NewsMg,String>{
/**
* 通过id列表查找所有
*/
List<NewsMg> getAllByIdIn(List<String> ids);
/**
* 通过id查找
*/
NewsMg findById(String id);
}
这里可以使用很多,例如 findByXXInORYY(List XX, String YY),可以通过OR和AND连接条件,当然也可以使用注解 @Aggregation(pipeline={})直接写查询语句来实现复杂的查询
但是复杂查询也可以通过下面方式进行查询
3、使用MongoTemplate查询
相比上一个查询,这里的查询操作就稍微显得繁琐一点了
java
/**
* 注入bean
*/
@Resource
private MongoTemplate mongoTemplate;
public List<RealtimeOrder> queryAfter(Long time) {
// 表名,也可以不用指定
String tableName = "table_name";
// 构造查询条件,这里where是字段名,后续可以跟is/gt/lt等全等比较条件
// 如果还有字段,可以使用and(字段名)或者or(字段名)继续追加条件
Criteria criteria = Criteria.where("字段名").gte(time);
// 构造Query
Query query = Query.query(criteria);
// 这里query还可以追加排序等操作
// 例如 query.with(Sort.by(Sort.Order.desc("date")))
// limit, query.limit(查询条数)
// query.addCriteria() 再次追加查询条件
// 查询 使用mongoTemplate的方法
// 查询所有
mongoTemplate.find(Query.query(criteria), NewsMg.class, tableName);
// 不指定表名则直接查询实体类注解Document中的集合名,这里就是 test
mongoTemplate.find(Query.query(criteria), NewsMg.class);
// 还有 findOne、findAll、count等方法,能够满足我们最基本的查询
}