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

时间:2013-01-25 02:48:56

标签: java oracle jdbc playframework playframework-1.x

我做了这个JDBC代码,用于使用Play Framework 1.2.5从数据库Oracle 10g中获取一些数据:

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)对于整个应用程序生命周期,与DB的连接是否会持续存在?

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

请让我知道锄头继续这个。

此致

2 个答案:

答案 0 :(得分:1)

您需要阅读播放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%"
);

答案 1 :(得分:0)

1)您的代码没问题,只要您在使用它们时关闭ResultSet,PreparedStatement和Connection对象(close()方法!)。从本质上讲,您运行的是“本机查询”,而不是Tom推荐的JPA / ORM方法。两者都有其优点,我建议您了解JPA并了解哪一种最适合您的需求。

在Play中使用较少样板代码的本机查询还有另一种选择:JPA.em()。createNativeQuery()。

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