public class SqlStatement extends Object
The goal of SqlStatement is to make tracing, error-handling and
resource-management easier. None of the methods throws a SQLException; if an error occurs in one of the methods, the
method wraps the exception in a RuntimeException
describing the high-level operation, logs that the operation
failed, and throws that RuntimeException.
If methods succeed, the method generates lifecycle logging such as the elapsed time and number of rows fetched.
There are a few obligations on the caller. The caller must:
handle(Throwable)
method if one of the contained
objects (say the ResultSet
) gives an error;
close()
method if all operations complete
successfully.
rowCount
field each time a row is fetched.
The close()
method is idempotent. You are welcome to call it
more than once.
SqlStatement is not thread-safe.
Modifier and Type | Class and Description |
---|---|
static interface |
SqlStatement.Accessor |
static class |
SqlStatement.MyDelegatingInvocationHandler
Reflectively implements the
ResultSet interface by routing method calls to the result set inside a SqlStatement . |
static class |
SqlStatement.StatementLocus |
static class |
SqlStatement.Type
The approximate JDBC type of a column.
|
Modifier and Type | Field and Description |
---|---|
int |
rowCount |
Constructor and Description |
---|
SqlStatement(DataSource dataSource,
String sql,
List<SqlStatement.Type> types,
int maxRows,
int firstRowOrdinal,
Locus locus,
int resultSetType,
int resultSetConcurrency,
Util.Functor1<Void,Statement> callback)
Creates a SqlStatement.
|
Modifier and Type | Method and Description |
---|---|
void |
close()
Closes all resources (statement, result set) held by this SqlStatement.
|
protected Dialect |
createDialect()
For tests
|
void |
execute()
Executes the current statement, and handles any SQLException.
|
List<SqlStatement.Accessor> |
getAccessors() |
protected Dialect |
getDialect(RolapSchema schema)
Retrieves dialect from schema or attempts to create it in case it is null
|
ResultSet |
getResultSet() |
ResultSet |
getWrappedResultSet()
Returns the result set in a proxy which automatically closes this SqlStatement (and hence also the statement and
result set) when the result set is closed.
|
List<SqlStatement.Type> |
guessTypes() |
RuntimeException |
handle(Throwable e)
Handles an exception thrown from the ResultSet, implicitly calls
close() , and returns an exception which
includes the full stack, including a description of the high-level operation. |
public SqlStatement(DataSource dataSource, String sql, List<SqlStatement.Type> types, int maxRows, int firstRowOrdinal, Locus locus, int resultSetType, int resultSetConcurrency, Util.Functor1<Void,Statement> callback)
dataSource
- Data sourcesql
- SQLtypes
- Suggested types of columns, or null; if present, must have one element for each SQL
column; each not-null entry overrides deduced JDBC type of the columnmaxRows
- Maximum rows; <= 0 means no maximumfirstRowOrdinal
- Ordinal of first row to skip to; <= 0 do not skiplocus
- Execution context of this statementresultSetType
- Result set typeresultSetConcurrency
- Result set concurrencypublic void execute()
public void close()
If any of them fails, wraps them in a
RuntimeException
describing the high-level operation which this statement was performing. No further
error-handling is required to produce a descriptive stack trace, unless you want to absorb the error.
This method is idempotent.
public ResultSet getResultSet()
public RuntimeException handle(Throwable e)
close()
, and returns an exception which
includes the full stack, including a description of the high-level operation.e
- Exceptionpublic List<SqlStatement.Type> guessTypes() throws SQLException
SQLException
protected Dialect getDialect(RolapSchema schema)
schema
- rolap schemaprotected Dialect createDialect()
public List<SqlStatement.Accessor> getAccessors()
public ResultSet getWrappedResultSet()
This helps to prevent connection leaks. The caller still has to remember to call ResultSet.close(), of course.
Copyright © 2020 Hitachi Vantara. All rights reserved.