- Подключиться мобильным устройством к базе данных без написания серверного кода
- ФМП + PostgreSQL
- ФМП + android
- Функционал ФМП
- Плюсы и минусы ФМП
- Выводы
- Работа с PostgreSQL на Java
- Вступление
- Что такое PostgreSQL?
- Демонстрационное приложение
- Зависимость от Maven
- Модель предметной области
- Функциональность CRUD
- Создание базы данных Postgresql
- Подключение к базе данных
- Добавление Сущностей
- Git Essentials
- Считывание Сущностей
- Обновление Сущностей
- Удаление Сущностей
- Запуск приложения
- Вывод
Подключиться мобильным устройством к базе данных без написания серверного кода
Привет, Хабр! Хочу поделиться своим опытом использования Форсайт мобильной платформы.
Если у вас встанет задача удалённого хранения данных и при этом не писать собственный сервер, то первое, что придёт на ум это инструмент Firebase Realtime Database. Большинство читающих знают, о чём идёт речь, но для остальных поясню. С помощью Firebase Database можно хранить удаленно данные в NoSql-ом виде.
Картинка с сайта firebase
Из плюсов использования:
- поддерживается Google
- не нужно писать никакой код, на стороне базы
- быстрая работа
- бесплатно до 5Гб
- интеграция с сервисом Firebase authentication с довольно большим количеством провайдеров авторизации
- поддержка android, iOs, unity и др.
- синхронизируется в режиме реального времени: при обновлении данных в базе они обновляются в клиенте
Из минусов:
- при привышении установленных лимитов по пространству и нагрузке на сервер приходится платить
- нету возможности кастомизировать под себя структура хранения
ФМП + PostgreSQL
Теперь хочу вам рассказать про альтернативный инструмент, которым мне приходится пользоваться.
Зайду издалека. Где-то у меня имеется поднятый сервер PostreSQL с базой данных. В базе данных у меня есть таблица с фруктами:
Что такое PostreSQL как с ним работать можно почитать тут.
Моя задача, чтобы эта таблица как можно быстрее оказалась на телефоне с наименьшим написанием кода и обеспечения безопасности на каждом этапе.
Вот таблица my_table_fruits в pgAdmin4:
Далее нахожу в дереве pgAdmin4 процедуры. Пишу собственную процедуру на получение таблицы:
Процедура будет иметь название fruits_get_by_color и будет отдавать мне фрукты определённого цвета из моей таблицы my_table_fruits.
После этого перехожу на сервер Форсайт мобильной платформы (далее ФМП). Как развернуть платформу и что для этого нужно можно прочитать в документации. ФМП представляет собой сервер, который имеет коннекторы к серверам баз данных. Может приконнектиться и к нужному нам PostgreSQL. Код писать для этого никакой не нужно. С чем мне приходится работать, так это с панелью администратора через браузер. Вводить необходимые адреса серверов, баз данных. Панель администратора имеет настройки и дерево сред:
Более подробно про настройки также можно прочитать в документации.
К сожалению, никаких пробных версий или бесплатных периодов у ФМП нету. Также ФМП разворачивают в защищенной инфраструктуре заказчика. Поэтому ссылок на сервер, чтобы попробовать, не смогу предоставить. Но, чтобы понять суть работы, нижеследующей информации вполне хватит.
Создаю новую среду в дереве сред, например назову её Leonid_environment. Внутри среды создаю проект, например Leonid_project. Захожу в проект и создаю там источник данных, в нашем случае PostgreSQL. Ввожу параметры сервера и базы данных, в которой храниться моя таблица:
Захожу внутрь источника данных и жму “Импортировать”. Ввожу в название источника наименование той процедуры, которую ввёл в PostgreSQL, в данном случае fruits_get_by_color. Для мобильного клиента можно придумать другое название, хотя не обязательно. Назову его fruits_get_by_color_for_android:
После нажатия кнопки “Импортировать”, платформа ФМП “увидит” нашу процедуру и параметры, которые мы должны туда передать.
В частности, она увидит, что мы должны передать параметр fruit_color:
После этого необходимо перейти во вкладку “Пользователи API” и создать пользователя. Создал пользователя с логином Leonid и паролем 123123:
Начиная с этого момента можно переходить в Android Studio, чтобы получить эти данные на мобильный телефон.
ФМП + android
Создаю новый проект. Вместе с платформой распространяется фреймворк для работы с ней. Подтягиваю фреймворк в проект File → import module → *.aar
В проекте объявляю ряд констант, в которые вставляю адрес сервера, а также придуманные мной название среды, название проекта, логин, пароль, наименование ресурса из ФМП:
Обратите внимание, что обращаемся именно к ФМП, а не напрямую к PostgreSQL. Далее необходимо создать объект HyperHive и засетить объявленные переменные:
Затем нужно выполнить авторизацию. Для этого передаём логин и пароль в метод auth():
При получении true можно запрашивать содержимое таблицы, что и сделаем. В объект tableStreamCallParams передадим в виде json-а параметр fruit_color и введём для него значение yellow. Напомню, что мы создавали таблицу фруктов и создавали в PostreSQL процедуру, которая принимает на вход параметр цвета. Это нужно было, чтобы на устройстве ввести данный параметр:
После запроса мы обращаемся к серверу ФМП. Сервер ФМП обращается к серверу PostgreSQL. В итоге мы должны получить список желтых фруктов:
Строки stream-ятся в базу SQLite. В данном случае цвета yellow были только banana и lemon. Скорость загрузки закешированных на стороне ФМП данных примерно 10000 строк в секунду при нормальной скорости интернета.
Все описанные мною шаги можно прочесть в документации. Также там есть информация про подключение к iOs и другим операционным системам.
Сделал запрос из основного потока и не обработал ошибки, чтобы сократить количество кода.
Функционал ФМП
Функционал ФМП этим не ограничивается. Можно на стороне сервера базы данных создать процедуру не только для получения, но и для создания новых строк в зависимости от переданных значений. Можно передавать массивы значений. Ограничения только внутри самой БД.
Пройдусь широкими шагами по основному функционалу ФМП:
- кеширование данных на стороне платформы и получение дельты (не всей таблицы, а только изменённых строк)
- логгирование действий пользователя
- разграничение доступа по пользователям, группам пользователей, id устройства
- аутентификация через LDAP
- интеграция с SMTP, Citrix XenMobile, Sentry
- подпись данных в центре сертификации КриптоПро
- файловое хранилище не стороне ФМП
- локальная БД на стороне ФМП (можно не коннектиться к сторонней БД, а создать БД локально, как в Firebase)
- коннекторы к Firebase Cloud Messaging, Apple Push Notification и Windows Push Notification. Создание рассылок и шаблонов push-уведомлений
Есть фреймворки под:
- android
- iOs
- UWP
- WinCE
- Sailfish, Аврора (российский sailfish)
Есть коннекторы к:
Плюсы и минусы ФМП
Приведу плюсы и минусы, которые вижу со своей точки зрения. В зависимости от специфики и размера проекта, думаю, вы будете не со всем согласны.
- без написания серверного кода можно приконектиться к серверу базы
- большое количество коннекторов к другим источникам
- наличие фреймворков под большинство мобильных операционных систем
- русскоязычная служба поддержки
Минусы:
- стоимость
- ориентация под коммерческого заказчика
- нету бесплатной пробной версии или периода
Выводы
Сравнение платформы ФМП с Firebase Realtime Database было “притянуто за уши”, т.к. хотелось хоть с чем-то сравнить знакомым android- и iOs-разработчику. На самом деле ФМП имеет несколько другой функционал и цели. Среди конкурентов можно привести SAP Mobile Platform, IBM first mobile platform, Оптимум CDC.
В заключение хочу сказать, что на ФМП стоит обратить внимание, если у вас есть:
- довольно крупный заказчик готовый платить за систему
- который не хочет писать прослойку между мобильным устройством и сервером базы данных
- у которого есть большое количество данных, например склад товаров
- для которого принципиально использование российское ПО
- для которого не последнюю роль играет защита данных
Источник
Работа с PostgreSQL на Java
PostgreSQL отлично подходит для Java из-за его объектно-реляционной природы. Благодаря расширенной поддержке пользовательских типов данных и больших наборов данных, это чрезвычайно популярный выбор для многих разработчиков Java.
Автор: Hiram Kamau
Дата записи
Вступление
PostgreSQL (который носит прозвище Postgres) известен своей объектно-реляционной природой. В отличие от этого, другие системы баз данных обычно являются реляционными . В силу своей природы он отлично сочетается с Java, которая в значительной степени ориентирована на объекты.
Доступ к базе данных Postgres с использованием Java требует , чтобы вы полагались на JDBC API , как вы, возможно, подозревали. Из-за этого процедуры Postgres и другие системы баз данных похожи. Тем не менее, это не скрывает того факта, что Postgres предлагает дополнительные возможности, такие как расширенная поддержка пользовательских типов данных и больших наборов данных.
Что такое PostgreSQL?
PostgreSQL является производной от ныне несуществующего проекта POSTGRES . POSTGRES нацелен на достижение не только объектной ориентации, но и расширяемости. Тем не менее, Калифорнийский университет прекратил разработку POSTGRES в 1994 году.
Ранние выпуски Postgres были нацелены на компьютеры UNIX. Тем не менее, с годами база данных стала переносимой. Таким образом, вы можете найти его в системах macOS, Linux и Windows.
Его открытый исходный код и бесплатное лицензирование также способствовали его широкому внедрению. Разработчикам это нравится отчасти потому, что они могут покопаться в источниках, чтобы узнать, как именно это работает.
Демонстрационное приложение
Руководство по Postgres является неполным без сопутствующей реализации CRUD. Мы напишем простое Java-приложение, которое может создавать, считывать, обновлять и удалять информацию о клиентах из базы данных Postgres.
Конечно, мы начнем с определения сущностей, а затем используем их для создания схемы базы данных, чтобы убедиться, что таблицы сопоставлены правильно.
И, как того требует надлежащий API, уровень бизнес – логики не должен иметь представления о том, что происходит на уровне базы данных-практика, известная как многоуровневая архитектура . Таким образом, мы выберем шаблон Объект доступа к данным (DAO) для удовлетворения этой потребности.
Зависимость от Maven
Мы начнем с maven-архетип-быстрый запуск для простого скелетного проекта Maven через ваш терминал:
После выполнения команды вы должны получить структуру, подобную этой:
Затем, в вашем pom.xml файл, добавьте зависимость Postgres:
Модель предметной области
Давайте создадим каталог с именем api в нашем каталоге src , в котором мы определим модель/сущность – Клиент :
Эта сущность будет отображена в нашей базе данных Postgres с соответствующими полями немного позже.
Функциональность CRUD
Поскольку мы работаем в соответствии с шаблоном DAO, давайте начнем реализовывать нашу функциональность CRUD через интерфейс Dao в каталоге spi , в котором будут размещены все наши интерфейсы и классы обслуживания:
Обратите внимание на два обобщения уровня класса : T и I . T представляет фактический объект класса для передачи в базу данных и из нее, тогда как I является классом первичного ключа сущности.
Теперь у нас есть скелет CRUD и объект домена на месте. Когда эти два дела будут выполнены, мы действительно сможем приступить к созданию нашей базы данных.
Создание базы данных Postgresql
Следуйте руководству по установке PostgreSQL для используемой вами платформы – установка довольно проста. С помощью Postgres мы будем использовать pgAdmin для управления установкой.
В вашей локальной системе мы создадим базу данных с именем образец базы данных и создадим таблицу для наших Клиентов :
Для этого в pgAdmin мы запустим ввод в редакторе запросов:
И, таким образом, мы создали таблицу для Клиента s.
Подключение к базе данных
Прежде чем мы сможем выполнить какие-либо инструкции в базе данных из нашего кода, нам сначала нужно будет настроить подключение к базе данных. Мы сделаем это через Jdcconnection класс:
Основная задача вышеприведенного класса-восстановить соединение с базой данных. Поскольку он не всегда может возвращать ненулевой объект Connection , соединение завернуто в Необязательный .
Другая примечательная вещь заключается в том, что соединение является статической переменной . Следовательно, класс возвращает первый ненулевой экземпляр соединения, полученный при первом запуске.
Добавление Сущностей
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Поскольку теперь мы действительно можем подключиться к базе данных, давайте продолжим и попробуем создать объект в базе данных. Для этого мы определим класс PostgreSQL Dao , который реализует вышеупомянутый интерфейс Dao :
После создания объекта Customer вы можете передать его в сохранить метод PostgreSqlDao , чтобы добавить его в базу данных.
Метод save использует строку SQL для работы:
Используя подключение к базе данных, DAO затем подготавливает инструкцию:
Интерес представляет то, что оператор содержит флаг Оператор.RETURN_GENERATED_KEYS . Это гарантирует, что база данных также сообщит о первичном ключе, созданном ею для новой строки.
Стоит также отметить, что метод save использует средство отображения Java. Он преобразует соединение с базой данных в тип возвращаемого значения, требуемый методом. И более того, он использует функцию flatMap , чтобы гарантировать, что возвращаемое значение не имеет необязательного переноса.
Остальные методы CRUD PostgreSqlDao должны следовать той же предпосылке. Они должны сопоставить соединение с возвратом, где это необходимо, и сначала проверить, существует ли соединение, прежде чем работать с ним в противном случае.
Считывание Сущностей
В нашей реализации мы решили использовать метод, который возвращает одного Клиента на основе их идентификатора , и метод, который возвращает всех постоянных клиентов из базы данных.
Давайте начнем с простого .get() метода, который возвращает одного Клиента с соответствующим идентификатором :
Код довольно прост. Мы выполняем запрос через наш Оператор объект и упаковываем результаты в Набор результатов . Затем мы извлекаем информацию из набора результатов и упаковываем ее в конструктор для Клиента , который возвращается.
Теперь давайте реализуем метод .GetAll() :
Опять же, довольно просто – мы выполняем соответствующий SQL-запрос, извлекаем информацию, создаем объекты Customer и упаковываем их в ArrayList .
Обновление Сущностей
Далее, если мы когда-либо захотим обновить объект после его создания, нам понадобится метод .update() :
Опять же, мы подготовили инструкцию и выполнили запрос на обновление на основе полей и идентификатора клиента , переданных методу обновления.
Удаление Сущностей
И, наконец, иногда мы можем пожелать удалить объект, и для этой цели используется метод .delete() :
Опять же, на основе Клиента ‘ s id выполняется запрос на удаление для удаления сущности.
Запуск приложения
После завершения реализации DAO проекту теперь нужна точка входа. Лучшее место для этого было бы в main статическом методе:
Поскольку методы CRUD из Данных PostgreSQL являются общедоступными, мы завернем их, чтобы предотвратить доступ уровня базы данных к остальной части кода, когда это не требуется.
После этого необходимо создать два других пользовательских класса исключений, которые необходимо создать. Это Несуществующее исключение :
И его наследник, Несуществующее Исключение Клиента :
Эти два класса обрабатывают исключения, которые DAO выдает, когда Клиент не существует, чтобы сделать обработку исключений немного более удобной.
Вывод
Мы видели, как создать CRUD-приложение на основе Postgres. Шаги показывают, что на самом деле настройка серверной части Postgres-это тривиальное дело. Привязка модели домена Java к подключению к базе данных Postgres требует немного больше работы. Это связано с тем, что наилучшая практика требует разделения слоев и сокрытия информации .
Вы можете найти весь код проекта на GitHub .
Источник