Современные платформы приложений поставляются с легким доступом к данным SQL. Не удивительно, почему у нас так много фреймворков, которые облегчают выдачу запросов и обработку транзакций. SQL является языком общения большинства приложений, когда речь заходит о базах данных.
Play поставляется с плагином JDBC. Мы столкнулись с плагином JDBC ранее , чтобы изменить нашу схему базы данных.
Первым шагом является включение jdbc и модуля evolutions.
1
2
|
libraryDependencies + = evolutions libraryDependencies + = 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 # --- !Ups CREATE 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) ); # --- !Downs DROP 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 . |