Доступ к данным в 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, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.
Чтобы начать с нуля, перейдите в Настройка проекта.
Чтобы пропустить базовые шаги, выполните следующее:
- Загрузите и
распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью
Git:
git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git
- Перейдите в каталог
gs-accessing-data-mongodb/initial
- Забегая вперед, установите и запустите MongoDB
Когда вы закончите, можете сравнить получившийся результат с образцом в 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
будет печатать свойства объекта.
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
Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:
./gradlew clean build && java -jar build/libs/gs-accessing-data-mongodb-0.1.0.jar
mvn clean package && java -jar target/gs-accessing-data-mongodb-0.1.0.jar
.
Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:
./gradlew bootRun
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