Использование Zero Resource Model для управления базами данных в WebSphere sMash

В статье приведена подробная информация о функциональных возможностях Zero Resource Model для управления базами данных на платформе IBM® WebSphere® sMash. В данном обзоре динамичного управления базами данных рассматриваются встроенные в WebSphere sMash возможности по управлению и обработке баз данных и приводятся примеры исходного кода, которые могут послужить отправной точкой для разработчиков приложений. Статья основана на материалах журнала IBM WebSphere Developer Technical Journal. Из журнала IBM WebSphere Developer Technical Journal.

Арун Лобо, разработчик программного обеспечения, IBM

Арун Лобо (Arun Lobo) является разработчиком ПО в группе Web 2.0 and Mobile feature pack в IBM India Software Labs. Кроме того, он занимался технологиями Web 2.0 и Java EE, а также встроенным ПО аппаратно-программных комплексов и серверными технологиями.



25.06.2012

Введение

Управление базами данных является важной задачей для широкого круга приложений. Именно для таких приложений была специально разработана платформа IBM WebSphere sMash. WebSphere sMash всегда имела хорошую поддержку баз данных. Она позволяет подключаться к внешнему источнику данных посредством JDBC-моста или использовать встроенную поддержку баз данных Derby. Для облегчения и упрощения управления базами данных платформа WebSphere sMash использует модель ресурсов, известную под названием Zero Resource Model. В данной статье рассматривается модель Zero Resource Model и приводятся примеры, которые помогут начать ее использование.

Хотя в статье представлены некоторые вводные сведения, предполагается, что вы знакомы с основными концепциями платформы IBM WebSphere sMash и сможете сосредоточиться на модели Zero Resource Model как на универсальной и динамичной альтернативе существующим средствам управления базами данных.


Управление базами данных в WebSphere sMash

IBM WebSphere sMash – это платформа разработки и выполнения, предназначенная для быстрого создания динамичных Web-приложений. По сути она является

  • платформой для создания и разработки приложений;
  • сервером для развертывания приложений;
  • средой времени исполнения.

WebSphere sMash работает на базе платформы Java™.

Web-приложения в WebSphere sMash разрабатываются на одном из двух языков сценариев: Groovy или PHP. Groovy – это язык сценариев, разработанный специально для платформы Java. Он синтаксически похож на язык Java, но представляет собой семантически менее требовательную и более свободную форму этого языка. Web-приложения в WebSphere sMash разрабатываются на REST-принципах путем реализации нескольких REST-методов. Сценарии также можно писать на PHP, но в данной статье все примеры кода написаны на Groovy, если не указано иное.

По умолчанию WebSphere sMash предоставляет поддержку баз данных посредством JDBC и других известных методов. Кроме того, WebSphere sMash поставляется со встроенной базой данных Derby. К этой базе данных можно подключаться с помощью обычных средств (например, моста ODBC/JDBC) и выполнять транзакции, используя SQL-запросы. В качестве альтернативы можно использовать предопределенную модель Zero Resource Model с развитым интерфейсом.

Модель Zero Resource Model (ZRM) обеспечивает упрощенный подход к созданию RESTful-обработчиков ресурсов (объяснение приведено ниже) с хранилищем данных. Нужно всего лишь предоставить простые "модельные" определения ресурсов; ZRM на основании этих модельных определений создает хранилище данных и поддерживает полную семантику create/read/update/delete (CRUD). Кроме того, ZRM поддерживает разнообразные форматы содержимого, включая протоколы JSON и Atom Publishing Protocol.

ZRM использует простую REST-модель, позволяющую сосредоточиться на приложении, а не на деталях персистентности. ZRM не предоставляет объектно-реляционного отображения (ORM) общего назначения. Например, модель данных ZRM ориентирована на REST, а не на произвольную модель POJO, декларируя фундаментальные предположения по персистенции.


Объявление схемы в виде JSON

Объявление схемы в ZRM называется объявлением модели ресурсов и выполняется в файле модели ресурсов с использованием JSON. По умолчанию этот файл называется /app/models/<model-name>.json и выглядит примерно так, как показано в листинге 1.

Листинг 1
	// Объявление модели ресурсов
	// Файл: /app/models/citizen.json
	{
	 	"fields" : {
	            		"name": {"type": "string", "max_length":40},
	           		 	"birth-date": {"type": "date"},
	            		"province": {"type": "string", "format":"region"},
	            		"phone-number": {"type": "string", "format":"phone"}
	}}

Аналогично объявлению схемы в широко распространенных системах управления реляционными базами данных (СУРБД), объявление модели ресурсов содержит определения полей, ограничений, отфильтрованных наборов и необязательных параметров конфигурации.

Для заполнения базы данных начальными данными можно объявить эти данные в JSON-файле. Файл должен находиться в папке app/models/fixtures. Пример приведен в листинге 2.

Листинг 2
[
   	 {
       		 "type": "persons",
       		 "fields": {
           		 "id": 301
           		 "first_name": "Bill",
            		"age": 34,
            		"is_child": false
       	 	}
    	},
   	 {
        		"type": "addresses",
       		 "fields": {
            		"id": 38
            		"street": "100 Maple Ave",
            		"city": "Anytown",
            		"state": "NY"
       		 }
    	},
   	 {
        		"type": "persons",
       		 "fields": {
           		 "first_name": "Frank",
            		"age": 28,
           		 "is_child": true
       		 }
    	}
	]

ZRM содержится в модуле zero.resource. Этот модуль должен быть указан в файле /config/ivy.xml следующим образом:

<dependency name="zero.resource" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

Либо на PHP:

<dependency name="zero.resource.php" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

Само по себе объявление схемы или данных в исходном файле initial-data.json не загружает данные в базу данных. Необходима синхронизация базы данных. ZRM работает с простыми однострочными командами. Команда синхронизации данных (т.е. создания и заполнения базы данных) выглядит следующим образом:

zero model sync

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

zero model reset

Ссылки на информацию об аналогичных командах для доступа к базе данных и ее настройки приведены в разделе Ресурсы.


Настройка и подключение к внешней базе данных

Кроме использования встроенной базы данных по умолчанию вышеописанным способом ZRM может также подключаться к другим базам данных с аналогичными моделью и доступом к данным. Поддерживаются следующие базы данных:

  • IBM DB2® V9.5 (System z®, Linux®, UNIX®, Windows®).
  • Derby V10.3.2.1 (сетевая и встроенная).
  • MySQL 5.
  • Oracle 10g.

Все параметры конфигурации базы данных должны быть указаны в знакомом файле zero.config. Можно использовать ключ my-database (листинг 3).

Листинг 3
/config/db/my-database = {
    			"class" : "com.mysql.jdbc.jdbc2.optional.MysqlDataSource",
    			"serverName" : "myserver",
    			"portNumber" : 3306,
    			"databaseName" : "MY1STDB",
    			"user" : "root",
    			"password" : "mypassword"
		}

		/config/resource/dbKey = "my-database"

Как и в случае встроенной базы данных, в файл ivy.xml необходимо включить модуль zero.resource:

<dependency name="zero.resource" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

Либо на PHP:

<dependency name="zero.resource.php" org="zero" rev="[1.0.0.0, 2.0.0.0["/>


Программный интерфейс модели

Интерфейс модели обращается к ресурсам программно, используя конструкции, похожие на коллекции. Кроме базовой модели программирования CRUD, ZRM предоставляет функцию списка, называемую моделью LCRUD. Функция списка позволяет перечислять и фильтровать элементы коллекции, используя простые условия. Интерфейс модели может использоваться в обработчиках ресурсов (groovy или PHP) посредством методов onList(), onCreate(), onRetrieve(), onUpdate() и onDelete() для операций LCRUD соответственно. Можно определить эти методы или вызвать реализации по умолчанию, используя:

ZRM.delegate()

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

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

В нескольких следующих фрагментах кода обратите внимание на использование двойного подчеркивания "__".

Предположим, что в файле /app/models/persons.json имеется объявление модели ресурсов (схема), приведенное в листинге 4.

Листинг 4
	{
    		"fields" : {
        		"firstname": {"type": "string", "max_length": 30},
        		"birthdate": {"type": "date"},
        		"ischild": {"type": "boolean"}
    		},

    		"collections" : {
        		"children": {"memberFilters": {"ischild": true}}
   		 }
	}

Для использования интерфейса модели код должен обратиться в файл /app/resources/persons.groovy обработчика ресурсов. Этот код создает коллекцию:

import zero.resource.TypeCollection
Type persons = TypeCollection.retrieve('persons');

Пример кода для обработки запроса

Запрос к базе данных придерживается предопределенной семантики (листинг 5).

Листинг 5
	// извлечение коллекции по умолчанию для модели 'persons'
	def collection = TypeCollection.retrieve('persons')

	// извлечение члена коллекции
	def id = joe.id
	joe = collection.retrieve(id)

	// список всех результатов
	def all_people = collection.list()

	// использование list() с условиями
	def some_people = collection.list(firstname: 'Joseph')
	people = collection.list(firstname__contains: 'se')
	people = collection.list(firstname__endswith: 'ph')

	// постраничные результаты от 11-го до 20-го элемента в общей коллекции
	def paged_people = collection[10..19].list()

	// постраничные и отфильтрованные результаты
	def filtered_paged = collection.filter(firstname__endswith: 'ph')[201..300].list()

	// исключающие результаты
	def excluded = collection.exclude(ischild: true).list()

	// получить карту членов
	def map = collection.in([1, 3, 5])

Пример кода для LCRUD

Базовые операции list, create, retrieve, update и delete можно выполнять при помощи кода, приведенного в листинге 6.

Листинг 6
#Список всех членов
	List<Member> everybody = persons.list()
	everybody.each { person ->
    		println person.firstname
	}

	#Список подмножества членов
	List<Member> somePersons = persons.list(firstname__startswith: 'Jo')
	somePersons.each { person ->
    		println person.birthdate
	}

	#Создать члена
	Member person = persons.create(firstname:'Joe', birthdate:'1978-01-21', 
	ischild: true)

	#Извлечь члена
	Member person = persons.retrieve(1)

	#Обновить члена
	Member result = persons.update(id: '1', firstname:'Bob', birth_date:'1961-12-05')

	#Удалить члена
	boolean result = persons.delete(1)

Кроме того, интерфейс модели содержит различные методы для фильтрации, исключения, разбивки на страницы и т.д. Ссылки на подробное описание приведены в разделе Ресурсы.


REST-доступ к модели ресурсов

Как упоминалось ранее, WebSphere sMash реализует REST-модель посредством обработчиков ресурсов, определяющих по одному методу для каждого из вызовов LCRUD. Кроме интерфейса модели, имеется интерфейс HTTP REST для Web-досупа к базе данных через URI.

Для Web-доступа к базе данных коллекция может считываться с использованием следующего URI: http://<server-name>:<server-port^gt;/resources/persons; например:

http://localhost:8080/resources/persons

Семантика интерфейса модели может применяться и для интерфейса HTTP REST (листинг 7).

Листинг 7
#Отфильтрованная коллекция, поле firstname (имя) экземпляров членов которой содержит 'Jo'

http://localhost:8080/resources/persons?firstname__contains=Jo
		
#Отфильтрованная коллекция, поле firstname (имя) экземпляров членов которой
#содержит 'Jo' и birthdate (день рождения) выпадает на 25 число любого месяца.
http://localhsot:8080/resources/persons?firstname__contains=Jo&birthdate__day=25

Операции LCRUD можно выполнять посредством HTTP-методов (листинг 8).

Листинг 8
#Создать члена
		POST /resources/persons
		Content-Type: application/json
		{
   			"firstname": "Bill",
   			"birthdate": "1976-09-25"
		}
		#Извлечь члена
		GET resources/persons/1
		#Обновить члена
		PUT /resources/persons/1
		Content-Type: application/json
		{
   			"firstname": "Janie",
   			"birthdate": "1973-12-04"
		}
		#Удалить члена
		DELETE /resources/persons/1

Заключение

Zero Resource Model – это простая и эффективная модель для доступа к базе данных в WebSphere sMash. Развитый интерфейс модели заменяет SQL-запросы, а REST-модель обеспечивает унифицированный Web-доступ. ZRM предоставляет готовый к использованию динамичный способ управления базами данных для ситуативных приложений, освобождающий вас от большого объема рутинной работы благодаря своему встроенному механизму обработки данных.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=WebSphere
ArticleID=822513
ArticleTitle=Использование Zero Resource Model для управления базами данных в WebSphere sMash
publish-date=06252012