使用单个JDBC语句对象执行多个查询

问题描述 投票:27回答:5

在JDBC中,我可以使用单个Statement对象多次调用executeQuery("")吗?安全吗?还是应该在每次查询后关闭语句对象,并创建新对象以执行另一个查询。

例如:

Connection con;
Statement s;
ResultSet rs;
ResultSet rs2;
try
{
    con = getConnection();
    s = con.prepareStatement();

    try
    {
        rs = s.executeQuery(".......................");

        // process the result set rs
    }
    finally
    {
        close(rs);
    }

    // I know what to do to rs here
    // But I am asking, should I close the Statement s here? Or can I use it again for the next query?

    try
    {
        rs2 = s.executeQuery(".......................");

        // process the result set rs2
    }
    finally
    {
        close(rs2);
    }
}
finally
{
    close(s);
    close(con);
}
java mysql sql jdbc
5个回答
24
投票

是,您可以重新使用Statement(特别是PreparedStatement),并且通常应在JDBC中使用。如果您不重新使用您的语句并立即创建另一个相同的Statement对象,那将是效率低下和糟糕的样式。至于关闭它,就像在此代码段中一样,将其最终关闭是合适的。

有关您要询问的内容的示例,请查看此链接:jOOq Docs


9
投票

我不确定你为什么要问。 API设计和文档显示,将Statement对象重用于多个executeexecuteUpdateexecuteQuery调用是完美的(甚至是预期的)。如果不允许,则将在Java文档中明确记录(并且API可能会有所不同)。

此外Statement的apidoc说:

Statement界面中的所有执行方法都将隐式关闭一个语句的[sic]当前Statement对象,如果存在一个已打开的对象。

这表明您可以多次使用它。

TL; DR:是的,您可以多次在单个ResultSet对象上调用execute,只要您意识到以前打开的任何Statement将被关闭。

您的示例错误地使用了ResultSet,并且您不能(或:不应)调用PreparedStatement上的任何execute... methods accepting a String

execute...-如果在StringPreparedStatement上调用该方法,则>

但也要回答SQLExceptionPreparedStatement的全部目的是使用参数占位符预编译一条语句,并将其重用于具有不同参数值的多次执行。


4
投票

我在CallableStatement中找不到任何可以说明的事情,即您不应在给定的PreparedStatement实例上多次调用PreparedStatement


3
投票

A executeQuery()告诉数据库记住您的查询,并准备接受要在该查询中执行的参数化变量。这很像一个存储过程。


1
投票

首先,我对您的代码感到困惑

© www.soinside.com 2019 - 2024. All rights reserved.