Рубрики
Без рубрики

Доступ к базе данных MongoDB из приложения Spring Boot

Пример использования Spring Data Mongodb MongoTemplate для выполнения операций CRUD в MongoDB.

Автор оригинала: Prasad Saya.

1. Введение и настройка

Это пример разработки кода доступа к данным Spring Data MongoDB. Для этого используется IntelliJ IDEA Community Edition (бесплатная среда IDE для разработки приложений Java), Java SE (JDK версии 8 или выше) и Spring Framework. Это включает в себя подключение к серверу базы данных MongoDB и выполнение основных операций CRUD. Затем запустите код как приложение для загрузки Spring.

Spring Initializr предоставляет расширяемый API для создания проектов на основе JVM и проверки метаданных (зависимостей и версий), используемых для создания проекта. Мы будем использовать Spring Initializr для создания проекта. Посетите: https://start.spring.io/

Страница инициализации позволяет создать проект загрузки Spring с различными опциями: Project Maven, Язык Java, версия загрузки Spring, Метаданные проекта, включая упаковку в виде JAR и версию Java. Укажите метаданные проекта, например, имя как “spring-mongo-demo” или “демо”. Мы включим еще одну опцию, Зависимость, которая является MongoDB данных Spring (она указана в разделе NoSQL Зависимости).

Теперь мы выбрали все необходимые опции. Нажмите кнопку Создать, и будет создана загружаемая ZIP-папка проекта. Загрузите и извлеките папку проекта в каталог, откуда вы можете получить к ней доступ из интегрированной среды разработки.

Из среды IDE:

  • Откройте или импортируйте… и выберите только что загруженную и извлеченную папку проекта.
  • Это откроет проект в окне разработки IDE, займет несколько минут для устранения зависимостей, и проект будет готов к запуску.
  • Вы можете перейти в папку “src” в окне проекта IDE и открыть основную программу Java (например, Демонстрационное приложение.java ).

Запустите проект, и среда IDE создаст проект и запустит его. Откроется окно консоли и покажет, что приложение Spring Boot успешно запущено.

2. Доступ к Серверу базы данных MongoDB

У вас должен быть установлен сервер сообщества MongoDB и запущен сервер. Двумя распространенными инструментами, используемыми для доступа к серверу, являются mongo оболочка (инструмент командной строки) и Компас (инструмент с графическим интерфейсом). Мы подключимся к оболочке на локальном хосте и порту по умолчанию 27017 .

В командной строке операционной системы введите: mongo

> show dbs
-- This lists all the database names.
> db
-- Shows the currently used database name. By default, this is "test", and you are connected to the "test" database.
> show collections
-- Lists the collections in the database. Initially, there will be no user created collections.

Хранилище данных MongoDB содержит базы данных. В базе данных есть коллекции. Данные хранятся в виде документов в коллекциях. Документ-это запись с набором имен и значений полей, аналогичная записи JSON. Но документы MongoDB имеют тип BSON (двоичный JSON) с дополнительными типами полей, такими как дата, целое число, фиксированное десятичное число, объект и массив.

Мы создадим базу данных, коллекцию и добавим некоторые документы из кода Spring и Java.

3. API Java и Spring

Код использует Java SE, драйвер Java MongoDB и библиотеки MongoDB Spring Data и запускается как приложение Spring Boot.

Spring Data MongoDB имеет два основных API: Монгольская табличка ( MongoOperations реализация интерфейса) и MongoRepository (расширение Репозитория интерфейса). MongoTemplate имеет методы для выполнения операций CRUD. API-интерфейсы репозитория построены на MongoTemplate и настраиваются. Кроме того, мы также можем использовать API-интерфейсы драйверов Java MongoDB в приложении Spring.

В примерах мы будем использовать класс MongoTemplate .

В MongoDB вы можете создать коллекцию явно, используя определенную команду, или при вставке документа в несуществующую коллекцию создаются коллекция и документ. Если база данных с указанным именем не существует, она также создается. Коллекция создается в “тестовой” базе данных по умолчанию, если база данных не указана.

Spring позволяет настраивать базу данных по умолчанию для использования, создавая потокобезопасную MongoTemplate экземпляр, который будет использоваться в приложении, и подключение к базе данных с помощью драйвера Java. Это некоторая базовая конфигурация.

Наконец, мы реализуем CommandLineRunner Spring Boot для запуска кода операций с базой данных, т. е. методов класса MongoTemplate . Мы будем просматривать результаты в консоли IDE. Кроме того, мы запросим данные в оболочке mongo .

4. Подключение к MongoDB с конфигурацией Spring

Зарегистрируйте MongoDB и Spring. Создайте MongoClient объект и MongoTemplate экземпляр с использованием метаданных на основе Java. Для получения более подробных параметров конфигурации расширьте Абстрактный класс MongoClientConfiguration абстрактный класс.

@Configuration
public class AppConfig {

    public MongoClient mongoClient() {
        return MongoClients.create("mongodb://localhost:27017");
    }

    public @Bean MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), "libraryDB");
    }
}

Обратите внимание на URL-адрес подключения к базе данных “mongodb://localhost:27017” и MongoTemplate создание экземпляра с “базой данных библиотеки” в качестве базы данных по умолчанию.

Для использования настроек по умолчанию эта конфигурация не требуется. По умолчанию клиент MongoDB подключается к базе данных с именем “тест” на локальном хосте и порту 27017 . В Экземпляр MongoClient представляет пул подключений к базе данных. МонгоКлиент и Mongoclient определены в API драйвера Java MongoDB.

С вышеуказанной конфигурацией или настройками по умолчанию Экземпляр MongoTemplate доступен в приложении. MongoTemplate позволяет сохранять, обновлять и удалять объекты домена и сопоставлять эти объекты с документами, хранящимися в MongoDB.

5. Кодирование приложения

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

@Component
public class AppRunner implements CommandLineRunner {

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Collection Exists? " + mongoTemplate.collectionExists("book"));
    }
}

Запустите приложение Spring Boot, и метод выведет false , так как пока не существует коллекции с именем “книга” или базы данных “библиотека БД”. База данных и коллекция создаются при вставке первого документа

6. ГРУБЫЕ операции

Мы можем сохранять, обновлять и удалять объект, используя класс Pojo (обычный старый объект Java). Класс сопоставляется с документом в коллекции, на который будет оказано влияние. Определить Book.java класс:

public class Book {

    private String id;
    private String title;
    private String author;
    private LocalDate published;
    private Double goodreadsRating;
    private List genre;

    public Book(String title, String author, LocalDate published) {
        this.title = title;
        this.author = author;
        this.published = published;
    }

    // get methods for id, title, author and published
    // set method for goodreadsRating and genre
    // toString override method showing id, title and author
}

Класс можно настроить с помощью аннотаций. @Документ и @Идентификатор , являются наиболее распространенными. Имя класса Pojo сопоставляется с коллекцией; например, Книга сопоставляется с коллекцией с именем книга . @Document позволяет указать имя коллекции, например, коллекция книг или книги . По умолчанию имя коллекции определяется именем класса (не полным именем).

Поле _id является обязательным полем в документе MongoDB и является уникальным. Если значение не указано, драйвер Java создает значение типа Объект . Есть варианты использования @Id примечание или укажите имя поля как id для сопоставления с полем _id . Поле id в классе Book используется для получения его значения.

6.1. Вставка Документов:

Мы будем использовать метод MongoTemplate#вставить(T objectToSave) в классе AppRunner для вставки объекта Book в качестве документа в коллекцию book .

Book animalFarm = new Book("Animal Farm", "George Orwell", LocalDate.of(1945, 8, 17));
mongoTemplate.insert(animalFarm);

Вставка возвращает только что вставленный объект.

Spring Data MongoDB хранит документ с сгенерированным полем _id , полями из объекта Java и информацией о типе в качестве полного имени класса в качестве поля _class . Тип, к которому не привязан объект JSON, определяется атрибутом _class документа. Обратите внимание на поля со значением по умолчанию null ( рейтинг и жанр ) не сохраняются.

{
        "_id" : ObjectId("5ef0226dbdf3ad423757b11a"),
        "title" : "Animal Farm",
        "author" : "George Orwell",
        "published" : ISODate("1945-08-16T17:30:00Z"),
        "_class" : "com.example.demo.Book"
}

Есть перегруженная вставка и вставьте все методы, которые могут вставлять несколько документов одновременно с коллекцией объектов Java.

Book brothersKaramazov = new Book("Brothers Karamazov", "Fyodor Dostoyevsky", LocalDate.of(1879, 1, 1));
Book crimeAndPunishmant = new Book("Crime and Punishment", "Fyodor Dostoyevsky", LocalDate.of(1866, 1, 1));
mongoTemplate.insert(Arrays.asList(brothersKaramazov, crimeAndPunishmant), Book.class);

ЗАПИСКА: Большинство из этих методов работы с CRUD имеют варианты (т. Е. перегружены), позволяющие использовать параметр имени коллекции в дополнение к имени класса или вместо него.

6.2. Запрос Документов

Существует множество способов и методов, которыми мы можем запрашивать документы в коллекции.

6.2.1. Использование классов запросов и критериев:

Распространенным способом запроса является использование методов find , и существует несколько версий этого метода. Метод использует Запрос и Критерии классы.

Criteria criteria = Criteria.where("title").is("Animal Farm");
Query query = Query.query(criteria);
Book book = mongoTemplate.findOne(query, Book.class);

System.out.println(книга) печатает в консоли IDE строку версию Книги объекта:

Book{id='5ef0226dbdf3ad423757b11a', title='Animal Farm', author='George Orwell'}

Другими вариантами метода find являются find() , findAll() , findById() и найти различные() . findAll возвращает коллекцию Книг объектов:

List books = mongoTemplate.findAll(Book.class);

6.2.2. Создание экземпляра запроса из простой строки JSON:

BasicQuery query = new BasicQuery("{ author: 'Fyodor Dostoyevsky' }");
List books = mongoTemplate.find(query, Book.class);

6.2.3. Другие Методы:

запрос() предоставляет методы для быстрого построения операций поиска. Затем есть поддержка платформы агрегирования с помощью метода aggregate и запроса на примере.

6.2.4. Запрос из оболочки Mongo:

Подключитесь к базе данных и запросите документы, используя поиск методы:

use libraryDB
db.book.findOne()
db.book.find().pretty()

Обратите внимание, что оба метода find могут принимать документ предиката запроса в качестве параметра, например: { автор: "Джордж Оруэлл"}

6.3. Обновление Документов

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

Query query = new Query(new Criteria("title").is("Animal Farm"));
Update update = new Update().set("goodreadsRating", 3.9)
                            .set("genre", Arrays.asList("Novel", "Allegory", "Satire" ));

UpdateResult result = mongoTemplate.updateFirst(query, update, Book.class);
System.out.println("Modified documents: " + result.getModifiedCount()); // prints modified count as 1

Обновленный документ:

{
        "_id" : ObjectId("5ef0226dbdf3ad423757b11a"),
        "title" : "Animal Farm",
        "author" : "George Orwell",
        "published" : ISODate("1945-08-16T17:30:00Z"),
        "_class" : "com.example.demo.Book",
        "genre" : [
                "Novel",
                "Allegory",
                "Satire"
        ],
        "goodreadsRating" : 3.9
}

Есть также расстроенные , , сохраните , Найдите и измените и найдите и Замените обновите связанные методы. Кроме того, есть также обновления конвейера агрегации, представленные в MongoDB версии 4.2, где конвейер используется для преобразования и обновления данных с использованием класса

Обновление нескольких документов:

Query query = query(where("author").is("Fyodor Dostoyevsky"));
Update update = new Update().set("author", "Fyodor Mikhailovich Dostoyevsky");
UpdateResult result = mongoTemplate.updateMulti(query, update, Book.class);
System.out.println("Modified documents: " + result.getModifiedCount()); // prints modified count as 2

ОТРЕДАКТИРОВАНО (26 июня 2020 г.) : Исправлено (опечатка) обновление установлено от название к автору .

6.4. Удаление Документов

Удалите документ на основе предоставленного объекта Java или объекта запроса.

Query query = query(where("title").is("Animal Farm"));
DeleteResult = mongoTemplate.remove(query, Book.class);
System.out.println("Deleted documents: " + result.getDeletedCount()); // prints deleted documents as 1

Если у вас есть объект Книга (с его идентификатором значением), вы можете использовать метод удалить(объект объекта) . Если критерии запроса соответствуют нескольким документам, то все они удаляются. Кроме того, существует также метод найти и Удалить .

7. Полезные Ссылки

Код, используемый в примерах, доступен в репозитории GitHub .

Оригинал: “https://www.codementor.io/@prasadsaya/access-mongodb-database-from-a-spring-boot-application-17nwi5shuc”