返回
在 Play Framework 中运用多种方法进行数据交互(阻塞式)
后端
2023-10-02 13:37:16
在 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