Автор оригинала: 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 Listgenre; 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
возвращает коллекцию Книг
объектов:
Listbooks = mongoTemplate.findAll(Book.class);
6.2.2. Создание экземпляра запроса из простой строки JSON:
BasicQuery query = new BasicQuery("{ author: 'Fyodor Dostoyevsky' }"); Listbooks = 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”