返回

在 Play Framework 中运用多种方法进行数据交互(阻塞式)

后端





在 Play Framework 中,有几种常用的方法可以在阻塞式 I/O 上下文中与数据库进行交互。本文将重点探讨 JDBC、JPA、Slick、doobie 等库,并以 PostgreSQL 为例进行演示。

### 使用 JDBC 进行数据库交互

JDBC(**J** ava **D** atabase **C** onnect)是 Java 语言中用于连接和操纵数据库的标准 API。在 Play Framework 中,可以使用 JDBC 来直接与数据库进行交互。

**示例:使用 JDBC 查询数据库** 

```java
import java.sql.*;

public class JdbcExample {

  public static void main(String[] args) {
    // 加载 JDBC  ged动器
    Class.forName("org.postgresql.Driver");

    // 建立与数据库的连接
    Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/mydb", "myuser", "mypassword");

    // 创建 statement 对象
    Statement statement = connection.createStatement();

    // 执行 SELECT 查询
    String query = "SELECT * FROM users";
    Statement result = statement.executeQuery(query);

    // 遍历并打印出所有行
    while (result.next()) {
      System.out.println("ID: " + result.getLong("id"));
      System.out.println("Name: " + result.getString("name"));
      System.out.println("-----------------");
    }

    // 关闭 statement 对象和数据库连接
    result.close();
    connection.close();
  }
}

使用 JPA 进行数据库交互

JPA(J ava P ersistence A PI)是一种用于在 Java 中进行 ORM(O bject-R elational M aping)的对象-R elational M aping(映射)的标准 API。Play Framework 通过 Play JPA 库提供了对 JPA 的内置J* ava D atabase C onnect)是 Java 语言中用于连接和操纵数据库的标准 API。在 Play Framework 中,可以使用 JDBC 来直接与数据库进行交互。

示例:使用 JPA 查询数据库

import javax.persistence.*;

@Entity
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(nullable = false)
  private String name;

  // 省略getter和setter方法
}
import javax.persistence.*;

public class JpaExample {

  public static void main(String[] args) {
    // 加载 JPA 配置文件
    PersistenceUnitManager persistenceUnitManager = PersistenceUnitManager.getDefaultPersistenceUnitManager();

    // 开始事务
    EntityManagerFactory entityManagerFactory = persistenceUnitManager.getEntityManagerFactory();
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();

    // 查询所有 user
    TypedQuery<User> query = entityManager.createTypedQuery("SELECT u FROM User u", User.class);
    List<User> users = query.getResultList();

    for (User user : users) {
      System.out.println("ID: " + user.getId());
      System.out.println("Name: " + user.getName());
      System.out.println("-----------------");
    }

    // 提交事务并关闭 EntityManager
    entityManager.getTransaction().commit();
    entityManager.close();
  }
}

使用 Slick 进行数据库交互

Slick 是一种基于T ype S afe A PI 的 Scala 数据库库。它提供了对数据库的强T ype S afe A PI 访问,允许开发人员在使用数据库时享受更高的T ype S afe A PI 级别。

示例:使用 Slick 查询数据库

import slick.jdbc.H2Profile.api._
import slick.jdbc.{H2Profile, PostgresProfile}

object SlickExample extends App {

  // 连接到 H2 数据库
  val db = Database.forConfig("h2")

  // 创建表
  db.withTransaction { session =>
    // 创建 users 数据表
    session.exec(users.create)

    // 插入示例数据
    users.insertAll(
      (1, "Alice"),
      (2, "Bob"),
      (3, "Carol")
    )

    // 提交事务
    session.commit()
  }

  // 查询所有 user
  val usersQuery = users.sortBy(user.id)
  val usersAction = usersQuery.action

  val users: Future[List[User]] = db.run(usersAction)

  users.foreach { users =>
    for (user