如何在 Play 框架中执行查询(使用 Oracle 10g)

Posted

技术标签:

【中文标题】如何在 Play 框架中执行查询(使用 Oracle 10g)【英文标题】:How do I execute queries in Play framework (with Oracle 10g) 【发布时间】:2013-01-25 02:48:55 【问题描述】:

我使用 Play Framework 1.2.5 从数据库 Oracle 10g 中获取一些数据的 JDBC 代码:

Connection conn = DB.getConnection();
PreparedStatement  stmt = null;
System.out.println(conn);
try 
    stmt = conn.prepareStatement("select dept_id from emp where emp_id = 11");
    ResultSet rs = stmt.executeQuery();
    while (rs.next()) 
        System.out.println("Dept Id: " + rs.getInt("dept_id"));
    
 catch (SQLException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();

这种方法有效,但我感到困惑:

如果我注释整个代码块并运行应用程序,那么我可以在控制台中看到一条消息,说明已与数据库建立连接。因此:

1) 上述代码块是从 Oracle DB 获取数据的正确方法还是比这更好的方法?

2) 在整个应用程序生命周期内,与数据库的连接是否会持续存在?

我是这方面的新手,因此苦苦挣扎:(

请让我知道继续进行此操作。

问候

【问题讨论】:

【参考方案1】:

需要阅读 play JPA 文档:http://www.playframework.org/documentation/1.2.5/jpa#finding

您的查询应如下所示:

Post.find("byTitle", "My first post").fetch();
Post.find("byTitleLike", "%hello%").fetch();
Post.find("byAuthorIsNull").fetch();
Post.find("byTitleLikeAndAuthor", "%hello%", connectedUser).fetch();

如果你需要做一个完整的查询,你可以在find中添加JPA代码:

Post.find(
    "select p from Post p, Comment c " +
    "where c.post = p and c.subject like ?", "%hop%"
);

【讨论】:

【参考方案2】:

1) 你的代码没问题,只要你在使用完 ResultSet、PreparedStatement 和 Connection 对象后关闭它们(close() 方法!)。本质上,您正在运行“本机查询”,而不是 Tom 推荐的 JPA/ORM 方法。两者各有千秋,建议大家学习一下JPA,看看哪一个最适合自己的需求。

Play 中的原生查询还有另一个选项,使用较少的样板代码:JPA.em().createNativeQuery()。

2) DB.getConnection() 可能会转换为对连接池的调用,如果是这样,您无需担心连接的生命周期,只需确保将其“归还”给池当你不再需要它时,即 close() 我上面提到的所有对象。

【讨论】:

以上是关于如何在 Play 框架中执行查询(使用 Oracle 10g)的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Play 框架中的可选查询参数

如何在 Play 的静态方法中使用 play.cache.CacheApi!框架 2.4.2

如何在 Play 2.5 框架中使用授权 ActionBuilder 保护静态文件

如何使用 Play 框架中的演变在 PostgreSQL 中创建函数?

在 Play 框架中使用 @Before 进行 Selenium 测试

play框架使用起来(11)