Статьи

Доступ к данным SQL в Play с использованием Scala

Современные платформы приложений поставляются с легким доступом к данным 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 .