Современные платформы приложений поставляются с легким доступом к данным SQL. Не удивительно, почему у нас так много фреймворков, которые облегчают выдачу запросов и обработку транзакций. SQL является языком общения большинства приложений, когда речь заходит о базах данных.
Play поставляется с плагином JDBC. Мы столкнулись с плагином JDBC ранее , чтобы изменить нашу схему базы данных.
Первым шагом является включение jdbc и модуля evolutions.
|
1
2
|
libraryDependencies += evolutionslibraryDependencies += jdbc |
Затем мы определим необходимую строку подключения. Мы будем использовать простую базу данных h2. Конфигурация добавлена в application.conf.
db.default.driver = org.h2.Driver
db.default.url =»JDBC: h2: / TMP / defaultdatabase»
Затем мы добавляем скрипт, который создает таблицу пользователей.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
# Users schema# --- !UpsCREATE TABLE users ( id bigint(20) NOT NULL AUTO_INCREMENT, email varchar(255) NOT NULL, first_name varchar(255) NOT NULL, last_name varchar(255) NOT NULL, PRIMARY KEY (id), UNIQUE KEY (email));# --- !DownsDROP TABLE users; |
Перед созданием нашего класса репозитория давайте проверим, что предоставляет нам плагин jdbc.
У нас есть простой метод getConnection , отвечающий за возврат соединения jdbc. Это похоже на DataSource.getConnection из Java. Таким образом, обратите особое внимание, так как вы должны закрыть соединение.
|
1
2
|
val connection = db.getConnection()connection.close() |
Следующий метод — withConnection . Используя withConnection, вы получаете Play для управления соединением за вас. Все, что вам нужно сделать, это передать блок кода с действиями JDBC.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
def fetchUsers(): List[User] = { db.withConnection { conn => val stmt = conn.createStatement var rs = stmt.executeQuery("SELECT*FROM users"); val listBuffer = ListBuffer[User]() while(rs.next()) { listBuffer.append(User(Option(rs.getLong("id")),rs.getString("email"),rs.getString("first_name"),rs.getString("last_name"))) } listBuffer.toList } } |
Как вы можете видеть выше, мы только что вернули список наших пользовательских записей.
И последнее, но не менее важное с транзакцией . Вы правильно догадались, что вы получаете обратно соединение с автоматической фиксацией, установленной в false.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
def addUser(user:User): User = { db.withTransaction { conn => val stmt = conn.createStatement val insertQuery = "INSERT INTO users ( email, first_name, last_name) VALUES( '"+user.email+"', '"+user.firstName+"','"+user.lastName+"') " stmt.executeUpdate(insertQuery,Statement.RETURN_GENERATED_KEYS) val resultSet = stmt.getGeneratedKeys; if(resultSet.next()) { val id = resultSet.getLong(1); new User(Option(id),user.email,user.firstName,user.lastName) } else { throw new Exception("User not persisted properly") } } } |
В приведенном выше примере пользователь сохраняется. В случае сбоя мы генерируем исключение и транзакция откатывается.
Подводя итог, мы только что проверили, как получить доступ к базе данных SQL с помощью play. Также мы проверили дополнительные функции, которые предоставляет api, помимо привычного jdbc api. На этом пока все! Не стесняйтесь проверить код на GitHub .
| Ссылка: | Доступ к данным SQL в Play с использованием Scala от нашего партнера по JCG Эммануила Гкациоураса из блога gkatzioura . |