Знакомство с Spring Data MongoDB

    Всем доброго дня!

    Стартовали новенький поток «Разработчик на Spring Framework», «внезапно», этот курс оказался очень востребованным среди, как и новых студентов, так и тех кто уже отучился у нас на «обычной» джаве и энтерпрайзе. Так что, если интересно, то заходите к нам на открытые уроки, ну и, разумеется, делимся интересными материалами по теме.

    Перевод статьи Spring Data MongoDB Tutorial
    Автор статьи Anand Kumar


    Поехали!

    В современном мире очень важно создать и запустить приложение как можно скорее. Также приложение должно быть простым в разработке и легко поддерживаться.

    Spring — как раз такой фреймворк, который обеспечивает простоту интеграции со множеством других различных фреймворков, что упрощает разработку приложения с использованием Spring. Одной из таких интеграций является интеграция Spring с MongoDB.



    1. Вступление

    В этом уроке мы обсудим комбинацию самого известного java-фреймворка «Spring» и самой известной NoSQL системы управления базами данных (СУБД) «MongoDB». MongoDB — это документоориентированная NoSQL СУБД, которая хранит данные в JSON-подобном формате.
    Интеграция Spring Data и MongoDB предоставляется Spring для облегчения взаимодействия обоих и удобства разработчиков, избавляя от необходимости написания множества запросов для вставки, обновления и удаления.

    Ниже приведены некоторые из возможностей, предоставляемых проектом Spring Data MongoDB:

    1. Spring Data позволяет использовать как класс @Configuration, так и XML-конфигурацию.
    2. Иерархия исключений Data Access Spring используется для трансляции исключения.
    3. Интегрированное сопоставление между Java POJO и документом MongoDB.
    4. Класс MongoTemplate, который упрощает использование распространенных операций MongoDB.
    5. В дополнение к MongoTemplate, можно использовать классы MongoReader и MongoWriter для низкоуровневого отображения.

    Лучший способ понять любую технологию — это использовать ее на практиктике, и это именно то, что мы собираемся сейчас сделать.

    Давайте создадим простую программу, чтобы подробно ознакомиться с Spring Data MongoDB.

    2. Технологии и инструменты

    Давайте посмотрим на технологии и инструменты, которые мы будем использовать для создания программы.

    1. Eclispe Oxygen.2 Release (4.7.2)
    2. Java – версия 9.0.4
    3. Gradle – 4.6
    4. MongoDB server – 3.6
    5. MongoCompass – 3.6
    6. SpringDataMongoDB – 2.0.5-RELEASE

    3. Структура проекта

    Структура нашего проекта будет выглядеть так, как показано ниже.


    Структура проекта для Spring Data MongoDB

    Gradle-проект будет иметь структуру, показанную выше. В случае pom.xml структура проекта будет немного отличаться.

    4. Программа

    В рамках этой программы мы постараемся выполнить нижеуказанные задачи.

    1. Сохранение объекта в MongoDB
    2. Обновление объекта в MongoDB
    3. Удаление объекта из MongoDB
    4. Получение всех объектов из MongoDB

    Давайте теперь разберем все компоненты программы. Прежде всего, мы начнем с зависимостей и jar-файлов, необходимых для программы.

    4.1 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-файлах, которые нужно подтянуть для проекта.

    4.2 Конфигурация для 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.

    4.3 Класс модели

    Теперь рассмотрим класс модели. Мы используем 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 определяет идентификатор коллекции.

    4.4 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.

    4.5 Класс приложения

    Главным классом, который содержит метод 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:

    1. Мы создаем ApplicationContext. Это связано с необходимостью загрузки конфигурации.
    2. Кроме того, создан объект MongoOperations для загрузки компонента MongoTemplate.
    3. Объект MongoDBOperations предоставляет доступ к методам выполнения различных операций MongoOperation.
    4. Кроме того, создан объект Student с именем John и возрастом 15.
    5. Мы вызываем метод saveMethod класса MongoDBOperations, и передаем необходимые параметры для сохранения объекта в базе данных.
    6. Точно так же мы вызываем различные методы MongoDBOperations один за другим.

    4.6 Запуск программы

    Наконец, давайте теперь запустим программу как 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 будет хранить данные и, следовательно, будет выглядеть, как показано ниже.


    MongoDB вывод после выполнения команды сохранения и обновления

    5. Скачайте Eclipse-проект

    Вы можете скачать весь исходный код этого примера здесь

    THE END

    Как всегда ждём вопросы и комментарии тут или заходите к Юрию на открытый урок, где можно не только послушать, но и поспрашивать тоже.
    • +12
    • 8,8k
    • 5
    OTUS. Онлайн-образование
    421,37
    Цифровые навыки от ведущих экспертов
    Поделиться публикацией

    Комментарии 5

      0
      Как по мне, то намного проще и удобнее пользоваться CrudRepository для операций с БД вместо использования Criteria API
        0
        В целом да, но когда появляется поиск по многим критериям, то Criteria API намного удобнее
        0
        параметры подключения, как у вас описаны в MongoConfig нужно выносить в конфигурацию
          0
          Вы правы, но это таки перевод :)
            0
            Вы можете взять за базу пример из курса. Намного лучше будет и понятнее чем этот перевод. Будет показан нормальный CRUD с REST API

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое