如何在 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.cache.CacheApi!框架 2.4.2
如何在 Play 2.5 框架中使用授权 ActionBuilder 保护静态文件
如何使用 Play 框架中的演变在 PostgreSQL 中创建函数?