Проект Spring Data позволяет упростить взаимодействие Spring-приложений с источниками данных, в частности с популярной NoSQL базой MongoDB.
В современном мире очень важно создать и запустить приложение как можно скорее. Также приложение должно быть простым в разработке и легко поддерживаться.
Spring – как раз такой фреймворк, который обеспечивает простоту интеграции со множеством других различных фреймворков, что упрощает разработку приложения с использованием Spring. Одной из таких интеграций является интеграция Spring с MongoDB.
☕ Подтянуть свои знания по Java вы можете на нашем телеграм-канале «Библиотека Java для собеса»
Проверить свои знания разработки на Spring Framework
В этом уроке мы обсудим комбинацию самого известного java-фреймворка «Spring» и самой известной NoSQL системы управления базами данных (СУБД) «MongoDB». MongoDB – это документоориентированная NoSQL СУБД, которая хранит данные в JSON-подобном формате.
Интеграция Spring Data и MongoDB предоставляется Spring для облегчения взаимодействия обоих и удобства разработчиков, избавляя от необходимости написания множества запросов для вставки, обновления и удаления.
Ниже приведены некоторые из возможностей, предоставляемых проектом Spring Data MongoDB:
- Spring Data позволяет использовать как класс @Configuration, так и XML-конфигурацию.
- Иерархия исключений Data Access Spring используется для трансляции исключения.
- Интегрированное сопоставление между Java POJO и документом MongoDB.
- Класс MongoTemplate, который упрощает использование распространенных операций MongoDB.
- В дополнение к MongoTemplate, можно использовать классы MongoReader и MongoWriter для низкоуровневого отображения.
Лучший способ понять любую технологию – это использовать ее на практике, и это именно то, что мы собираемся сейчас сделать.
Давайте создадим простую программу, чтобы подробно ознакомиться со Spring Data MongoDB.
🧩☕ Интересные задачи по Java для практики можно найти на нашем телеграм-канале «Библиотека задач по Java»
Технологии и инструменты
Посмотрим на технологии и инструменты, которые мы будем использовать для создания программы.
- Eclispe Oxygen.2 Release (4.7.2);
- Java – версия 9.0.4;
- Gradle – 4.6;
- MongoDB server – 3.6;
- MongoCompass – 3.6;
- SpringDataMongoDB – 2.0.5-RELEASE.
Структура проекта
Структура нашего проекта будет выглядеть так, как показано ниже.

Gradle-проект будет иметь структуру, показанную выше. В случае pom.xml структура проекта будет немного отличаться.
Программа
В рамках этой программы мы постараемся выполнить нижеуказанные задачи.
- Сохранение объекта в MongoDB.
- Обновление объекта в MongoDB.
- Удаление объекта из MongoDB.
- Получение всех объектов из MongoDB.
Давайте теперь разберем все компоненты программы. Прежде всего, мы начнем с зависимостей и jar-файлов, необходимых для программы.
Gradle
Мы используем Gradle для сборки как часть программы. Файл build.gradle будет выглядеть так, как показано ниже.
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.springframework.data', name: 'spring-data-mongodb', version: '2.0.5.RELEASE'
implementation 'com.google.guava:guava:23.0'
testImplementation 'junit:junit:4.12'
}
В вышеприведенном файле build.gradle
в строке apply plugin: 'java'
сообщается, какой плагин необходимо установить. В нашем случае это Java-плагин.
Тег repositories {}
сообщает о репозитории, из которого должны быть подтянуты зависимости. Мы выбрали mavenCentral
, чтобы подтянуть зависимые jar-файлы. Мы также можем использовать jcenter для подтягивания соответствующих зависимых jar-файлов.
Тег dependencies {}
используются для предоставления необходимых данных о jar-файлах, которые нужно подтянуть для проекта.
Конфигурация для Spring Data MongoDB
Чтобы использовать конфигурацию MongoDB, нам нужно реализовать класс AbstractMongoConfiguration
. Класс MongoConfig.java
будет выглядеть так, как показано ниже. Здесь мы используем аннотации вместо xml. Но XML можно также использовать для настройки конфигурации.
Реализация класса MongoConfig.java:
package com.tutorial.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import com.mongodb.MongoClient;
@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
@Override
public String getDatabaseName() {
return "local";
}
@Override
@Bean
public MongoClient mongoClient() {
return new MongoClient("127.0.0.1");
}
}
@Configuration
используется для определения класса MongoConfig.java
в качестве класса конфигурации. @Bean
определяет бин MongoClient
.
Класс модели
Теперь рассмотрим класс модели. Мы используем student.java
в качестве класса модели, который содержит атрибуты для Student
, такие как Name
и Age
. Класс модели Student.java
используется для отображения POJO в коллекцию MongoDB
Класс модели Student:
package com.tutorial.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "students")
public class Student {
public Student(String studentName, int studentAge) {
this.studentName = studentName;
this.studentAge = studentAge;
}
@Id
private String id;
String studentName;
int studentAge;
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getStudentAge() {
return studentAge;
}
public void setStudentAge(int studentAge) {
this.studentAge = studentAge;
}
@Override
public String toString() {
return String.format(
"Student[id=%s, studentName='%s',
studentAge="+studentAge+"]",
id, studentName);
}
}
@Document
определяет документ. Свойство collection
определяет коллекцию, которая будет использоваться для сопоставления с коллекцией. Все атрибуты, которые упоминаются как часть коллекции, должны быть доступны в классе POJO. @Id
определяет идентификатор коллекции.
CRUD-операции
Чтобы выполнять операции CRUD (сокр. от create, read, update, delete), такие как сохранение, обновление, удаление и получение данных из MongoDB, мы будем использовать MongoOperations
.
Теперь давайте посмотрим на класс MongoDBPOperations.java
. Этот класс содержит реализацию всех методов CRUD-операций.
Класс MongoDBPOperations
, который будет использоваться для выполнения CRUD-операций:
package com.tutorial;
import java.util.List;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import com.tutorial.model.Student;
public class MongoDBPOperations {
public void saveStudent(MongoOperations mongoOperation, Student student) {
mongoOperation.save(student);
System.out.println("Student saved successfully");
// student object got created with id.
System.out.println("student : " + student);
}
public void searchStudent(MongoOperations mongoOperation, String critera,String value) {
// query to search student
Query searchStudent = new Query(Criteria.where(critera).is(value));
// find student based on the query
Student resultStudent = mongoOperation.findOne(searchStudent, Student.class);
System.out.println("Student found!!");
System.out.println("Student details: " + resultStudent);
}
public void updateStudent(MongoOperations mongoOperation, String critera,String value, String updateCriteria, String updateValue) {
// query to search student
Query searchStudent = new Query(Criteria.where(critera).is(value));
mongoOperation.updateFirst(searchStudent, Update.update(updateCriteria, updateValue),
Student.class);
System.out.println("Student got updated successfully");
}
public void getAllStudent(MongoOperations mongoOperation) {
List listStudent = mongoOperation.findAll(Student.class);
for(Student student:listStudent) {
System.out.println("Student = " + student);
}
}
public void removeStudent(MongoOperations mongoOperation, String critera,String value) {
Query searchStudent = new Query(Criteria.where(critera).is(value));
mongoOperation.remove(searchStudent, Student.class);
System.out.println("Student removed successfully!! ");
}
}
Самым важным классом Java-программы является класс, который содержит метод main
.
Класс приложения
Главным классом, который содержит метод main
, является класс Application.java
. Мы будем использовать его для вызова методов из класса MongoDBPOperations
.
Класс приложения для вызова методов класса MongoDBPOperations
:
package com.tutorial;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.mongodb.core.MongoOperations;
import com.tutorial.config.MongoConfig;
import com.tutorial.model.Student;
public class Application {
public static void main (String[] args) {
// For Annotation
ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);
MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");
MongoDBPOperations ops = new MongoDBPOperations();
Student student = new Student("John", 15);
//save student
ops.saveStudent(mongoOperation, student);
// get student based on search criteria
ops.searchStudent(mongoOperation, "studentName", "John");
//update student based on criteria
ops.updateStudent(mongoOperation, "StudentName", "John", "studentAge", "18");
// get student based on search criteria
ops.searchStudent(mongoOperation, "studentName", "John");
// get all the students
ops.getAllStudent(mongoOperation);
//remove student based on criteria
ops.removeStudent(mongoOperation, "studentName", "John");
// get all the students
ops.getAllStudent(mongoOperation);
}
}
Давайте посмотрим шаг за шагом на операции, которые выполняются в классе Application.java
:
- Мы создаем
ApplicationContext
. Это связано с необходимостью загрузки конфигурации. - Кроме того, создан объект
MongoOperations
для загрузки компонентаMongoTemplate
. - Объект
MongoDBOperations
предоставляет доступ к методам выполнения различных операцийMongoOperation
. - Создан объект Student с именем John и возрастом 15.
- Мы вызываем метод
saveMethod
классаMongoDBOperations
и передаем необходимые параметры для сохранения объекта в базе данных. - Точно так же мы вызываем различные методы
MongoDBOperations
один за другим.

Запуск программы
Наконец, давайте теперь запустим программу как Java-приложение. Щелкните правой кнопкой мыши на Application.java -> Run as -> Java Application.
Следующий результат появится в консоли.

Теперь давайте закомментируем команду для удаления объекта. MongoDB будет успешно хранить данные.
Класс после комментирования методов удаления:
package com.tutorial;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.mongodb.core.MongoOperations;
import com.tutorial.config.MongoConfig;
import com.tutorial.model.Student;
public class Application {
public static void main (String[] args) {
// For Annotation
ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);
MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");
MongoDBPOperations ops = new MongoDBPOperations();
Student student = new Student("John", 15);
//save student
ops.saveStudent(mongoOperation, student);
// get student based on search criteria
ops.searchStudent(mongoOperation, "studentName", "John");
//update student based on criteria
ops.updateStudent(mongoOperation, "StudentName", "John", "studentAge", "18");
// get student based on search criteria
ops.searchStudent(mongoOperation, "studentName", "John");
// get all the students
ops.getAllStudent(mongoOperation);
//remove student based on criteria
//ops.removeStudent(mongoOperation, "studentName", "John");
// get all the students
//ops.getAllStudent(mongoOperation);
}
}
После внесения изменений в программу давайте ее перезапустим. В консоли появится следующее:

В результате комментирования команды удаления MongoDB будет хранить данные и, следовательно, выглядеть, как показано ниже:

Скачайте Eclipse-проект
Это был пример Spring Data MongoDB.
Вы можете скачать весь исходный код этого примера здесь.
Комментарии