La clase Statement permite crear objetos que permiten contener sentencias SQL y obtener posteriormente los datos resultantes de su ejecución a través de la clase ResultSet. Para crear un objeto Statement, hay que llamar al método createStatement() del objeto Connection obtenido anteriormente con el método DriverManager.getConnection().

Statement sentenciaSQL = conexion.createStatement();

Una vez creado el objeto Statement, se puede ejecutar una consulta SELECT llamando al método executeQuery(String sql) indicando en el parámetro String sql la sentencia SQL que se quiere usar.

ResultSet executeQuery(String sql) throws SQLException

La llamada a ese método retorna un objeto ResultSet que contendrá los datos obtenidos de la consulta realizada.

ResultSet resultados = sentenciaSQL.executeQuery("SELECT * FROM tablaEjemplo");

Si en vez de querer realizar una consulta SQL, se quiere hacer una actualización de datos (INSERT, UPDATE, DELETE) o una operación sobre las tablas (CREATE TABLE, DROP TABLE, etc) hay que usar el método executeUpdate(String sql) indicando en el parámetro la cadena de caracteres que contiene la orden SQL a realizar. La llamada a este método retorna el número de filas afectadas por la actualización.

int executeUpdate(String sql) throws SQLException

Consulta de datos

La clase ResultSet proporciona métodos para obtener y manipular los resultados de una consulta SQL. JDBC retorna los resultados de una consulta en un objeto ResultSet, por tanto, es necesario declarar una variable de la clase ResultSet en la que almacenar los resultados. Por ejemplo:

Statement sentenciaSQL = conexion.createStatement();
ResultSet resultados = sentenciaSQL.executeQuery("SELECT campo1, campo2, campo3 FROM nombreTabla");

La variable resultados, que hace referencia a un objeto ResultSet, contiene todas las filas resultantes de la consulta SQL realizada. Los objetos ResultSet mantienen un cursor que apunta a una determinada fila que será de la que se podrá obtener los datos. Cuando se crea el objeto ResultSet, el cursor se posiciona antes de la primera fila (no en la primera fila). Para obtener el contenido de una fila del ResultSet se pueden usar los siguientes métodos:

  • next(): Posiciona el cursor en la línea siguiente a partir de la línea actual. Retorna true si el cursor se ha podido colocar en una fila y false si se ha posicionado después de la última fila.
  • previous(): Posiciona el cursor en la línea anterior respecto a la actual. Retorna true si el cursor se ha podido colocar en una fila y false si se ha posicionado antes de la primera fila.
  • first(): Posiciona el cursor en la primera línea contenida en el objeto ResultSet. Retorna true si el cursor se ha podido colocar en la primera fila y false si el objeto ResultSet no contiene ninguna fila.
  • last(): Posiciona el cursor en la útima línea contenida en el objeto ResultSet. Retorna true si el cursor se ha podido colocar en la última fila y false si el objeto ResultSet no contiene ninguna fila.
boolean next() throws SQLException
boolean previous() throws SQLException
boolean first() throws SQLException
boolean last() throws SQLException

Debido a que el cursor es inicialmente situado antes de la primera fila, la primera la llamada al método next mueve el cursor a la primera fila y hace que sea la fila actual. Las llamadas sucesivas al método next, van moviendo el cursor hacia abajo, una fila cada vez.

Uso de métodos get

La clase ResultSet tiene declarados una serie de métodos get para obtener los valores de las columnas de la fila actual. Es posible obtener los valores usando como parámetro el número de la columna (empezando en 1) o bien su nombre. Normalmente es más eficiente usar el número de columna. El nombre de las columnas no distingue entre mayúsculas y minúsculas.

String getString(int columnIndex) throws SQLException
String getString(String columnLabel) throws SQLException

El método getXXX del tipo apropiado (por ejemplo: getString, getInt, getDouble, etc), obtiene el valor de una determinada columna. Por ejemplo, si la una columna contiene un valor SQL de tipo VARCHAR, el método para obtener su valor es getString. Si otra columna almacena un valor SQL de tipo INT, el método para recuperar su contenido es getInt.

El siguiente trozo de código accede a los valores de cada fila y muestra una línea con un nombre de producto seguido de tres espacios y la cantidad correspondiente. Cada vez que se llama al método next, la siguiente fila se convierte en la fila actual, y el bucle continúa hasta que no haya más filas en el objeto ResultSet.

Statement stmt = conexion.createStatement();
ResultSet rsProductos = stmt.executeQuery(
"SELECT NombreProducto, Cantidad FROM Productos");
while (rsProductos.next()) {
String nombre = rsProductos.getString("NombreProducto");
int cant = rsProductos.getInt("Cantidad");
System.out.println(nombre + " " + cant);
}

Aunque el método getString es recomendado para recuperar datos de los tipos VARCHAR y CHAR, es capaz de obtener datos de cualquiera de los tipos básicos SQL. Si por ejemplo, se usa para obtener valores numéricos, getString convierte el valor numérico a un objeto String de Java. Por tanto, si hay que hacer alguna operación numérica con ese dato habrá que volver a convertirlo al tipo de dato numérico de Java.

Actualización de datos

Ya se ha comentado anteriormente que para ejecutar una sentencia SQL correspondiente a una operación que no sea una consulta, debe hacerse una llamada al método executeUpdate(String sql) del objeto Statement en lugar del método executeQuery(String sql) utilizado para las consultas.

Por ejemplo, para realizar la creación de una tabla con la orden CREATE TABLE de SQL:

stmt.executeUpdate("CREATE TABLE Productos "+
"( Cod_Producto VARCHAR(7), " +
"NombreProducto VARCHAR(30) )" );

Este mismo método es el que debe ser utilizado para cualquier otra operación sobre las tablas o para operaciones sobre los datos que contienen. Por ejemplo, para insertar datos en la tabla anterior:

stmt.executeUpdate("INSERT INTO Productos2 VALUES " +
"( 'DSN2873', 'PRIMER PRODUCTO' )," +
"( 'EBJ2943', 'SEGUNDO PRODUCTO' )," +
"( 'BDF9322', 'TERCER PRODUCTO' ) ");

Hay que observar que siempre que se haga referencia a un valor de tipo texto, es obligatorio indicarlo entre comillas simples. Los valores numéricos también pueden encerrarse entre comillas simples, obteniendo el mismo resultado que si no tuvieran las comillas. Si el nombre de algún campo de la tabla contiene espacios, hay que reflejar su nombre en las sentencias SQL encerrado también entre comillas simples.