воскресенье, 7 февраля 2016 г.

Groovy и JDBC. Простой ORM фреймворк

В прошлом посте начал вас знакомить с Groovy.

Да, работать с JDBC в Groovy просто, но какой в этом смысл если мы в 99% работаем с базой через ORM?

Давайте рассмотрим ситуацию когда мы работаем с базой, а ORM все еще не нужен?

  • наше приложение достаточно мало, чтобы работать с данным прямо из базы без реляционной привязки
  • нет сложных взамосвязей между сущностями

Получается, в случае пет проджекта или просто небольшого проекта нет особого преимущества в использовании ORM фреймворка.

А что же если все-таки хочется избежать написания CRUD sql запросов и работь непосредство через удобное API?

Можно сделать простенький ORM фреймворк, который позволит работать c БД без sql.

Наша сущность


class Person {
    String id
    String firstname
    String lastname
}

соединение и DDL:


def server = startServer()
def sql = Sql.newInstance(dbSettings)

//при создании таблицы таки sql воспользуемся
sql.execute('''CREATE TABLE PERSON(
                ID VARCHAR(8) PRIMARY KEY,
                FIRSTNAME VARCHAR(100),
                LASTNAME VARCHAR(100),
                AGE INTEGER)
''');

Дальше будем и использовать DataSet. Как он работает? DataSet представляет собой мапу название столбец/значение. Доступ к данным легко получить по названию столбца без учета регистра. Сам запрос выполнится только пользе вызова each на нашем датасете.

Но сначала DataSet нужно получить


def persons = new DataSet(sql, 'Person')

Передаем в конструктор название таблицы и соединение с базой

наполняем нашу таблицу(create):


persons.add(id : 'AA414133',
        firstname: 'Jessy',
        lastname: 'Pinkman',
        age: 25
)

persons.add(id : 'BB414123',
        firstname: 'Walter',
        lastname: 'White',
        age: 55)

persons.add(id : 'HH777123',
        firstname: 'Conor',
        lastname: 'McGregor',
        age: 26)

делаем выборку с условием(retrieve)


persons.findAll {it.age > 25}
        .each {printf('%-20s%s\n',
            it.firstname,
            it.lastname)}

получаем:


Walter              White
Conor               McGregor

добавим сортировку:


persons.findAll {it.age > 25}
        .sort{it.firstname}
        .each {printf('%-20s%s\n',
            it.firstname,
            it.lastname)}

тогда мы получим


Conor               McGregor
Walter              White

Вот и вся Groovy магия

Источники:


Код можно взять здесь

Комментариев нет:

Отправить комментарий