一、介绍
MongoRepository是一个接口,与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个MongoDB集合中的文档数据进行增删改查,示例如下所示:
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface xxxRepository extends MongoRepository<T, ID> {
}
在我们继承MongoRepository接口时,该接口中第一个参数T为该仓库在Mongo中要操作的bean类,第二个参数ID表示该bean类的唯一标识的类型,一般为ObjectId。
使用MongoRepository接口时,为了更好的开发,建议引入下述依赖包,如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.7.6</version>
</dependency>
二、简单使用
前面做了一个简单的介绍以及引入了依赖包,接着我们需要在application.yml文件中配置如下:
spring:
data:
mongodb:
uri: mongodb://localhost:27017/test
在MongoDB的test库中创建集合grade,如下图所示:
接着再构建一个文档对象类Grade和属性类Student:
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.List;
@Data
@Document(value = "grade")
public class Grade {
@Id
private Integer id;
@Field(value = "grade_name")
private String gradeName;
@Field(value = "students")
private List<Student> students;
}
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Field;
@Data
public class Student {
@Field(value = "student_id")
private int studentId;
@Field(value = "student_name")
private String name;
}
导入下述数据到test库的集合grade中:
[{
"_id": 1,
"grade_name": "爱情公寓一年级1班",
"students": [
{
"student_id": 1001,
"student_name": "曾小贤"
},
{
"student_id": 1002,
"student_name": "张伟"
},
{
"student_id": 1003,
"student_name": "诸葛大力"
}
],
"_class": "com.example.demo.mongo.Grade"
},
{
"_id": 2,
"grade_name": "爱情公寓一年级2班",
"students": [
{
"student_id": 2001,
"student_name": "吕子乔"
},
{
"student_id": 2002,
"student_name": "咖喱酱"
},
{
"student_id": 2003,
"student_name": "胡一菲"
}
],
"_class": "com.example.demo.mongo.Grade"
}]
特别说明:上述数据中的_class属性这个不用理会,因为集合中的文档对象是和类对象Grade做了映射,所以这个地方最好配置一下这个类对象的全路径。
创建GradeRepository接口,其继承了MongoRepository这个接口,第一个参数为文档对象类Grade,第二个参数为ObjectId:
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface GradeRepository extends MongoRepository<Grade, ObjectId> {
}
构建测试类:
package com.example.demo;
import com.example.demo.mongo.Grade;
import com.example.demo.mongo.GradeRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class GradeApplicationTests {
@Autowired
private GradeRepository gradeRepository;
/**
* 查询出所有数据
*/
@Test
void queryAll() {
List<Grade> gradeList = gradeRepository.findAll();
System.out.println(gradeList);
}
}
执行上述测试代码,其输出内容如下:
[Grade(id=1, gradeName=爱情公寓一年级1班,
students=[Student(studentId=1001, name=曾小贤),
Student(studentId=1002, name=张伟),
Student(studentId=1003, name=诸葛大力)]),
Grade(id=2, gradeName=爱情公寓一年级2班,
students=[Student(studentId=2001, name=吕子乔),
Student(studentId=2002, name=咖喱酱),
Student(studentId=2003, name=胡一菲)])]
可以看到前面我们只是继承了MongoRepository这个接口,然后什么也没有做,直接在测试类中使用GradeRepository的一些方法,接着数据就查询出来了。那么这个是由于MongoRepository接口中已经实现了一些基本的增删改查功能,我们直接调用相关的方法就可以。
三、自定义查询方法
MongoRepository接口中实现的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值。
3.1 等值查询
这是最简单的自定义查询方法,在MongoDB中的原生查询语句如下:
db.grade.find({"_id":1});
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface GradeRepository extends MongoRepository<Grade, ObjectId> {
Grade findById(int id) ;
}
import com.example.demo.mongo.Grade;
import com.example.demo.mongo.GradeRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class GradeApplicationTests {
@Autowired
private GradeRepository gradeRepository;
@Test
void query(){
Grade grade = gradeRepository.findById(1);
System.out.println(grade);
}
}
3.2 分页查询
自定义查询方法中是支持分页查询,通过传进一个Pageable对象,返回Page集合。
为了测试该自定义的分页查询方法,因此在Grade集合中新增一条数据,如下图所示: