mysql - 检查查询是更新/删除/创建还是选择的方法

时间:2016-02-22 00:54:02

标签: java mysql jdbc

是否有一种简单的方法可以检查我是否应该使用executeUpdateexecuteQuery

当然,我这样做,但它有点混乱

try
{
    Statement st = conn.createStatement();

    try
    {
        ResultSet rs = st.executeQuery(query.query);
        //parse result
    }
    catch (SQLException e)
    {
        if(Messages.getString("Statement.57").equals(e.getMessage()))
        {
            final int rowsAffected = st.executeUpdate(query.query);
        }
        else
        {
            throw e;
        }
    }

}
catch (final SQLException e)
{
    //error handling
}

2 个答案:

答案 0 :(得分:1)

如果您事先不知道正在执行的查询类型,则应使用execute代替executeUpdateexecuteQuery。确保正确解释布尔返回值的含义:true表示(第一个)结果是ResultSetfalse表示(第一个)结果是更新计数。在某些数据库系统上,您可以将多个结果集与更新计数交错。你通常可以忽略忽略这种区别。

所以使用:

boolean isResultSet = statement.execute(aDynamicStatement);
if (isResultSet) {
    try (ResultSet rs = rs.getResultSet()) {
        // Process result set
    }
} else {
    int updateCount = statement.getUpdateCount();
    // do something with update count
}

如果您想要或需要处理多个结果(通常仅用于存储过程,并且仅在支持此过程的系统上),您需要将其修改为:

boolean isResultSet = statement.execute(aDynamicStatement);
while (true) {
    if (isResultSet) {
        try (ResultSet rs = rs.getResultSet()) {
            // Process result set
        }
    } else {
        int updateCount = statement.getUpdateCount();
        if (updateCount == -1) {
            // No more results, exit while loop
            break;
        }
        // do something with update count
    }
    isResultSet = statement.getMoreResults();
}

另见apidoc:

答案 1 :(得分:0)

首先,你不应该给自己这个问题。您应该设计包装器API,以便提供对executeQuery()executeUpdate()方法的单独访问。呼叫者将知道他需要哪些:不要通过使你的API太窄来丢失这些信息。