当今的现代应用程序框架带有易于进行sql数据访问的承诺。 难怪我们为什么有这么多框架可以使发出查询和处理事务变得更加容易。 对于数据库,SQL是大多数应用程序的通用语言。
Play随附JDBC插件。 我们先前遇到了JDBC插件,以便修改我们的数据库架构。
第一步是包括jdbc和Evolutions模块。
libraryDependencies += evolutions
libraryDependencies += jdbc
然后,我们将定义所需的连接字符串。 我们将使用一个简单的h2数据库。 该配置已添加到application.conf中。
db.default.driver = org.h2.Driver
db.default.url =” jdbc:h2:/ tmp / defaultdatabase”
然后,我们添加一个用于创建用户表的脚本。
# 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连接。 这类似于Java的DataSource.getConnection。 由于必须关闭连接,因此要格外注意。
val connection = db.getConnection()
connection.close()
下一个方法是withConnection 。 通过使用withConnection,您可以获得Play为您管理连接。 您要做的就是传递带有jdbc操作的代码块。
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
}
}
如您在上面看到的,我们刚刚返回了用户条目列表。
最后但并非最不重要的是withTransaction 。 您已经猜对了,您收到的是自动提交设置为false的连接。
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")
}
}
}
在上面的示例中,用户被保留。 万一失败,我们将抛出异常,事务将回滚。
综上所述,我们刚刚检查了如何使用play访问sql数据库。 我们还检查了播放api提供的额外功能,除了熟悉的jdbc api。 目前为止就这样了! 随时检查github上的代码。
翻译自: https://www.javacodegeeks.com/2017/05/sql-data-access-play-using-scala.html