Учебные материалы

Доступ к данным в MongoDB

Этот урок освещает процесс создания приложения, которое использует Spring Data MongoDB для сохранения и получения данных из документоориентированной БД MongoDB.

Что вы создадите

Вы создадите приложение, которое сохраняет Person POJO в БД MongoDB, используя Spring Data MongoDB.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Gradle 1.11+ или Maven 3.0+
  • Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.

Как проходить этот урок

Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.

Чтобы начать с нуля, перейдите в Настройка проекта.

Чтобы пропустить базовые шаги, выполните следующее:

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-accessing-data-mongodb/complete.

Настройка проекта

Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

└── src
    └── main
        └── java
            └── hello

Создание файла сборки Gradle

Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.

Если вы посмотрите на pom.xml, вы найдете, что указана версия для maven-compiler-plugin. В общем, это не рекомендуется делать. В данном случае он предназначен для решения проблем с нашей CI системы, которая по умолчанию имеет старую(до Java 5) версию этого плагина.

build.gradle

buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-release" }
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.8.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
    baseName = 'gs-accessing-data-mongodb'
    version =  '0.1.0'
}

repositories {
    mavenLocal()
    mavenCentral()
    maven { url "http://repo.spring.io/libs-release" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-mongodb")
    testCompile("junit:junit")
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

Spring Boot gradle plugin предоставляет множество удобных возможностей:

  • Он собирает все jar'ы в classpath и собирает единое, исполняемое "über-jar", что делает более удобным выполнение и доставку вашего сервиса
  • Он ищет public static void main() метод, как признак исполняемого класса
  • Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий

Установка и запуск MongoDB

Настроив проект, вы можете установить и запустить MongoDB БД.

Если вы используете Mac с homebrew, то выполните:

$ brew install mongodb

В MacPorts:

$ port install mongodb

Для других систем с управлением пакетами, таких как RedHat, Ubuntu, Debian, CentOS и Windows смотрите инструкции.

После установки MongoDB, запустите её из консоли. Эта команда также запускает серверный процесс.

$ mongod

Вероятнее всего вы увидите не более чем это:

all output going to: /usr/local/var/log/mongodb/mongo.log

Описание простой сущности

MongoDB является NoSQL хранилищем документов. В этом примере вы сохраняете Customer объекты.

src/main/java/hello/Customer.java

package hello;

import org.springframework.data.annotation.Id;


public class Customer {

    @Id
    private String id;

    private String firstName;
    private String lastName;

    public Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%s, firstName='%s', lastName='%s']",
                id, firstName, lastName);
    }

}

Здесь у вас есть класс Customer с тремя атрибутами id, firstName и lastName. id в основном нужен для внутреннего использования MongoDB. У вас также конструктор для создания экземпляра Customer, чтобы сохранить его в БД.

В этом уроке типичные методы получения и установки опущены для краткости.

Свойство id соответствует стандартному названию для MongoDB идентификатору и не требует какой-либо специальной аннотации для обозначения к Spring Data MongoDB.

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

Метод tostring будет печатать свойства объекта.

MongoDB сохраняет данные в коллекциях. Spring Data MongoDB будет упаковывать класс Customer в коллекцию customer. Если вы хотите изменить название коллекции, то можете использовать Spring Data MongoDB @Document аннотацию для класса.

Создание простых запросов

Spring Data MongoDB ориентирован на сохранение данных в MongoDB. Он также наследует функциональность от проекта Spring Data Commons, такую как возможность создавать запросы. Фактически, вам не нужно изучать язык запросов MongoDB; вы можете просто написать немножко методов и запросы будут написаны за вас.

Чтобы увидеть, как это работает, создайте интерфейс репозитория, который работает с сущностями Customer:

src/main/java/hello/CustomerRepository.java

package hello;

import java.util.List;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface CustomerRepository extends MongoRepository<Customer, String> {

    public Customer findByFirstName(String firstName);
    public List<Customer> findByLastName(String lastName);

}

CustomerRepository расширяет MongoRepository интерфейс и содержит тип сущности и ID, Customer и String. "Из коробки", этот интерфейс имеет множество операций, включая стандартные CRUD операции(создание-чтение-обновление-удаление).

Вы можете определить другие запросы, просто описав их сигнатуры методов запросов. В данном случае, вы добавляете метод findByFirstName(), который ищет документ типа Customer, соответствующий критерию по firstName.

Также у вас есть метод findBylastName для поиска списка людей по фамилии.

В типичном Java приложении, вы бы написали класс, который реализовывал CustomerRepository. Но это то, что делает Spring Data MongoDB мощным инструментом: вам не нужно писать реализацию интерфейса репозитория. Spring Data MongoDB создает реализацию на лету, когда вы запускаете приложение.

Приступим к работе и посмотрим, что он найдет!

Создание класса Application

Создайте класс Application со всеми компонентами.

src/main/java/hello/Application.java

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@EnableAutoConfiguration
public class Application implements CommandLineRunner {

	@Autowired
	private CustomerRepository repository;

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

	@Override
	public void run(String... args) throws Exception {

		repository.deleteAll();

		// save a couple of customers
		repository.save(new Customer("Alice", "Smith"));
		repository.save(new Customer("Bob", "Smith"));

		// fetch all customers
		System.out.println("Customers found with findAll():");
		System.out.println("-------------------------------");
		for (Customer customer : repository.findAll()) {
			System.out.println(customer);
		}
		System.out.println();

		// fetch an individual customer
		System.out.println("Customer found with findByFirstName('Alice'):");
		System.out.println("--------------------------------");
		System.out.println(repository.findByFirstName("Alice"));

		System.out.println("Customers found with findByLastName('Smith'):");
		System.out.println("--------------------------------");
		for (Customer customer : repository.findByLastName("Smith")) {
			System.out.println(customer);
		}

	}

}

В конфигурацию вам необходимо добавить только аннотацию @EnableAutoConfiguration, т.к. репозиторий расположен в том же пакете; Spring Boot будет обрабатывать те репозитории автоматически, которые включены в тот же пакет(или подпакет), что и класс, аннотированный @EnableAutoConfiguration. Для большего контроля процессом регистрации вы можете использовать аннотацию @EnableMongoRepositories.

Spring Data MongoDB использует MongoTemplate для выполнения запросов ваших find* методов. Вы можете использовать свой шаблон для более сложных запросов, но в этом уроке это не освещается.

Application включает метод main(), который инициализирует CustomerRepository: Spring Data MongoDB динамически создает прокси и внедряет его сюда. Мы используем CustomerRepository в нескольких тестах. Во-первых, он сохраняет несколько объектов Customer через метод save(). Далее, вызывается findAll() для получения всех объектов Customer из БД. Затем вызывается findByFirstName() для получения единственного Сustomer по его имени. В заключении, вызывается findByLastName() для получения всех объектов с фамилией "Smith".

Сборка исполняемого JAR

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

./gradlew build

Затем вы можете запустить JAR-файл:

java -jar build/libs/gs-accessing-data-mongodb-0.1.0.jar

Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run, либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:

java -jar target/gs-accessing-data-mongodb-0.1.0.jar
Процедура, описанная выше, создает исполняемый JAR. Вы также можете вместо него собрать классический WAR-файл.

Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:

./gradlew clean build && java -jar build/libs/gs-accessing-data-mongodb-0.1.0.jar
Если вы используете Maven, то можете запустить ваш сервис таким образом: mvn clean package && java -jar target/gs-accessing-data-mongodb-0.1.0.jar.

Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:

./gradlew bootRun
С mvn - mvn spring-boot:run.

Т.к. наше Application реализует CommandLineRunner, метод run вызывается автоматически в начале запуска. Вы должны увидеть следующее:

== Customers found with findAll():
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']

== Customer found with findByFirstName('Alice'):
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
== Customers found with findByLastName('Smith'):
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']

Итог

Поздравляем! Вы установили MongoDB сервер и написали простое приложение с использованием Spring Data MongoDB для сохранения объектов в БД и для их получения - и все это без написания реализации репозитория.

С оригинальным текстом урока вы можете ознакомиться на spring.io.

comments powered by Disqus