Programación Java: JDBC y Swing
Por Francisco Blaco
()
Información de este libro electrónico
Relacionado con Programación Java
Libros electrónicos relacionados
Desarrollo de aplicaciones mediante el Framework de spring.: PROGRAMACIÓN INFORMÁTICA/DESARROLLO DE SOFTWARE Calificación: 2 de 5 estrellas2/5Java 2: Manual de Usuario y Tutorial. 5ª Edición Calificación: 0 de 5 estrellas0 calificacionesDesarrollo Web en Java Calificación: 3 de 5 estrellas3/5Aprende a Desarrollar con Spring Framework Calificación: 3 de 5 estrellas3/5JEE 7 a Fondo: Diseño y desarrollo de aplicaciones Java Enterprise Calificación: 0 de 5 estrellas0 calificacionesProgramación Orientada a Objetos en JAVA Calificación: 0 de 5 estrellas0 calificacionesConexión SQL SERVER & C# (Manual para principiantes) Calificación: 1 de 5 estrellas1/5Aprende a Programar en ASP .NET y C# Calificación: 0 de 5 estrellas0 calificacionesAngularJS: Conviértete en el profesional que las compañías de software necesitan. Calificación: 4 de 5 estrellas4/5Aprender Javascript Avanzado con 100 ejercicios prácticos Calificación: 5 de 5 estrellas5/5Seguridad en aplicaciones Web Java: SEGURIDAD INFORMÁTICA Calificación: 5 de 5 estrellas5/5Desarrollo web en entorno servidor (GRADO SUPERIOR): Gráficos y diseño web Calificación: 5 de 5 estrellas5/5OCA Java 8 Programmer I Teoría y Práctica Para Certificación Calificación: 0 de 5 estrellas0 calificacionesCurso de Programación con Java Calificación: 4 de 5 estrellas4/5Programación en C++ Calificación: 2 de 5 estrellas2/5Aprende a Programar con Java Calificación: 4 de 5 estrellas4/5Aprende a Programar ASP .NET y C# - Segunda Edición Calificación: 0 de 5 estrellas0 calificacionesBackbone JS Calificación: 0 de 5 estrellas0 calificacionesAprende a Programar para Android Calificación: 5 de 5 estrellas5/5Curso de Programación con Java - 2ª Edición Calificación: 5 de 5 estrellas5/5Programación en C# para Principiantes Calificación: 0 de 5 estrellas0 calificacionesAprende a programar en C# Calificación: 5 de 5 estrellas5/5Backbone JS. JavaScript Framework. 2ª Edición Calificación: 0 de 5 estrellas0 calificacionesSQL Server 2014 Soluciones prácticas de administración: Software para bases de datos Calificación: 5 de 5 estrellas5/5JavaScript: Guía completa Calificación: 4 de 5 estrellas4/5Integración de Componentes Software en Páginas Web (MF0951_2): Ingeniería del Software Calificación: 0 de 5 estrellas0 calificacionesFundamentos de Programación y Bases de Datos Calificación: 0 de 5 estrellas0 calificacionesFundamentos de Programación y Bases de Datos: 2ª Edición Calificación: 0 de 5 estrellas0 calificacionesAprenda a Programar con Lazarus: PROGRAMACIÓN INFORMÁTICA/DESARROLLO DE SOFTWARE Calificación: 5 de 5 estrellas5/5Diseño de arquitecturas .NET orientadas a microservicios Calificación: 3 de 5 estrellas3/5
Programación para usted
Aprende a programar: Crea tu propio sitio web Calificación: 4 de 5 estrellas4/5Excel de la A a la Z: El Manual Práctico Paso a Paso de Microsoft Excel para Aprender Funciones Básicas y Avanzadas, Fórmulas y Gráficos con Ejemplos Fáciles y Claros Calificación: 0 de 5 estrellas0 calificacionesPython para principiantes Calificación: 5 de 5 estrellas5/5Python Paso a paso: PROGRAMACIÓN INFORMÁTICA/DESARROLLO DE SOFTWARE Calificación: 4 de 5 estrellas4/5GuíaBurros Microsoft Excel: Todo lo que necesitas saber sobre esta potente hoja de cálculo Calificación: 4 de 5 estrellas4/5HTML para novatos Calificación: 5 de 5 estrellas5/5Ortografía para todos: La tabla periódica de la ortografía Calificación: 5 de 5 estrellas5/5El gran libro de Python Calificación: 5 de 5 estrellas5/5Fundamentos de programación: un enfoque práctico Calificación: 5 de 5 estrellas5/5Lógica de programación: Solucionario en pseudocódigo – Ejercicios resueltos Calificación: 4 de 5 estrellas4/5Linux Essentials: una guía para principiantes del sistema operativo Linux Calificación: 5 de 5 estrellas5/5VBA Excel Guía Esencial Calificación: 5 de 5 estrellas5/5Python Aplicaciones prácticas Calificación: 4 de 5 estrellas4/5Fundamentos De Programación Calificación: 5 de 5 estrellas5/5Python a fondo Calificación: 5 de 5 estrellas5/5Arduino. Trucos y secretos.: 120 ideas para resolver cualquier problema Calificación: 5 de 5 estrellas5/5Arduino. Edición 2018 Curso práctico Calificación: 4 de 5 estrellas4/5Curso básico de Python: La guía para principiantes para una introducción en la programación con Python Calificación: 0 de 5 estrellas0 calificacionesAprende a programar en C# Calificación: 5 de 5 estrellas5/5Diseño Web con CSS Calificación: 5 de 5 estrellas5/5El Libro Práctico Del Programador Ágil Calificación: 5 de 5 estrellas5/5115 Ejercicios resueltos de programación C++ Calificación: 3 de 5 estrellas3/5Introducción al Uso de Formularios (UserForms) en VBA Calificación: 3 de 5 estrellas3/5JavaScript: Guía completa Calificación: 4 de 5 estrellas4/5Bases de Datos con MySQL Calificación: 4 de 5 estrellas4/5Power Query para Excel 365/2021 Calificación: 0 de 5 estrellas0 calificacionesAprende a Programar en C++ Calificación: 5 de 5 estrellas5/5Aprender a programar con Excel VBA con 100 ejercicios práctico Calificación: 5 de 5 estrellas5/5
Comentarios para Programación Java
0 clasificaciones0 comentarios
Vista previa del libro
Programación Java - Francisco Blaco
PRÓLOGO
El objetivo de este libro no es ser un áspero
manual de referencia de los contenidos tratados: JDBC y Swing, Tampoco se trata, como podría dar la impresión, de una mera colección de ejercicios. Sino que el planteamiento del autor en la redacción de esta obra técnica ha sido el presentar al lector una integración de la utilización de ambas APIs, contextualizada en un ámbito productivo, materializada en el ejemplo final GestionLibros. El resto del libro constituye un camino de aproximación enfocada a la comprensión progresiva de dicha aplicación. Todo ello ajustado a la estructura que representa el modelo de desarrollo de software arquitectura a tres capas, que proporciona un marco organizativo de los componentes intervinientes.
Se ha acometido el desarrollo de interfaces gráficas desde un enfoque puro del código Java utilizado. El lector puede pensar que existen, en la mayor parte de IDEs, utilidades que permiten el desarrollo gráfico de una interfaz, generando automáticamente el código Java correspondiente a dicha implementación. Obviamente, es un método mucho más amigable y rápido que el que supone bajar
a nivel de código, y desarrollar la interfaz a golpe de tecla
. Somos conscientes de ello. El objetivo de este libro consiste en proporcionar al lector la cualificación necesaria para desarrollar este tipo de interfaces prescindiendo totalmente de este tipo de utilidades rápidas
. Estaremos totalmente de acuerdo en que, desarrollando aplicaciones en el ámbito productivo, recurriremos al procedimiento rápido
en la mayor parte de ocasiones. Pero nos encontramos, en situaciones puntuales, en las que el código generado automáticamente por el IDE al utilizar el procedimiento gráfico, no se adapta a los requerimientos exigidos a la aplicación. En esas situaciones nos vemos obligados a sumergirnos
en el código y aplicar los ajustes necesarios. Para sumergirnos
en el código se requiere ser un buen nadador
(siguiendo con el símil). Es ahí, exactamente, donde entra el planteamiento de este libro, en proporcionar la cualificación necesaria para poder ser resolutivos y salir airosos
de la situación, sin mayores complicaciones. Conociendo en profundidad los mecanismos inherentes a las interfaces gráficas, siempre estamos en condiciones de recurrir al procedimiento gráfico.
Se aportan esquemas y gráficos en un intento de facilitar al lector la comprensión de mecanismos que pudiesen estar revestidos de cierta complejidad.
La lógica de negocio asociada a aplicación final GestionLibros, está basada en desarrollar un CRUD aplicado al mantenimiento de una tabla de una Base de Datos. A primera vista, el lector, puede tener la impresión de que las subopciones de la opción Mantenimiento del menú de dicha aplicación son redundantes; pero pensemos que la aplicación no es un fin en sí misma, sino un medio para poder disponer de un escenario en que poder aplicar de forma integral todos los contenidos, mecanismos y estrategias objeto de estudio y tratamiento en este libro.
En pro de minimizar la extensión del libro, se han reducido a la mínima expresión los comentarios en el código de las clases de las aplicaciones aportadas, incluso en la mayoría de los casos, son inexistentes. Así mismo, también se han reducido otros recursos que proporcionan legibilidad al programa, tales como líneas en blanco adicionales. La ausencia de comentarios en el código, es suplida por las debidas explicaciones en el tema relacionadas con dicho código. Otra circunstancia, de la que el lector puede tener la impresión de ser poco ortodoxa, es el hecho de que la mayor parte de ejercicios del primer bloque (JDBC) están totalmente exentos de modularidad. Se ha hecho de esta manera en un intento de concentrar
y minimizar las actuaciones esenciales relacionadas con la funcionalidad que en cada momento se estaba tratando. Dicha falta de ortodoxia es compensada en el ejemplo EjercicioJDBC9, aplicación en la que se integran todas las funcionalidades tratadas individualmente en ejercicios anteriores, y se estructuran atendiendo a los criterios organizativos del modelo de desarrollo de software arquitectura a tres capas. El objetivo principal de esta aplicación es aportar al lector las directrices a aplicar en la estructuración de una aplicación a tres capas.
Bloque 1º
JDBC
1
Introducción
Java DataBase Connectivity (JDBC) es el API que permite el acceso desde una aplicación Java a Sistemas Gestores de Bases de Datos Relacionales. Es el cometido que nos hemos planteado en esta primera parte del libro. No se pretende convertir este libro en un mero manual de referencia, sino exponer al lector los mecanismos fundamentales que debe aplicar el programador con los recursos que nos ofrece este API. Todo ello ilustrado con los debidos ejemplos. El material descargable contiene toda una serie de ejercicios que brindan al lector la oportunidad de comprobar los citados mecanismos.
Todos los ejercicios de este libro que conectan con Base de Datos, están preparados (y probada exhaustivamente su ejecución libre de errores) para hacerlo con los Gestores de Bases de Datos Relacionales MySQL y Oracle. Nos encontramos con tres posibles variantes en cuando al procedimiento a utilizar para establecer el Gestor de Base de Datos concreto con que el lector pretende probar la aplicación:
Aplicaciones cuyo nombre responde al formato EjercicioJDBCn siendo n el número de ejercicio de la serie. El lector no tiene más que dejar activadas las líneas
Class.forName( … );
Connection connection = DriverManager.getConnection( … );
correspondientes al Gestor de BD a utilizar, y comentarizar las que corresponden a la otra BD. En EjercicioJDBC9, estructurado según el modelo de desarrollo de software arquitectura a tres capas, el lector deberá aplicar dicha actuación en la clase ConexionBaseDatos del packagedatos.
Aplicación PoolConexiones. Es necesario cambiar la comentarización de una zona más extensa de código en la clase ConexionBaseDatos.
Aplicaciones VotacionPropuesta y GestionLibros. Forman parte del bloque de ejercicios de este libro destinados a Swing. Aunque estructurados a tres capas, para establecer la Base de Datos con que conectar, el lector debe editar el fichero repositorio.xml, ubicado en el directorio xml del proyecto. Este fichero actúa como repositorio centralizado de información del proyecto susceptible de ser parametrizada. Mediante la edición del mencionado fichero podrá establecer el SGBD escogido:
o bien
Toda aplicación Java en que se pretenda conectar con una Base de Datos utiliza el driver correspondiente a dicha BD. Dichos drivers responden a unas librerías externas que deben ser añadidas al proyecto. Los drivers utilizados y probados en todos los ejercicios de este libro que conectan con Base de Datos son:
Para MySQL: mysql-connector-java-5.1.22-bin.jar
Para Oracle: ojdbc6.jar
Por cuestiones de licencia, solamente podemos aportar el primer fichero. Está añadido en todos los proyectos, y presente en el directorio lib de cada uno de ellos. Para poder conectar con Oracle, el lector deberá efectuar la descarga del fichero citado, y añadirlo al proyecto al igual que lo está el correspondiente a MySQL. Hemos podido aportar los drivers para MySQL amparándonos en:
You may copy and distribute verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
Sirva la citada reseña para cumplir con todos los requisitos legales.
Con el material descargable del curso, además del código de todas las aplicaciones, se aportan también scripts SQL que recrean
, en ambos Sistemas Gestores de Bases de Datos, el escenario necesario (tablas, datos, secuencias, procedimientos almacenados) para la ejecución de las aplicaciones que conectan con dichos SGBD. Solamente la aplicación VotacionPropuesta requiere de la creación previa de la Base de Datos VOTACIONES. El resto de las aplicaciones acceden a la Base de Datos BIBLIOTECA. El lector podrá optar por probar la ejecución de estas aplicaciones en MySQL, en Oracle, o en los dos. Para ello deberá tener instalado el SGBD que escoja, iniciar los servicios, y ejecutar los correspondientes scripts SQL.
Procedamos ya a abordar todos los detalles pertinentes para el acceso a la Base de Datos desde una aplicación Java. El siguiente esquema responde a una representación gráfica de las clases que intervienen en dicho proceso:
La clase que responde a la interface Connection es la que modela la conexión con la BD. Nos expresamos de esta forma porque en el API JDBC, salvo alguna excepción, nos encontramos con interfaces, y no con clases. El sentido que ello tiene es imponer, a cada fabricante-desarrollador-distribuidor
de Gestores de Bases de Datos que pretendan aportar los correspondientes drivers para permitir el acceso desde Java, la obligación de que dichos drivers contengan unas clases con unos métodos, con unos nombres concretos, y que se comporten de determinada forma. Estamos asistiendo a un escenario polimórfico a gran escala. Presentamos a continuación el primer ejemplo, y con ello iremos analizando progresivamente cada una de las interfaces intervinientes, así como sus respectivos métodos.
2
Ejercicios JDBC
EjercicioJDBC1
package ejerciciojdbc1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
public class EjercicioJDBC1 {
public static void main(String[] args) {
try {
// CONEXION MySQL
Class.forName(com.mysql.jdbc.Driver
);
Connection connection = DriverManager.getConnection(jdbc:mysql://localhost:3306/biblioteca
, root
, );
/*
// CONEXION Oracle
Class.forName(oracle.jdbc.driver.OracleDriver
);
Connection connection = DriverManager.getConnection(jdbc:oracle:thin:@localhost:1521:ORCL
, scott
, tiger
);
*/
String sql = SELECT * FROM libros
;
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(id_libro :
+ resultSet.getString(1));
System.out.println(título :
+ resultSet.getString(2));
System.out.println(género :
+ resultSet.getString(3));
System.out.println(fecha edición :
+ new SimpleDateFormat(yyyy-MM-dd
).format(resultSet.getDate(4)));
System.out.println(numero páginas :
+ resultSet.getInt(5));
System.out.println(premiado:
+ resultSet.getInt(6));
System.out.println(--------------------------------------------------
);
}
connection.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
Observará el lector, más que la falta, la total ausencia de modularidad en la implementación del código. Así como la total ausencia de recursos que proporcionan legibilidad al programa, tales como comentarios, líneas en blanco, etc. Todo ello no es consecuencia de una actitud descuidada y desorganizada. En los primeros ocho ejercicios de este bloque se ha ubicado la totalidad del código en el método main(). Tiempo habrá en ejercicios posteriores del bloque Swing, y sobre todo los organizados a tres capas, para aplicar modularidad, estructura y organización. Se ha hecho de esta forma en estos primeros ejercicios para que el lector disponga, en pro de la claridad de comprensión, de una perspectiva lo más concentrada y escueta posible del código utilizado. En lo relativo a la ausencia de recursos que proporcionan legibilidad, se ha hecho con la intención de reducir al máximo la extensión del libro. La ausencia de comentarios en el código esperemos que sea compensada con las aclaraciones y explicaciones que efectúa el autor en el análisis de cada aplicación.
Para obtener una conexión, la primera actuación es:
Class.forName(com.mysql.jdbc.Driver
);
en que proporcionamos al método forName() como parámetro un String con la clase del driver y la ruta en que está ubicado dentro del archivo-librería aportado. Si el lector no está familiarizado con la clase Class y sus métodos le remitimos al libro, del mismo autor, Programación Orientada a Objetos en Java
, concretamente en el capítulo dedicado al polimorfismo.
Es habitual en el desarrollo de los drivers, la implementación de un bloque static en la clase correspondiente al driver. Ello permite que, al cargarse la clase, se ejecute el código de dicho bloque. Las actuaciones que se suelen implementar en el bloque static provocan que la clase se instancie a sí misma, y a continuación, la referencia obtenida de dicha instanciación se transfiere al método:
DriverManager.registerDriver(referenciaAInstanciaDelObjetoDriver);
que ocasiona que el driver se registre con el administrador de controladores. Una vez registrado, podemos aplicar la siguiente actuación:
Connection connection = DriverManager.getConnection
(jdbc:mysql://localhost:3306/biblioteca
, root
, );
Proporcionamos como primer parámetro al método getConnection() una URL, y como segundo y tercer parámetro, usuario y contraseña, respectivamente. El administrador de controladores busca de entre todos los drivers que tenga registrados, aquel en que encaje dicha URL, y lo utiliza para solicitar una conexión con la Base de Datos cuya dirección, puerto, y nombre de instancia se especifican. De conseguirla, modela dicha conexión en una instancia que se acoge a la interface Connection, tal y como aparece reflejado en la representación gráfica.
Antes de proseguir en el análisis minucioso del código utilizado en este ejemplo, focalizamos la atención del lector en el hecho de que no utilizamos el operador new para obtener ninguno de los objetos que intervienen en el acceso a la Base de Datos para conectar, lanzar la consulta, y gestionar los resultados. Es decir, no obtenemos los objetos por instanciación explícita mediante el operador new, sino que se produce una instanciación implícita de los mismos durante la ejecución de los métodos pertinentes, devolviendo éstos la referencia a dichos objetos, y limitándose el programador a recogerla en la variable declarada a tal efecto. Esta circunstancia es reflejada gráficamente mediante una flecha discontinua como continuación a la flecha continua que viene a representar la ejecución del método. El escenario descrito permite reforzar nuestras manifestaciones en relación a que declaramos las referencias del tipo de una interface y no de una clase.
El paso siguiente, y previo al de poder lanzar la consulta SQL a la BD, es obtener un objeto acogido a la interface Statement:
Statement statement = connection.createStatement();
Lanzaremos las SQL a la BD mediante los métodos executeXXX() de este objeto. Cuando lancemos una consulta, deberemos utilizar executeQuery(), pues este método devuelve la referencia a un objeto que responde a la interface ResultSet que nos permite procesar el resultado devuelto por la consulta:
ResultSet resultSet = statement.executeQuery(sql);
De todas las variantes de proceso de dicho resultado, nos vamos a centrar en la implementada en este ejemplo, que será la que adaptaremos cuando en EjercicioJDBC9 presentemos un ejemplo organizado según el modelo de desarrollo de software arquitectura a tres capas. Los mecanismos a utilizar implican la utilización de los métodos:
next()
getXXX()
Ante el lanzamiento de una consulta, en relación al número de filas devueltas, nos podemos encontrar con los siguientes casos:
Ninguna fila.
Una sola fila. Circunstancia que se produce cuando se trata de una consulta en que establecemos una condición de búsqueda por valor de clave primaria, o cuando la expresión a devolver es una función de grupo sin utilizar la cláusula GROUP BY.
Un conjunto de filas.
El ResultSet (por economía lingüística utilizaremos este modo de referirnos a un objeto que responde a una interface) dispone de un cursor. Para el proceso de los datos devueltos, y en previsión de cualquiera de los tres escenarios descritos, el posicionamiento del cursor es inicializado antes de la primera fila. El recorrido del conjunto de filas modelado por el ResultSet pasa, inexorablemente, por establecer un recorrido
de dicho conjunto, donde, antes de tratar los datos de una fila, proceden dos actuaciones:
Interrogar
al ResultSet sobre la potencial existencia de dicha fila.
Si dicha fila existe, avanza, posicionando el cursor sobre la misma.
El ResultSet dispone de un método que representa un paquete
de ambas actuaciones, estamos hablando del ya mencionado método next(). Este método cumple con el primero de los cometidos devolviendo true si existe la fila siguiente, y false en caso contrario. Así pues, la estructura de control repetitiva que mejor se adapta es:
while (resultSet.next()) {
PROCESO DE LOS DATOS DE UNA FILA
}
Cada repetición del bloque nos permitirá procesar los datos de una cada fila, es decir las expresiones devueltas por SELECT. Extraeremos
cada una de dichas expresiones mediante el método getXXX() procedente en función del tipo SQL a que responda la expresión, teniendo el cuenta el mapeo establecido entre tipos SQL y clases Java. En el caso del ejemplo, la consulta lanzada a la BD ha sido:
SELECT * FROM libros
En consecuencia, hemos utilizado:
Cada uno de los métodos getXXX() está sobrecargado, pudiendo ser el parámetro transferido:
Un valor int que representa el número de posición en la SELECT de la expresión a extraer
. El primer valor es el 1. Es la variante que utilizamos en todos los ejemplos de este libro.
Un String que representa el nombre de la expresión en la SELECT, por ejemplo aplicado a la primera columna sería
getString(id_libro
)
El siguiente esquema representa el proceso de recorrido del ResultSet y extracción de los datos de cada fila
Una vez procesado el resultado de la consulta, procedemos a invocar al método
connection.close()
de la conexión que implica la liberación de los recursos utilizados por la misma.
Presentamos a continuación, otro ejercicio, en que se lanza a la BD la misma SQL. Pretendemos con este nuevo ejercicio presentar al alumno nuevos mecanismos para obtener la conexión con la BD.
EjercicioJDBC2
package ejerciciojdbc2;
import java.sql.Connection;
// import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Properties;
public class EjercicioJDBC2 {
public static void main(String[] args) {
try {
Properties propertiesConexion = new Properties();
propertiesConexion.put(user
, root
);
propertiesConexion.put(password
, );
propertiesConexion.put(charSet
, ISO-8859-1
);
// CONEXION MySQL
// Class.forName(com.mysql.jdbc.Driver
);
// Connection connection = DriverManager.getConnection(jdbc:mysql://localhost:3306/biblioteca
, propertiesConexion);
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
Connection connection = driver.connect(jdbc:mysql://localhost:3306/biblioteca
, propertiesConexion);
/*
Properties propertiesConexion = new Properties();
propertiesConexion.put(user
, scott
);
propertiesConexion.put(password
, tiger
);
propertiesConexion.put(charSet
, ISO-8859-1
);
// CONEXION Oracle
// Class.forName(oracle.jdbc.driver.OracleDriver
);
// Connection connection = DriverManager.getConnection(jdbc:oracle:thin:@localhost:1521:ORCL
, propertiesConexion);
oracle.jdbc.driver.OracleDriver driver = new oracle.jdbc.driver.OracleDriver();
Connection connection = driver.connect(jdbc:oracle:thin:@localhost:1521:ORCL
, propertiesConexion);
*/
String sql = SELECT * FROM libros
;
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(id_libro :
+ resultSet.getString(1));
System.out.println(título :
+ resultSet.getString(2));
System.out.println(género :
+ resultSet.getString(3));
System.out.println(fecha edición :
+ new SimpleDateFormat(yyyy-MM-dd
).format(resultSet.getDate(4)));
System.out.println(numero páginas :
+ resultSet.getInt(5));
System.out.println(premiado:
+ resultSet.getInt(6));
System.out.println(--------------------------------------------------
);
}
connection.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
Obtenemos la conexión prescindiendo del administrador de controladores. Instanciamos explícitamente un objeto de la clase que corresponde al driver, para MySQL:
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
y para Oracle:
oracle.jdbc.driver.OracleDriver driver = new oracle.jdbc.driver.OracleDriver();
obteniendo la conexión mediante la invocación al método connect() del driver. Para MySQL:
Connection connection =
driver.connect(jdbc:mysql://localhost:3306/biblioteca
, propertiesConexion);
y para Oracle:
Connection connection =
driver.connect(jdbc:oracle:thin:@localhost:1521:ORCL
, propertiesConexion);
Observamos que al método connect() se le transfieren dos parámetros:
La URL que permite acceder e identificar a la instancia de la BD.
La referencia a un objeto de la clase Properties en que establecemos algunas características: usuario, contraseña, etc.
Aunque comentarizado, presentamos también en el ejercicio la posibilidad de obtener la conexión mediante DriverManager, pero con una variante sobrecargada del método getConnection() al que transferimos como segundo parámetro la referencia al objeto Properties ya descrito. Para MySQL:
Connection connection = DriverManager.getConnection
(jdbc:mysql://localhost:3306/biblioteca
, propertiesConexion);
y para Oracle:
Connection connection = DriverManager.getConnection
(jdbc:oracle:thin:@localhost:1521:ORCL
, propertiesConexion);
Para instrucciones SQL como la utilizada en los dos ejercicios previos, que no requieran de la aplicación de datos parametrizados se adaptan perfectamente objetos que respondan a la interface Statement. Pero en muchas ocasiones cuando nos encontremos con instrucciones SQL que sí requieran de la aportación de datos parametrizados. El caso más obvio es INSERT, en que nos vemos obligados a proporcionar los valores a insertar, y que especificamos en la cláusula VALUES. Podríamos seguir utilizando Statement, pero nos veríamos obligados a concatenar al el String que conforma la SQL las variables que contienen dichos valores. Esta incomodidad
puede ser subsanada utilizando PreparedStatement, que hereda de Statement. Presentamos la jerarquía en herencia correspondiente a esta última interface:
La utilización de PreparedStatement supone también una mejora en el rendimiento del Gestor de Base de Datos, pues cuando se lanza la SQL mediante clases de esta interface, se almacena la versión precompilada de la SQL, en previsión de que vuelva a utilizarse, evitando posteriores procesos de precompilación al lanzar nuevamente la misma SQL.
A efectos de ilustrar la utilización de PreparedStatement, presentamos un nuevo ejercicio en que la SQL que se lanza a la BD es una consulta en que se intenta recuperar una fila estableciendo en la cláusula WHERE la condición de coincidencia de clave primaria.
EjercicioJDBC3
package ejerciciojdbc3;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
public class EjercicioJDBC3 {
public static void main(String[] args) {
String idLibroAConsultar = 00001
; // Mediante esta asignación simulamos la captura del dato desde una interfaz de usuario
try {
// CONEXION MySQL
Class.forName(com.mysql.jdbc.Driver
);
Connection connection = DriverManager.getConnection(jdbc:mysql://localhost:3306/biblioteca
, root
, );
/*
// CONEXION Oracle
Class.forName(oracle.jdbc.driver.OracleDriver
);
Connection connection = DriverManager.getConnection(jdbc:oracle:thin:@localhost:1521:ORCL
, scott
, tiger
);
*/
String sql = SELECT * FROM libros WHERE id_libro = CAST(? AS CHAR(5))
;
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, idLibroAConsultar);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println(id_libro :
+ resultSet.getString(1));
System.out.println(título :
+ resultSet.getString(2));
System.out.println(género :
+ resultSet.getString(3));
System.out.println(fecha edición :
+ new SimpleDateFormat(yyyy-MM-dd
).format(resultSet.getDate(4)));
System.out.println(numero páginas :
+ resultSet.getInt(5));
System.out.println(premiado:
+ resultSet.getInt(6));
}
connection.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
En primer lugar, hay que centrar la atención en la conformación del String que representa la SQL:
String sql = SELECT * FROM libros WHERE id_libro = CAST(? AS CHAR(5))
;
Se observa que en el lugar donde ubicamos un literal cuando lanzamos directamente la SQL desde entornos especializados, aquí, dicho literal es sustituido por ?
, representando un parámetro que es necesario establecer.
A diferencia del Statement, al método que nos permite la obtención del PreparedStatement, se le transfiere el String que representa la SQL:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
En contraprestación, dicho String no se transferirá cuando invoquemos al método executeXXX().
ResultSet resultSet = preparedStatement.executeQuery();
Obviamente, antes de lanzar la SQL a la BD, es necesario establecerle los valores necesarios, representados mediante ?
, como ya hemos mencionado. Para ello recurrimos a los métodos setXXX(), en el caso de este ejercicio:
preparedStatement.setString(1, idLibroAConsultar);
A estos métodos se les transfieren dos parámetros:
Un valor numérico que representa la posición del parámetro en la SQL, empezando por 1
.
La expresión que corresponde al dato a establecer.
Análogamente a la selección del método getXXX() a aplicar en la extracción
de datos del ResultSet, es necesario utilizar el método setXXX() pertinente, en función de la clase Java que mapea el tipo SQL del dato a establecer.
Un pequeño detalle a matizar es que en este ejercicio hemos aplicado la estructura alternativa simple en el recorrido
del ResultSet, en lugar de la estructura repetitiva while() que se aplicó en los dos ejercicios anteriores. Nos hemos decantado por la alternativa simple en este ejercicio porque al tratarse de una consulta por coincidencia de clave primaria, solamente devolverá una fila como máximo, en el caso de devolver algún resultado.
A efectos de minimizar la extensión del código de los ejercicios expuestos, en todos ellos, a excepción de EjercicioJDBC9, hemos simulado mediante asignaciones la recogida de datos desde una interfaz de usuario.