Автор оригинала: Dhananjay Singh.
Обзор
Spring Data – это комплексный проект, который содержит множество подмодулей, каждый из которых специфичен для конкретной базы данных. В этой статье мы рассмотрим Spring Data MongoDB , создав приложение, которое хранит и извлекает данные из MongoDB, базы данных без SQL на основе документов.
Если вы хотите узнать больше о Spring Data, мы подробно рассмотрели это в руководстве по Spring Data JPA .
MongoDB
MongoDB -это ориентированная на документы база данных NoSQL, в которой хранятся документы, подобные JSON, с динамическими схемами. Он обычно используется для хранения больших объемов данных.
Прежде чем двигаться дальше, было бы неплохо узнать некоторые термины базы данных NoSQL. Пожалуйста, обратите внимание, что эти термины не совсем однозначны по сравнению с реляционными базами данных SQL:
- База данных : Это контейнер для коллекций, и его можно рассматривать как подобие базы данных СУБД, которая является контейнером для таблиц.
- Коллекция : Она эквивалентна таблицам в СУБД, но, в отличие от коллекции, имеет динамическую схему. Коллекция существует в базе данных.
- Документ : Это единственная запись в коллекции MongoDB. Это можно рассматривать как строку в СУБД.
- Поле : Документ содержит ноль или более полей. Это похоже на столбец СУБД с парой ключ-значение.
Чтобы настроить сервер MongoDB на вашем локальном компьютере, вы можете загрузить устанавливаемый здесь в соответствии с вашей операционной системой. Затем вы также можете загрузить такой инструмент, как Компас , для создания приятного графического интерфейса для взаимодействия с вашим сервером.
Другой вариант , который мы будем использовать, – это MongoDB Atlas , представляющий собой облачную базу данных в качестве сервиса. После регистрации войдите в систему и создайте кластер, используя бесплатный уровень:
Чтобы подключиться к нашему кластеру, мы должны создать пользователя:
Давайте теперь создадим вашу базу данных и коллекцию:
Теперь мы готовы подключиться к нашей коллекции с помощью нашего приложения Spring.
Проект Spring Data MongoDB
Установка
Лучший способ начать со скелетного проекта-посетить Spring Initializr . Выберите предпочитаемую версию Spring Boot и добавьте зависимости Web
и MongoDB
:
После этого сгенерируйте его как проект Maven, и все готово!
Определение коллекции
Во-первых, давайте определим нашу коллекцию Кандидат
класс модели:
@Document(collection = "candidate") public class Candidate { @Id private String id; private String name; private double exp; @Indexed(unique = true) private String email; // getters and setters }
Теперь давайте взглянем на эти аннотации:
- @Document : Это помечает класс как объект домена, который будет сохранен в базе данных. Имя коллекции по умолчанию, которое используется, – это имя класса (первый символ в нижнем регистре). Мы можем сопоставить другую коллекцию в базе данных, используя атрибут
коллекция
аннотации. - @Id : Это поле помечает поле, используемое для идентификации.
- @Indexed(уникальный) : Это применяется к полю, которое будет проиндексировано с ограничением уникальности.
Определение репозитория
Мы создаем репозиторий, создавая интерфейс:
public interface CandidateRepository extends MongoRepository{}
Репозиторий кандидатов
расширяет интерфейс MongoRepository
и подключает тип данных документа, с которым мы работаем, т. е. Кандидат
и Строка
соответственно.
Это даст нам доступ ко всем операциям CRUD вокруг коллекции MongoDB.
Настройка подключения
Чтобы настроить правильное соединение, нам нужно определить свойства соединения в application.properties
:
spring.data.mongodb.uri=mongodb+srv://: @ - / ?retryWrites=true
Вы можете получить эти значения непосредственно из пользовательского интерфейса MongoDB Atlas:
Примечание : Если ваш пароль содержит специальные символы, то он должен быть закодирован по URL-адресу.
По умолчанию ваш кластер защищен, чтобы не принимать запросы с любого IP-адреса клиента. Нам нужно разрешить нашему IP-адресу подключаться к этому кластеру через белый список IP-адресов:
Git Essentials Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле || изучите || это! Учить больше
Определение контроллера
Теперь давайте использовать наш репозиторий в нашем Контроллере-кандидате
через @Autowired
аннотацию:
@RestController @RequestMapping("/candidate") public class CandidateController { @Autowired private CandidateRepository candidateRepository;
Простые операции CRUD
Вставить
Давайте создадим POST
сопоставление, которое будет вставлять данные в наш MongoDB:
@PostMapping @ResponseStatus(code = HttpStatus.CREATED) public Candidate add(@RequestBody Candidate candidate) { return candidateRepository.save(candidate); }
Мы использовали метод save()
для объекта репозитория-кандидата
. Объект Кандидат
захватывается @RequestBody
и используется непосредственно в методе save ()
.
Если мы попытаемся снова использовать тот же идентификатор электронной почты, мы получим ошибку с дубликатом ключа:
Мы также можем проверить статус нашей коллекции в Атласе:
Прочитай
Давайте создадим пару сопоставлений GET
для извлечения наших записей.
@GetMapping public ListgetAll() { return candidateRepository.findAll(); } @GetMapping(value = "/{id}") public Candidate getOne(@PathVariable String id) { return candidateRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException()); }
findAll()
вернет все записи в нашей базе данных, в то время как метод findById()
вернет одну запись на основе переданного идентификатора.
Если запись отсутствует, она создает
пользовательское исключение во время выполнения. Исключение ResourceNotFoundException
– это пользовательский класс, который возвращает 404
статус, если он брошен:
@ResponseStatus(value = HttpStatus.NOT_FOUND) public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException() { } }
Если вы хотите прочитать об этом подробнее, мы подробно рассмотрели это в разделе Обработка исключений весной .
Обновление
Теперь, чтобы обновить конкретную запись, мы будем использовать сопоставление PUT
:
@PutMapping(value = "/{id}") public Candidate update(@PathVariable String id, @RequestBody Candidate updatedCandidate) { Candidate candidate = candidateRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException()); candidate.setName(updatedCandidate.getName()); candidate.setExp(updatedCandidate.getExp()); candidate.setEmail(updatedCandidate.getEmail()); return candidateRepository.save(candidate); }
Сначала мы проверяем, присутствует ли Кандидат
с указанным идентификатором
или нет. Если нет, мы вернем 404
статус, в противном случае мы обновляем весь объект и сохраняем его с помощью метода save()
:
Удалить
Теперь давайте удалим конкретную запись с помощью сопоставления УДАЛИТЬ
:
@DeleteMapping(value = "/{id}") @ResponseStatus(code = HttpStatus.ACCEPTED) public void delete(@PathVariable String id) { Candidate candidate = candidateRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException()); candidateRepository.delete(candidate); }
Мы использовали метод delete()
в репозитории кандидат
для удаления записи:
Методы пользовательских запросов
Мы можем добавить некоторые методы в наш Репозиторий кандидатов
, чтобы иметь некоторые дополнительные функции, основанные на наших бизнес-требованиях:
public interface CandidateRepository extends MongoRepository{ Optional findByEmail(String email); List findByExpGreaterThanEqual(double exp); List findByExpBetween(double from, double to); }
Выше мы добавили функцию поиска на основе электронной почты и опыта. Все, что нам нужно сделать, это следовать соглашению об именах, изложенному в Spring Data .
После метода findBy()
мы пишем имя атрибута в регистре camel, за которым следует любое другое ограничение, которое мы, возможно, захотим применить. Аргументы метода должны соответствовать ожиданию предложения where. Данные Spring будут создавать фактические запросы для вас во время запуска приложения с помощью этого интерфейса.
Давайте используем это в нашем контроллере:
@GetMapping("/searchByEmail") public Candidate searchByEmail(@RequestParam(name = "email") String email) { return candidateRepository.findByEmail(email) .orElseThrow(() -> new ResourceNotFoundException()); } @GetMapping("/searchByExp") public ListsearchByExp(@RequestParam(name = "expFrom") Double expFrom, @RequestParam(name = "expTo", required = false) Double expTo) { List result = new ArrayList<>(); if (expTo != null) { result = candidateRepository.findByExpBetween(expFrom, expTo); } else { result = candidateRepository.findByExpGreaterThanEqual(expFrom); } return result; }
Вывод
В этой статье мы рассмотрели, как использовать Spring Data MongoDB для подключения к серверу MongoDB. Сначала мы создали сервер MongoDB в облаке с помощью MongoDB Atlas, а затем использовали данные Spring для подключения к нему. После этого мы выполнили несколько простых операций CRUD, а также написали несколько пользовательских запросов.
Как всегда, код для примеров, используемых в этой статье, можно найти на Github .