|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectgroovy.sql.Sql
public class Sql
A facade over Java's normal JDBC APIs providing greatly simplified resource management and result set handling. Under the covers the facade hides away details associated with getting connections, constructing and configuring statements, interacting with the connection, closing resources and logging errors. Special features of the facade include using closures to iterate through result sets, a special GString syntax for representing prepared statements and treating result sets like collections of maps with the normal Groovy collection methods available.
The class provides numerous extension points for overriding the facade behavior associated with the various aspects of managing the interaction with the underlying database.
Nested Class Summary | |
---|---|
protected class |
Sql.AbstractQueryCommand
|
protected class |
Sql.PreparedQueryCommand
|
protected class |
Sql.QueryCommand
|
Field Summary | |
---|---|
static OutParameter |
ARRAY
|
static OutParameter |
BIGINT
|
static OutParameter |
BINARY
|
static OutParameter |
BIT
|
static OutParameter |
BLOB
|
static OutParameter |
BOOLEAN
|
static OutParameter |
CHAR
|
static OutParameter |
CLOB
|
static OutParameter |
DATALINK
|
static OutParameter |
DATE
|
static OutParameter |
DECIMAL
|
static OutParameter |
DISTINCT
|
static OutParameter |
DOUBLE
|
static OutParameter |
FLOAT
|
static OutParameter |
INTEGER
|
static OutParameter |
JAVA_OBJECT
|
protected static Logger |
log
Hook to allow derived classes to access the log |
static OutParameter |
LONGVARBINARY
|
static OutParameter |
LONGVARCHAR
|
static OutParameter |
NULL
|
static OutParameter |
NUMERIC
|
static OutParameter |
OTHER
|
static OutParameter |
REAL
|
static OutParameter |
REF
|
static OutParameter |
SMALLINT
|
static OutParameter |
STRUCT
|
static OutParameter |
TIME
|
static OutParameter |
TIMESTAMP
|
static OutParameter |
TINYINT
|
static OutParameter |
VARBINARY
|
static OutParameter |
VARCHAR
|
Constructor Summary | |
---|---|
Sql(Connection connection)
Constructs an SQL instance using the given Connection. |
|
Sql(DataSource dataSource)
Constructs an SQL instance using the given DataSource. |
|
Sql(Sql parent)
|
Method Summary | |
---|---|
static InParameter |
ARRAY(Object value)
|
protected List<GroovyRowResult> |
asList(String sql,
ResultSet rs)
Hook to allow derived classes to override list of result collection behavior. |
protected List<GroovyRowResult> |
asList(String sql,
ResultSet rs,
Closure metaClosure)
Hook to allow derived classes to override list of result collection behavior. |
protected String |
asSql(GString gstring,
List<Object> values)
Hook to allow derived classes to override sql generation from GStrings. |
static InParameter |
BIGINT(Object value)
|
static InParameter |
BINARY(Object value)
|
static InParameter |
BIT(Object value)
|
static InParameter |
BLOB(Object value)
|
static InParameter |
BOOLEAN(Object value)
|
void |
cacheConnection(Closure closure)
Caches the connection used while the closure is active. |
void |
cacheStatements(Closure closure)
Caches every created preparedStatement in Closure closure Every cached preparedStatement is closed after closure has been called. |
int |
call(GString gstring)
Performs a stored procedure call with the given embedded parameters. |
void |
call(GString gstring,
Closure closure)
Performs a stored procedure call with the given parameters, calling the closure once with all result objects. |
int |
call(String sql)
Performs a stored procedure call. |
int |
call(String sql,
List<Object> params)
Performs a stored procedure call with the given parameters. |
void |
call(String sql,
List<Object> params,
Closure closure)
Performs a stored procedure call with the given parameters. |
static InParameter |
CHAR(Object value)
|
static InParameter |
CLOB(Object value)
|
void |
close()
If this SQL object was created with a Connection then this method closes the connection. |
protected void |
closeResources(Connection connection,
Statement statement)
An extension point allowing the behavior of resource closing to be overridden in derived classes. |
protected void |
closeResources(Connection connection,
Statement statement,
ResultSet results)
An extension point allowing derived classes to change the behavior of resource closing. |
void |
commit()
If this SQL object was created with a Connection then this method commits the connection. |
protected void |
configure(Statement statement)
Provides a hook for derived classes to be able to configure JDBC statements. |
protected Connection |
createConnection()
An extension point allowing derived classes to change the behavior of connection creation. |
protected Sql.AbstractQueryCommand |
createPreparedQueryCommand(String sql,
List<Object> queryParams)
Factory for the PreparedQueryCommand command pattern object allows subclass to supply implementations of the command class. |
protected Sql.AbstractQueryCommand |
createQueryCommand(String sql)
Factory for the QueryCommand command pattern object allows subclasses to supply implementations of the command class. |
static InParameter |
DATALINK(Object value)
|
DataSet |
dataSet(Class<?> type)
|
DataSet |
dataSet(String table)
|
static InParameter |
DATE(Object value)
|
static InParameter |
DECIMAL(Object value)
|
static InParameter |
DISTINCT(Object value)
|
static InParameter |
DOUBLE(Object value)
|
void |
eachRow(GString gstring,
Closure closure)
Performs the given SQL query calling the given Closure with each row of the result set. |
void |
eachRow(GString gstring,
Closure metaClosure,
Closure closure)
Performs the given SQL query calling the given Closure with each row of the result set. |
void |
eachRow(String sql,
Closure closure)
Performs the given SQL query calling the given Closure with each row of the result set. |
void |
eachRow(String sql,
Closure metaClosure,
Closure rowClosure)
Performs the given SQL query calling the given rowClosure with each row of the
result set. |
void |
eachRow(String sql,
List<Object> params,
Closure closure)
Performs the given SQL query calling the given Closure with each row of the result set. |
void |
eachRow(String sql,
List<Object> params,
Closure metaClosure,
Closure closure)
Performs the given SQL query calling the given Closure with each row of the result set. |
boolean |
execute(GString gstring)
Executes the given SQL with embedded expressions inside. |
boolean |
execute(String sql)
Executes the given piece of SQL. |
boolean |
execute(String sql,
List<Object> params)
Executes the given piece of SQL with parameters. |
List<List<Object>> |
executeInsert(GString gstring)
Executes the given SQL statement (typically an INSERT statement). |
List<List<Object>> |
executeInsert(String sql)
Executes the given SQL statement (typically an INSERT statement). |
List<List<Object>> |
executeInsert(String sql,
List<Object> params)
Executes the given SQL statement (typically an INSERT statement). |
protected ResultSet |
executePreparedQuery(String sql,
List<Object> params)
Hook to allow derived classes to access ResultSet returned from query. |
protected ResultSet |
executeQuery(String sql)
Hook to allow derived classes to access ResultSet returned from query. |
int |
executeUpdate(GString gstring)
Executes the given SQL update with embedded expressions inside. |
int |
executeUpdate(String sql)
Executes the given SQL update. |
int |
executeUpdate(String sql,
List<Object> params)
Executes the given SQL update with parameters. |
static ExpandedVariable |
expand(Object object)
When using GString SQL queries, allows a variable to be expanded in the Sql string rather than representing an sql parameter. |
protected int |
findWhereKeyword(String sql)
Hook to allow derived classes to override where clause sniffing. |
Object |
firstRow(GString gstring)
Performs the given SQL query and return the first row of the result set. |
Object |
firstRow(String sql)
Performs the given SQL query and return the first row of the result set. |
Object |
firstRow(String sql,
List<Object> params)
Performs the given SQL query and return the first row of the result set. |
static InParameter |
FLOAT(Object value)
|
Connection |
getConnection()
If this instance was created with a single Connection then the connection is returned. |
DataSource |
getDataSource()
|
protected List<Object> |
getParameters(GString gstring)
Hook to allow derived classes to override behavior associated with extracting params from a GString. |
int |
getResultSetConcurrency()
Gets the resultSetConcurrency for statements created using the connection. |
int |
getResultSetHoldability()
Gets the resultSetHoldability for statements created using the connection. |
int |
getResultSetType()
Gets the resultSetType for statements created using the connection. |
int |
getUpdateCount()
|
static InParameter |
in(int type,
Object value)
Create a new InParameter |
static InOutParameter |
inout(InParameter in)
Create an inout parameter using this in parameter. |
static InParameter |
INTEGER(Object value)
|
boolean |
isCacheStatements()
|
static InParameter |
JAVA_OBJECT(Object value)
|
static void |
loadDriver(String driverClassName)
Attempts to load the JDBC driver on the thread, current or system class loaders |
static InParameter |
LONGVARBINARY(Object value)
|
static InParameter |
LONGVARCHAR(Object value)
|
static Sql |
newInstance(String url)
Creates a new Sql instance given a JDBC connection URL. |
static Sql |
newInstance(String url,
Properties properties)
Creates a new Sql instance given a JDBC connection URL and some properties. |
static Sql |
newInstance(String url,
Properties properties,
String driverClassName)
Creates a new Sql instance given a JDBC connection URL, some properties and a driver class name. |
static Sql |
newInstance(String url,
String driverClassName)
Creates a new Sql instance given a JDBC connection URL and a driver class name. |
static Sql |
newInstance(String url,
String user,
String password)
Creates a new Sql instance given a JDBC connection URL, a username and a password. |
static Sql |
newInstance(String url,
String user,
String password,
String driverClassName)
Creates a new Sql instance given a JDBC connection URL, a username, a password and a driver class name. |
static InParameter |
NULL(Object value)
|
protected String |
nullify(String sql)
Hook to allow derived classes to override null handling. |
static InParameter |
NUMERIC(Object value)
|
static InParameter |
OTHER(Object value)
|
static OutParameter |
out(int type)
Create a new OutParameter |
void |
query(GString gstring,
Closure closure)
Performs the given SQL query, which should return a single ResultSet object. |
void |
query(String sql,
Closure closure)
Performs the given SQL query, which should return a single ResultSet object. |
void |
query(String sql,
List<Object> params,
Closure closure)
Performs the given SQL query, which should return a single ResultSet object. |
static InParameter |
REAL(Object value)
|
static InParameter |
REF(Object value)
|
static ResultSetOutParameter |
resultSet(int type)
Create a new ResultSetOutParameter |
void |
rollback()
If this SQL object was created with a Connection then this method rolls back the connection. |
List<GroovyRowResult> |
rows(GString gstring)
Performs the given SQL query and return the rows of the result set. |
List<GroovyRowResult> |
rows(GString gstring,
Closure metaClosure)
Performs the given SQL query and return the rows of the result set. |
List<GroovyRowResult> |
rows(String sql)
Performs the given SQL query and return the rows of the result set. |
List<GroovyRowResult> |
rows(String sql,
Closure metaClosure)
Performs the given SQL query and return the rows of the result set. |
List<GroovyRowResult> |
rows(String sql,
List<Object> params)
Performs the given SQL query and return the rows of the result set. |
List<GroovyRowResult> |
rows(String sql,
List<Object> params,
Closure metaClosure)
Performs the given SQL query and return the rows of the result set. |
void |
setCacheStatements(boolean cacheStatements)
Enables statement caching. |
protected void |
setInternalConnection(Connection conn)
Stub needed for testing. |
protected void |
setObject(PreparedStatement statement,
int i,
Object value)
Strategy method allowing derived classes to handle types differently such as for CLOBs etc. |
protected void |
setParameters(List<Object> params,
PreparedStatement statement)
Hook to allow derived classes to override behavior associated with setting params for a prepared statement. |
void |
setResultSetConcurrency(int resultSetConcurrency)
Sets the resultSetConcurrency for statements created using the connection. |
void |
setResultSetHoldability(int resultSetHoldability)
Sets the resultSetHoldability for statements created using the connection. |
void |
setResultSetType(int resultSetType)
Sets the resultSetType for statements created using the connection. |
static InParameter |
SMALLINT(Object value)
|
static InParameter |
STRUCT(Object value)
|
static InParameter |
TIME(Object value)
|
static InParameter |
TIMESTAMP(Object value)
|
static InParameter |
TINYINT(Object value)
|
static InParameter |
VARBINARY(Object value)
|
static InParameter |
VARCHAR(Object value)
|
int[] |
withBatch(Closure closure)
Performs the closure within a batch using a cached connection. |
void |
withStatement(Closure configureStatement)
Allows a closure to be passed in to configure the JDBC statements before they are executed. |
void |
withTransaction(Closure closure)
Performs the closure within a transaction using a cached connection. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected static Logger log
public static final OutParameter ARRAY
public static final OutParameter BIGINT
public static final OutParameter BINARY
public static final OutParameter BIT
public static final OutParameter BLOB
public static final OutParameter BOOLEAN
public static final OutParameter CHAR
public static final OutParameter CLOB
public static final OutParameter DATALINK
public static final OutParameter DATE
public static final OutParameter DECIMAL
public static final OutParameter DISTINCT
public static final OutParameter DOUBLE
public static final OutParameter FLOAT
public static final OutParameter INTEGER
public static final OutParameter JAVA_OBJECT
public static final OutParameter LONGVARBINARY
public static final OutParameter LONGVARCHAR
public static final OutParameter NULL
public static final OutParameter NUMERIC
public static final OutParameter OTHER
public static final OutParameter REAL
public static final OutParameter REF
public static final OutParameter SMALLINT
public static final OutParameter STRUCT
public static final OutParameter TIME
public static final OutParameter TIMESTAMP
public static final OutParameter TINYINT
public static final OutParameter VARBINARY
public static final OutParameter VARCHAR
Constructor Detail |
---|
public Sql(DataSource dataSource)
dataSource
- the DataSource to usepublic Sql(Connection connection)
Connection.close()
method.
connection
- the Connection to usepublic Sql(Sql parent)
Method Detail |
---|
public static Sql newInstance(String url) throws SQLException
url
- a database url of the form
jdbc:subprotocol:subname
SQLException
- if a database access error occurspublic static Sql newInstance(String url, Properties properties) throws SQLException
url
- a database url of the form
jdbc:subprotocol:subname
properties
- a list of arbitrary string tag/value pairs
as connection arguments; normally at least a "user" and
"password" property should be included
SQLException
- if a database access error occurspublic static Sql newInstance(String url, Properties properties, String driverClassName) throws SQLException, ClassNotFoundException
url
- a database url of the form
jdbc:subprotocol:subname
properties
- a list of arbitrary string tag/value pairs
as connection arguments; normally at least a "user" and
"password" property should be includeddriverClassName
- the fully qualified class name of the driver class
SQLException
- if a database access error occurs
ClassNotFoundException
- if the class cannot be found or loadedpublic static Sql newInstance(String url, String user, String password) throws SQLException
url
- a database url of the form
jdbc:subprotocol:subname
user
- the database user on whose behalf the connection
is being madepassword
- the user's password
SQLException
- if a database access error occurspublic static Sql newInstance(String url, String user, String password, String driverClassName) throws SQLException, ClassNotFoundException
url
- a database url of the form
jdbc:subprotocol:subname
user
- the database user on whose behalf the connection
is being madepassword
- the user's passworddriverClassName
- the fully qualified class name of the driver class
SQLException
- if a database access error occurs
ClassNotFoundException
- if the class cannot be found or loadedpublic static Sql newInstance(String url, String driverClassName) throws SQLException, ClassNotFoundException
url
- a database url of the form
jdbc:subprotocol:subname
driverClassName
- the fully qualified class name of the driver class
SQLException
- if a database access error occurs
ClassNotFoundException
- if the class cannot be found or loadedpublic int getResultSetType()
public void setResultSetType(int resultSetType)
resultSetType
- one of the following ResultSet
constants:
ResultSet.TYPE_FORWARD_ONLY
,
ResultSet.TYPE_SCROLL_INSENSITIVE
, or
ResultSet.TYPE_SCROLL_SENSITIVE
public int getResultSetConcurrency()
public void setResultSetConcurrency(int resultSetConcurrency)
resultSetConcurrency
- one of the following ResultSet
constants:
ResultSet.CONCUR_READ_ONLY
or
ResultSet.CONCUR_UPDATABLE
public int getResultSetHoldability()
public void setResultSetHoldability(int resultSetHoldability)
resultSetHoldability
- one of the following ResultSet
constants:
ResultSet.HOLD_CURSORS_OVER_COMMIT
or
ResultSet.CLOSE_CURSORS_AT_COMMIT
public static void loadDriver(String driverClassName) throws ClassNotFoundException
driverClassName
- the fully qualified class name of the driver class
ClassNotFoundException
- if the class cannot be found or loadedpublic static InParameter ARRAY(Object value)
public static InParameter BIGINT(Object value)
public static InParameter BINARY(Object value)
public static InParameter BIT(Object value)
public static InParameter BLOB(Object value)
public static InParameter BOOLEAN(Object value)
public static InParameter CHAR(Object value)
public static InParameter CLOB(Object value)
public static InParameter DATALINK(Object value)
public static InParameter DATE(Object value)
public static InParameter DECIMAL(Object value)
public static InParameter DISTINCT(Object value)
public static InParameter DOUBLE(Object value)
public static InParameter FLOAT(Object value)
public static InParameter INTEGER(Object value)
public static InParameter JAVA_OBJECT(Object value)
public static InParameter LONGVARBINARY(Object value)
public static InParameter LONGVARCHAR(Object value)
public static InParameter NULL(Object value)
public static InParameter NUMERIC(Object value)
public static InParameter OTHER(Object value)
public static InParameter REAL(Object value)
public static InParameter REF(Object value)
public static InParameter SMALLINT(Object value)
public static InParameter STRUCT(Object value)
public static InParameter TIME(Object value)
public static InParameter TIMESTAMP(Object value)
public static InParameter TINYINT(Object value)
public static InParameter VARBINARY(Object value)
public static InParameter VARCHAR(Object value)
public static InParameter in(int type, Object value)
type
- the JDBC data typevalue
- the object value
public static OutParameter out(int type)
type
- the JDBC data type.
public static InOutParameter inout(InParameter in)
in
- the InParameter of interest
public static ResultSetOutParameter resultSet(int type)
type
- the JDBC data type.
public static ExpandedVariable expand(Object object)
def fieldName = 'firstname' def fieldOp = Sql.expand('like') def fieldVal = '%a%' sql.query "select * from PERSON where ${Sql.expand(fieldName)} $fieldOp ${fieldVal}", { ResultSet rs -> while (rs.next()) println rs.getString('firstname') } // query will be 'select * from PERSON where firstname like ?' // params will be [fieldVal]
object
- the object of interest
expand(Object)
public DataSet dataSet(String table)
public DataSet dataSet(Class<?> type)
public void query(String sql, Closure closure) throws SQLException
ResultSet
object. The given closure is called
with the ResultSet
as its argument.
Example usages:
sql.query("select * from PERSON where firstname like 'S%'") { ResultSet rs -> while (rs.next()) println rs.getString('firstname') + ' ' + rs.getString(3) } sql.query("call get_people_places()") { ResultSet rs -> while (rs.next()) println rs.toRowResult().firstname }All resources including the ResultSet are closed automatically after the closure is called.
sql
- the sql statementclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurspublic void query(String sql, List<Object> params, Closure closure) throws SQLException
ResultSet
object. The given closure is called
with the ResultSet
as its argument.
The query may contain placeholder question marks which match the given list of parameters.
Example usage:
sql.query('select * from PERSON where lastname like ?', ['%a%']) { ResultSet rs -> while (rs.next()) println rs.getString('lastname') }All resources including the ResultSet are closed automatically after the closure is called.
sql
- the sql statementparams
- a list of parametersclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurspublic void query(GString gstring, Closure closure) throws SQLException
ResultSet
object. The given closure is called
with the ResultSet
as its argument.
The query may contain GString expressions.
Example usage:
def location = 25 sql.query "select * from PERSON where location_id < $location", { ResultSet rs -> while (rs.next()) println rs.getString('firstname') }All resources including the ResultSet are closed automatically after the closure is called.
gstring
- a GString containing the SQL query with embedded paramsclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occursexpand(Object)
public void eachRow(String sql, Closure closure) throws SQLException
GroovyRowResult
which is a Map
that also supports accessing the fields using ordinal index values.
Example usages:
sql.eachRow("select * from PERSON where firstname like 'S%'") { row -> println "$row.firstname ${row[2]}}" } sql.eachRow "call my_stored_proc_returning_resultset()", { println it.firstname }
sql
- the sql statementclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurspublic void eachRow(String sql, Closure metaClosure, Closure rowClosure) throws SQLException
rowClosure
with each row of the
result set. The row will be a GroovyRowResult
which is a Map
that also supports accessing the fields using ordinal index values.
In addition, the metaClosure
will be called once passing in the
ResultSetMetaData
as argument.
Example usage:
def printColNames = { meta -> (1..meta.columnCount).each { print meta.getColumnLabel(it).padRight(20) } println() } def printRow = { row -> row.toRowResult().values().each{ print it.toString().padRight(20) } println() } sql.eachRow("select * from PERSON", printColNames, printRow)
sql
- the sql statementmetaClosure
- called for meta data (only once after sql execution)rowClosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurspublic void eachRow(String sql, List<Object> params, Closure metaClosure, Closure closure) throws SQLException
GroovyRowResult
which is a Map
that also supports accessing the fields using ordinal index values.
In addition, the metaClosure
will be called once passing in the
ResultSetMetaData
as argument.
The query may contain placeholder question marks which match the given list of parameters.
Example usage:
def printColNames = { meta -> (1..meta.columnCount).each { print meta.getColumnLabel(it).padRight(20) } println() } def printRow = { row -> row.toRowResult().values().each{ print it.toString().padRight(20) } println() } sql.eachRow("select * from PERSON where lastname like ?", ['%a%'], printColNames, printRow)
sql
- the sql statementparams
- a list of parametersmetaClosure
- called for meta data (only once after sql execution)closure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurspublic void eachRow(String sql, List<Object> params, Closure closure) throws SQLException
GroovyRowResult
which is a Map
that also supports accessing the fields using ordinal index values.
The query may contain placeholder question marks which match the given list of parameters.
Example usage:
sql.eachRow("select * from PERSON where lastname like ?", ['%a%']) { row -> println "${row[1]} $row.lastname" }
sql
- the sql statementparams
- a list of parametersclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurspublic void eachRow(GString gstring, Closure metaClosure, Closure closure) throws SQLException
GroovyRowResult
which is a Map
that also supports accessing the fields using ordinal index values.
In addition, the metaClosure
will be called once passing in the
ResultSetMetaData
as argument.
The query may contain GString expressions.
Example usage:
def location = 25 def printColNames = { meta -> (1..meta.columnCount).each { print meta.getColumnLabel(it).padRight(20) } println() } def printRow = { row -> row.toRowResult().values().each{ print it.toString().padRight(20) } println() } sql.eachRow("select * from PERSON where location_id < $location", printColNames, printRow)
gstring
- a GString containing the SQL query with embedded paramsmetaClosure
- called for meta data (only once after sql execution)closure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occursexpand(Object)
public void eachRow(GString gstring, Closure closure) throws SQLException
GroovyRowResult
which is a Map
that also supports accessing the fields using ordinal index values.
The query may contain GString expressions.
Example usage:
def location = 25 sql.eachRow("select * from PERSON where location_id < $location") { row -> println row.firstname }
gstring
- a GString containing the SQL query with embedded paramsclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occursexpand(Object)
public List<GroovyRowResult> rows(String sql) throws SQLException
def ans = sql.rows("select * from PERSON where firstname like 'S%'") println "Found ${ans.size()} rows"
sql
- the SQL statement
SQLException
- if a database access error occurspublic List<GroovyRowResult> rows(String sql, Closure metaClosure) throws SQLException
metaClosure
will be called once passing in the
ResultSetMetaData
as argument.
Example usage:
def printNumCols = { meta -> println "Found $meta.columnCount columns" } def ans = sql.rows("select * from PERSON", printNumCols) println "Found ${ans.size()} rows"
sql
- the SQL statementmetaClosure
- called with meta data of the ResultSet
SQLException
- if a database access error occurspublic List<GroovyRowResult> rows(String sql, List<Object> params) throws SQLException
def ans = sql.rows("select * from PERSON where lastname like ?", ['%a%']) println "Found ${ans.size()} rows"
sql
- the SQL statementparams
- a list of parameters
SQLException
- if a database access error occurspublic List<GroovyRowResult> rows(String sql, List<Object> params, Closure metaClosure) throws SQLException
metaClosure
will be called once passing in the
ResultSetMetaData
as argument.
The query may contain placeholder question marks which match the given list of parameters.
Example usage:
def printNumCols = { meta -> println "Found $meta.columnCount columns" } def ans = sql.rows("select * from PERSON where lastname like ?", ['%a%'], printNumCols) println "Found ${ans.size()} rows"
sql
- the SQL statementparams
- a list of parametersmetaClosure
- called for meta data (only once after sql execution)
SQLException
- if a database access error occurspublic List<GroovyRowResult> rows(GString gstring) throws SQLException
def location = 25 def ans = sql.rows("select * from PERSON where location_id < $location") println "Found ${ans.size()} rows"
gstring
- a GString containing the SQL query with embedded params
SQLException
- if a database access error occursexpand(Object)
public List<GroovyRowResult> rows(GString gstring, Closure metaClosure) throws SQLException
metaClosure
will be called once passing in the
ResultSetMetaData
as argument.
The query may contain GString expressions.
Example usage:
def location = 25 def printNumCols = { meta -> println "Found $meta.columnCount columns" } def ans = sql.rows("select * from PERSON where location_id < $location", printNumCols) println "Found ${ans.size()} rows"
gstring
- a GString containing the SQL query with embedded paramsmetaClosure
- called with meta data of the ResultSet
SQLException
- if a database access error occursexpand(Object)
public Object firstRow(String sql) throws SQLException
def ans = sql.firstRow("select * from PERSON where firstname like 'S%'") println ans.firstname
sql
- the SQL statement
null
if no row is found
SQLException
- if a database access error occurspublic Object firstRow(GString gstring) throws SQLException
def location = 25 def ans = sql.firstRow("select * from PERSON where location_id < $location") println ans.firstname
gstring
- a GString containing the SQL query with embedded params
null
if no row is found
SQLException
- if a database access error occursexpand(Object)
public Object firstRow(String sql, List<Object> params) throws SQLException
def ans = sql.firstRow("select * from PERSON where lastname like ?", ['%a%']) println ans.firstnameIf your database returns scalar functions as ResultSets, you can also use firstRow to gain access to stored procedure results, e.g. using hsqldb 1.9 RC4:
sql.execute """ create function FullName(p_firstname VARCHAR(40)) returns VARCHAR(80) BEGIN atomic DECLARE ans VARCHAR(80); SET ans = (SELECT firstname || ' ' || lastname FROM PERSON WHERE firstname = p_firstname); RETURN ans; END """ assert sql.firstRow("{call FullName(?)}", ['Sam'])[0] == 'Sam Pullara'
sql
- the SQL statementparams
- a list of parameters
null
if no row is found
SQLException
- if a database access error occurspublic boolean execute(String sql) throws SQLException
sql.execute "drop table if exists PERSON" sql.execute """ create table PERSON ( id integer not null, firstname varchar(100), lastname varchar(100), location_id integer ) """ sql.execute """ insert into PERSON (id, firstname, lastname, location_id) values (4, 'Paul', 'King', 40) """ assert sql.updateCount == 1
sql
- the SQL to execute
true
if the first result is a ResultSet
object; false
if it is an update count or there are
no results
SQLException
- if a database access error occurspublic boolean execute(String sql, List<Object> params) throws SQLException
sql.execute """ insert into PERSON (id, firstname, lastname, location_id) values (?, ?, ?, ?) """, [1, "Guillaume", "Laforge", 10] assert sql.updateCount == 1
sql
- the SQL statementparams
- a list of parameters
true
if the first result is a ResultSet
object; false
if it is an update count or there are
no results
SQLException
- if a database access error occurspublic boolean execute(GString gstring) throws SQLException
def scott = [firstname: "Scott", lastname: "Davis", id: 5, location_id: 50] sql.execute """ insert into PERSON (id, firstname, lastname, location_id) values ($scott.id, $scott.firstname, $scott.lastname, $scott.location_id) """ assert sql.updateCount == 1
gstring
- a GString containing the SQL query with embedded params
true
if the first result is a ResultSet
object; false
if it is an update count or there are
no results
SQLException
- if a database access error occursexpand(Object)
public List<List<Object>> executeInsert(String sql) throws SQLException
executeInsert(GString)
for more details.
sql
- The SQL statement to execute
SQLException
- if a database access error occurspublic List<List<Object>> executeInsert(String sql, List<Object> params) throws SQLException
executeInsert(GString)
for more details.
sql
- The SQL statement to executeparams
- The parameter values that will be substituted
into the SQL statement's parameter slots
SQLException
- if a database access error occurspublic List<List<Object>> executeInsert(GString gstring) throws SQLException
Executes the given SQL statement (typically an INSERT statement). Use this variant when you want to receive the values of any auto-generated columns, such as an autoincrement ID field. The query may contain GString expressions.
Generated key values can be accessed using
array notation. For example, to return the second auto-generated
column value of the third row, use keys[3][1]
. The
method is designed to be used with SQL INSERT statements, but is
not limited to them.
The standard use for this method is when a table has an autoincrement ID column and you want to know what the ID is for a newly inserted row. In this example, we insert a single row into a table in which the first column contains the autoincrement ID:
def sql = Sql.newInstance("jdbc:mysql://localhost:3306/groovy", "user", "password", "com.mysql.jdbc.Driver") def keys = sql.executeInsert("insert into test_table (INT_DATA, STRING_DATA) " + "VALUES (1, 'Key Largo')") def id = keys[0][0] // 'id' now contains the value of the new row's ID column. // It can be used to update an object representation's // id attribute for example. ...
gstring
- a GString containing the SQL query with embedded params
SQLException
- if a database access error occursexpand(Object)
public int executeUpdate(String sql) throws SQLException
sql
- the SQL to execute
SQLException
- if a database access error occurspublic int executeUpdate(String sql, List<Object> params) throws SQLException
sql
- the SQL statementparams
- a list of parameters
SQLException
- if a database access error occurspublic int executeUpdate(GString gstring) throws SQLException
gstring
- a GString containing the SQL query with embedded params
SQLException
- if a database access error occursexpand(Object)
public int call(String sql) throws Exception
sql.execute """ CREATE PROCEDURE HouseSwap(_first1 VARCHAR(50), _first2 VARCHAR(50)) BEGIN DECLARE _loc1 INT; DECLARE _loc2 INT; SELECT location_id into _loc1 FROM PERSON where firstname = _first1; SELECT location_id into _loc2 FROM PERSON where firstname = _first2; UPDATE PERSON set location_id = case firstname when _first1 then _loc2 when _first2 then _loc1 end where (firstname = _first1 OR firstname = _first2); END """then you can invoke the procedure as follows:
def rowsChanged = sql.call("{call HouseSwap('Guillaume', 'Paul')}") assert rowsChanged == 2
sql
- the SQL statement
SQLException
- if a database access error occurs
Exception
public int call(GString gstring) throws Exception
call(String)
for more details about
creating a HouseSwap(IN name1, IN name2)
stored procedure.
Once created, it can be called like this:
def p1 = 'Paul' def p2 = 'Guillaume' def rowsChanged = sql.call("{call HouseSwap($p1, $p2)}") assert rowsChanged == 2
gstring
- a GString containing the SQL query with embedded params
SQLException
- if a database access error occurs
Exception
expand(Object)
,
call(String)
public int call(String sql, List<Object> params) throws Exception
call(String)
for more details about
creating a HouseSwap(IN name1, IN name2)
stored procedure.
Once created, it can be called like this:
def rowsChanged = sql.call("{call HouseSwap(?, ?)}", ['Guillaume', 'Paul']) assert rowsChanged == 2
sql
- the SQL statementparams
- a list of parameters
SQLException
- if a database access error occurs
Exception
call(String)
public void call(String sql, List<Object> params, Closure closure) throws Exception
// Tested with MySql 5.0.75 sql.execute """ CREATE PROCEDURE Hemisphere( IN p_firstname VARCHAR(50), IN p_lastname VARCHAR(50), OUT ans VARCHAR(50)) BEGIN DECLARE loc INT; SELECT location_id into loc FROM PERSON where firstname = p_firstname and lastname = p_lastname; CASE loc WHEN 40 THEN SET ans = 'Southern Hemisphere'; ELSE SET ans = 'Northern Hemisphere'; END CASE; END; """we can now call the stored procedure as follows:
sql.call '{call Hemisphere(?, ?, ?)}', ['Guillaume', 'Laforge', Sql.VARCHAR], { dwells -> println dwells }which will output '
Northern Hemisphere
'.
We can also access stored functions with scalar return values where the return value
will be treated as an OUT parameter. Here are examples for various databases for
creating such a procedure:
// Tested with MySql 5.0.75 sql.execute """ create function FullName(p_firstname VARCHAR(40)) returns VARCHAR(80) begin declare ans VARCHAR(80); SELECT CONCAT(firstname, ' ', lastname) INTO ans FROM PERSON WHERE firstname = p_firstname; return ans; end """ // Tested with MS SQLServer Express 2008 sql.execute """and here is how you access the stored function for all databases:create function FullName(@firstname VARCHAR(40)) returns VARCHAR(80)
begin declare@ans
VARCHAR(80)SET @ans = (SELECT firstname + ' ' + lastname FROM PERSON WHERE firstname = @firstname)
return@ans
end """ // Tested with Oracle XE 10g sql.execute """ create function FullName(p_firstname VARCHAR) return VARCHAR is ans VARCHAR(80); begin SELECT CONCAT(CONCAT(firstname, ' '), lastname) INTO ans FROM PERSON WHERE firstname = p_firstname; return ans; end; """
sql.call("{? = call FullName(?)}", [Sql.VARCHAR, 'Sam']) { name -> assert name == 'Sam Pullara' }
sql
- the sql statementparams
- a list of parametersclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurs
Exception
public void call(GString gstring, Closure closure) throws Exception
call(String, List, Closure)
for more details about
creating a Hemisphere(IN first, IN last, OUT dwells)
stored procedure.
Once created, it can be called like this:
def first = 'Scott' def last = 'Davis' sql.call "{call Hemisphere($first, $last, ${Sql.VARCHAR})}", { dwells -> println dwells }As another example, see
call(String, List, Closure)
for more details about
creating a FullName(IN first)
stored function.
Once created, it can be called like this:
def first = 'Sam' sql.call("{$Sql.VARCHAR = call FullName($first)}") { name -> assert name == 'Sam Pullara' }
gstring
- a GString containing the SQL query with embedded paramsclosure
- called for each row with a GroovyResultSet
SQLException
- if a database access error occurs
Exception
call(String, List, Closure)
,
expand(Object)
public void close() throws SQLException
SQLException
- if a database access error occurspublic DataSource getDataSource()
public void commit() throws SQLException
SQLException
- if a database access error occurspublic void rollback() throws SQLException
SQLException
- if a database access error occurspublic int getUpdateCount()
public Connection getConnection()
public void withStatement(Closure configureStatement)
sql.withStatement{ stmt -> stmt.maxRows == 10 } def firstTenRows = sql.rows("select * from table")
configureStatement
- the closurepublic void setCacheStatements(boolean cacheStatements)
cacheStatements
- the new valuepublic boolean isCacheStatements()
public void cacheConnection(Closure closure) throws SQLException
closure
- the given closure
SQLException
- if a database error occurspublic void withTransaction(Closure closure) throws SQLException
closure
- the given closure
SQLException
- if a database error occurspublic int[] withBatch(Closure closure) throws SQLException
def updateCounts = sql.withBatch { stmt -> stmt.addBatch("insert into TABLENAME ...") stmt.addBatch("insert into TABLENAME ...") stmt.addBatch("insert into TABLENAME ...") }
closure
- the closure containing batch and optionally other statements
SQLException
- if a database access error occurs,
or this method is called on a closed Statement
, or the
driver does not support batch statements. Throws BatchUpdateException
(a subclass of SQLException
) if one of the commands sent to the
database fails to execute properly or attempts to return a result set.public void cacheStatements(Closure closure) throws SQLException
closure
- the given closure
SQLException
- if a database error occurssetCacheStatements(boolean)
protected final ResultSet executeQuery(String sql) throws SQLException
sql
- query to execute
SQLException
- if a database error occursprotected final ResultSet executePreparedQuery(String sql, List<Object> params) throws SQLException
sql
- query to executeparams
- parameters matching question mark placeholders in the query
SQLException
- if a database error occursprotected List<GroovyRowResult> asList(String sql, ResultSet rs) throws SQLException
sql
- query to executers
- the ResultSet to process
SQLException
- if a database error occursprotected List<GroovyRowResult> asList(String sql, ResultSet rs, Closure metaClosure) throws SQLException
sql
- query to executers
- the ResultSet to processmetaClosure
- called for meta data (only once after sql execution)
SQLException
- if a database error occursprotected String asSql(GString gstring, List<Object> values)
gstring
- a GString containing the SQL query with embedded paramsvalues
- the values to embed
expand(Object)
protected String nullify(String sql)
sql
- the SQL statement
protected int findWhereKeyword(String sql)
sql
- the SQL statement
protected List<Object> getParameters(GString gstring)
gstring
- a GString containing the SQL query with embedded params
expand(Object)
protected void setParameters(List<Object> params, PreparedStatement statement) throws SQLException
setObject
.
params
- the parameters to appendstatement
- the statement
SQLException
- if a database access error occursprotected void setObject(PreparedStatement statement, int i, Object value) throws SQLException
statement
- the statement of interesti
- the index of the object of interestvalue
- the new object value
SQLException
- if a database access error occursprotected Connection createConnection() throws SQLException
SQLException
- if a SQL error occursprotected void closeResources(Connection connection, Statement statement, ResultSet results)
connection
- the connection to closestatement
- the statement to closeresults
- the results to closeprotected void closeResources(Connection connection, Statement statement)
connection
- the connection to closestatement
- the statement to closeprotected void configure(Statement statement)
statement
- the statement to configureprotected Sql.AbstractQueryCommand createQueryCommand(String sql)
AbstractQueryCommand q = createQueryCommand("update TABLE set count = 0) where count is null"); try { ResultSet rs = q.execute(); return asList(rs); } finally { q.closeResources(); }
sql
- statement to be executed
protected Sql.AbstractQueryCommand createPreparedQueryCommand(String sql, List<Object> queryParams)
sql
- statement to be executed, including optional parameter placeholders (?)queryParams
- List of parameter values corresponding to parameter placeholders
createQueryCommand(String)
protected void setInternalConnection(Connection conn)
conn
- the connection that is about to be used by a command
|
Copyright © 2003-2009 The Codehaus. All rights reserved. | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |