Objetivos
Eneste capitulo aprendesd a:
1 Utilizar conceptos de bases
de datos relacionats.
1 Utilizar el lenguaje de consulta
estructurado (SQL) para recuperar
datos y manipularlos en una base
de datos.
1 Utilizar las clases ¢ interfaces
de la API de JDBC™ para manipular
bases de datos.
= Utilizar el descubrimiento
automético de controladores,
JDBC de JDBC.
‘= Incrustar un control GUI de Swing
envun grafico de escena JavaFX
a través de SwingNode
‘= Utlizar JTable de Swing y
TableMode1 pare completar una
Table con datos de ResultSet.
1» Ordenar y filtar el contenido
de una JTable
‘= Utilizar la interfaz RowSet
del paquete javax. sql
para simplificar la conexién
¢ interaccién con bases de datos.
‘= Crear instrucciones SQL
precompiladas con parimetros
a través de PreparedStatement.
‘= Descubrircémo el procesamiento
de transacciones hace que las
aplicaciones de bases de datos
sean mas séidas.
Acceso a bases de datos
con JDBC‘ Plan general
241 Introduccién 1003,
24.1 Introduccién
24.2 Bases de datos relacionales
24.3 Una base de datos de libros
24.4 SQL
24.4.1 Consulta bisica SELECT
244.2 Causula WHERE
24.4.3 Causa ORDER BY
24.4.4 Fusionar datos de varas tabla: INNER. JOIN
24.45 Instruccién INSERT
24.46 Instrucién UPOATE
24.47 Instruccion DELETE
24.5 Configuracién de una base de datos
Java DB
245.1 Creacin de las haces de éatos del expitulo
en Windows
24.5.2 Creacin de las bases de datos del apitulo
en macOS
24.5.3 Geacion de as bases de éatos del capitulo
en Linsx
24.6 Conexién y consulta de una base de datos
24.6.1 Deteccién automatics de controladores
24.62 Conexién ala base de dator
24,63 Creacién deun Statenent para ejecutar
consultas|
24.64 Ejecucién de una consulta
24.65 Procesar el ResultSet de una consulta
24.7 Consultar la base de datos de libros
24,71 Clase ConjuntoResultadoTableModel
24,72 GUl dels aplicacion
MostrarResultadosConsuTta
24,73 Cise
MostrarResu]tadosConsul taContreler
24.8 Interfaz RowSet
24.9 Objetos PreparedStatenent
24.91 Aplicacién “ibreta de direcciones’
(que utilza PreparedStatenent
24.92 Clase Persona
24,93 Clase ConsultasPersona
24.94 GUl deLibretabirecciones
24.95 Case LibretaDireccionesController
24.10 Procedimientos almacenados
24.1 Procesamiento de transacciones
24.12 Conclusion
Resumen | Gerecio de autoevaluacién | Respuestas al ejecico de autoevaluacién | Ejercicios
24.1 Introduccién
Una base de datos es una coleccién organizada de datos. Existen muchas estrategias diferen-
tes para organizar los datos a fin de facilitar cl acceso a cellos y su manipulacién. Un sistema
de gestidn de bases de datos (DBMS) proporciona mecanismos para almacenar, organizar,
recuperar y modificar datos para muchos usuarios. Los sistemas de gestién de bases de datos
permiten cl acceso y el almacenamiento de datos sin preocuparse por la representacidn interna
de é:tos.
Lenguaje de consulta estructurado
Los sistemas de bases de datos mas populares de la actualidad son las bases de datos relacionales(seccién
24,2), Ellenguaje llamado SQL (se pronuncia “si-kuel”, 0 como sus letras individuales) es el lenguaje
«sténdar internacional usado casi universalmente con bases de datos relacionales para realizar consul-
tas (es decir, para solicitar informacién que satisfaga criterios dados) y para manipular datos.
Sistemas populares de gestién de bases de datos relacionales
Algunas marcas populares de sistemas de administracién de bases de datos relacionales (RDBMS)
son Microsoft SQL Server, Oracle, Sybase ¢ IBM DB2, PostgreSQL, MariaDB y MySQL son po-
pulares DBMS de cédigo abierte que cualquier persona puede descargar y usar libremente. JDK
8 viene con un RDBMS de Java puro llamado Java DB, la versién de Apache Derby™ con la
‘marca Oracle.1004 — Capitulo 24 Acceso a bases de datos con JDBC
JDBC
Los programas Java interactiéan con las bases de datos utilizando la API de Java Database Con-
acctivity (JDBC™), Un controlador JDBC permite que las aplicaciones Java se conecten 3 un
base de datos en un DBMS en particular y le permite manipular esa base de datos utilizando
Ia API JDBC.
Observacién de ingenieria de software 24.1
La API de JDBCes portdtil: el mismo cédigo puede manipular bases de datos en varios RDBMS.
Los sistemas de administracién de bases de datos més populares proporcionan controladores
JDBC. En este capitulo presentamos JDBC y lo usamos para manipular bases de datos Java DB. Las
‘técnicas que mostramos aqui se pueden utilizar para manipular otras bases de datos que tengan con-
troladores JDBC. De lo contrario los proveedores externes proporcionan controladores JDBC para
muchos DBMS.
API de persistencia de Java (JPA)
En d capitulo 29 en linea presentaremos la API de persistencia de Java (JPA), en él aprender cémo
autogenerar clases Java que representan las tablas en una base de datos y las relaciones entre
clas, conocidas como mapeo relacional de objetos, y luego usar objetos de esas clases para interactuar
con una base de datos. Como vers, el zlmacenamiento y la recuperacién de datos en una base de datos
se manejarin por usted; muchas de las eécnicas de JDBC que aprender en este capitulo generalmente
estén ocultas para usted por JPA.
Nota del JDK 9
A partir de JDK 9, Oracle ya no incluye Java DB con el JDK. Si esté utilizando JDK 9 con este capi-
tulo, siga las instrucciones de descarga e instalacién de Apache Derby en
hvep://[Link]/derby/papers/derbyTut/instat1_softnare.huml#derby
antes de continuar con los ejemplos de este capitulo.
24.2 Bases de datos relacionales
Una base de datos relacional, quealmacena datos en tablas, es una representacién légica de datos que
permite acceder a los datas sin tener en cuenta su estructura fisica. La Figura 24.1 ilustra una tabla de
muestra que pod
principal es almacenar los atributos de los empleados. Las tablas se componen de files, cada una de las
den la Figura 24.1, un empleado. Las filas se componen de columnas
cn las que se almacenan los valores. Esta tabla consea de ses filas. La columna Numera de cada fila
{a clave primaria de la tabla: una columna (o grupo decolumnas) con un valor que es tinico para cada
fila, Esto garantiza que cada fila se pueda identicar por su clave primaria. Algunos buenos ejemplos
de columnas con clave primaria son los ntimeros de seguro social, un ntimero de identficacién de em-
pleado y un niimero de pieza en un sistema de inventario, ya que se garantiza que los valores en cada
una de estas columnas son tinicos. Las filas dela Figura 24.1 se muestran en orden por clave primaria.
aria, pero podrian enumerarse
uwsarse en un sistema de personal. El nombre dela tabla es Empleado y st propésio
‘cuales describe una sola enti
En exte caso, las filas se enumeran en orden ascendente por clave
en orden descendente o sin ningsin orden en particular.
Cada columna representa un atributo de datos diferente. Las fils son tinicas (por clave primaria)
dentzo de una tabla, pero los valores de columna particulares pueden duplicarse entre filas; por ejem-
plo, tres filas diferentes en la columna de Departanento de la tabla Enp1 eado contienen el timero 413.243 Una base de datos de libros 1005
Numero Nombre Departanento Slario Ubicacion
23603 Jones [413 1400 New Jersey
zisosokerin— faua! 2000 New Jersey
35761 Myers 1400 orlando
Ye
Fig. 24.1 | Datos de muestre de la tabla de emp eados.
Seleccionar subconjuntos de datos
Los diferentes usuarios de una base de datos a menudo estén interesados en diferentes datos y dife-
rentes relaciones entre los datos. La mayoria de los usuarios sélo requieren subconjuntos de
sy colurnas. Las consultas especifican qué subconjuntos de datos scleccionar de una tabla. Se
utiliza SQL para definir consultas; por ejemplo, puede seleccionar datos de la tabla Empleado
para crear un resultado que muestre dénde se encuentra cada departamento, presentando los datos
‘ordenados en orden creciente por ntimero de departamento. Este resultado se mucstrs en la Figura
24.2. SQL se analiza en la seccién 24.4.
Departamento Ubicacion
on orlando
62 los angetes
Fig. 24.2 | Datos distintos de departamentos y ubscaciones de la tabla Emp eados.
24.3 Una base de datos de libros
Introducimos bases de datos relacionales en el contexto de la base de datos de Tibros de este capitulo,
que utilizard en varios ejemplos. Antes de revisar SQL, revisaremos las tablas de la base de datos de
Vibro. Usamos esta base para presentar varios concepras de bases de datos, incluido cémo usar SQL
para obtener informacién de la base de datos y manipularlos. Proporcionaremos un script para crear
la base de datos, el cual puede encontrar en el directorio de ejemplos de este capitulo. La seccién 24.5
explica cimo utilizar este script.
Tabla autores
La base de datos consta de tes tablas: autores, isbnautor y titutes. La tabla autores (descrita en la
Figura 24.3) consta de tres columnas que mantienen el nimero de identificacién inico, el nombre
y el apellido de cada autor. La Figura 24.4 contiene datos de muestra de la tabla autores.1006 — Capitulo 24 Acceso a bases de datos con JDBC
sahutor [Niimero de identificacién (ID) del autor en la base de datos. En la
bse de datos Tibros, esa columna de ntimeros enteros se define como
aautoincrementadas para cada ila insertada en esta abla, el valor de
‘autor seinerementa en 1 automdticamente para garantizar que cada
fila tenga un ieutor nico. Esta columna representa la clave primaria
de a tabla. Las columnas autoincrementadas son las lamadas colum-
‘nas de identidad. El script SQL. que proporcionamos para esta base
dle datos wiliza la palabra clave toewrrry de SQL para marcas la co-
umns satator como una columna deidentidad. Para obtener mis
informacién sobre el uso de la palabra clave TOENTITY y la creacion,
de bases de datos, consulte la Guia del destrrollador de Java DB en
hexp://docs oracle. com/javadb/:[Link]/dewguide/derbydev.péf.
Primer nombre del autor (una cadena).
pellidofatemo _Apelldo patemo del autor (una cadena).
Fig. 24.3 | Tabla de autores de la base de datos de libros.
2 Harvey Deitel
3 pebey Deitel
‘ Dan owirk
5 Miguel Nergano
Fig. 24.4 | Datos de muestra de la tabla autores
Tabla titulos
La tabla de titulos descrita en la Figura 24.5 consiste en cuatro columnas que mantienen infor-
macién sobre cada libro en la base de datos, incluido su ISBN, titulo, nimero de edicién y ato de
copyright. La Figura 24.6 contiene los datos de la tabla titulos.
‘isbn 1 nimero ISBN del libro (una cadena). La clave principal de la tabla.
ISBN es laabreviatura de “International Sandard Book Number’, un
exquema de numeracién que los editors wilizan para asignar a cada
libro un nimero de identficacién inico.
situlo ‘Titulo del libro (una cadena).
mumeroEdicion __-Niimero de edicién del libro (un entero).
copyright Afio de edicin (copyright) el libro (una cadena).
Fig. 24.5 | Tabla vitulos de la base de datos de libros.243 Una base de datosde libros 1007
(0132151005 Internat & World Wide Neb How to Progra 5 202
(0132807800 Java How t0 Progras 10 pois
0132575655 Java How to Program, Late Objects Version 10, 2o1s
onszage44x How to Program ? 2013
(0132990601 Simply Visual Basic 2010 ‘ 2013
(0233406954 Visual Basic 2012 How to Progran ‘ zou
(0133375337 Visual C# 2012 How to Froaram 5 zou
0136151574 Visual C++ 2008 How to Program 2 2008
0133378713. Ci# How to Program ° 201s
0133570924 Android How to Program 2 2ois
(0132570924 Android for Programars: An App-Oriven, 2 zou
‘Approach, Yolune 1
0132121360 Android for Programers: An App-Driven 1 zo
Approach
Fig. 24.6 | Datos de muestra de a tabla titutos de la base de datos de libros.
Tabla isbnéutor
La tabla isbaAutor (descrita en la Figura 24.7) consta de dos columnas que mantienen los ISBN
de cada libro y los mimeros de identificacién de sus aucores correspondientes. Esta tabla asocia
a los autores con sus libros. La columaa ‘autor es una clave externa, una columna en esta tabla que
le con la columna de clave primaria en otra tabla (es decir, idAutor en la tabla autores).
La columna isbn también es una clave externa: coincide con la columna de clave primaria (es
decir, isbn) en la tabla titulos. Una base de datos puede constar de muchas tablas. Un objeti-
vo al disefiar una base de datos es minimizar la cantidad de datos duplicados entre las tablas de la
base de datos. Las claves externas, que se especifican cuando se crea una tabla de base de datos en
4a base de datos, vinculan los datas en narias tablas. Las columnas ‘dAutor ¢ isbn juntas-en esta tabla
forman una clave primaria campuesta. Cada fila de esta tabla empareja de forma tinica un autor con
cLISBN de am libro. La Figura 24.8 contiene los datos de la tabla isbadutor de la base de datos de
Vibros. (Nota: para ahorrar espacio, dividimos la tabla en dos columnas, cada una de dllas contiene
fas columnas idtutor ¢ *sbn.]
sakutor Fl nuimera de identificacién del autor, una clave externa para la tabla
‘isbn EISBN de un libro, una clave externa para la tabla titutos.
Fig. 24.7 | Tabla isbnautor de la base de datos de Tibros.
Cada valor de clave externa debe aparecer como el valor de clave primaria de otra tabla para
que el DBMS garantice que el valor de la clave externa sea vilido; esto se conoce como la Regla
de integridad referencial, Por ejemplo, el DBMS segura que el valor idAutor para una fila particular1002 — Capitulo 24 Acceso a bases de datos con JDBC
2 ouzzasions =| a 0136151574
3 ouzzasions | 2 0136151574
1 o1xse07e00 | 4 0136151574
1 ouns7sess | 2 133378713
2 ouns7sess | a 0133764036,
1 ouxzageeax | 2 0133764036,
1 o1xza90601 | a 0133570926
2 o1xza90601 | 2 0133570926
3 o1xza9060. | 3 0133570926
2 oussaocass | 2 0132121360
3 oussaocss | 3 0132121360
1 ouswea7 | 5 0132121360
Fig. 24.8 | Datos de muestra de la tabla isbnautor de libres.
de la tabla isbnautor es valida comprobando que hay una fila en la tabla autores con ese idéutor
‘como clave primaria.
Las claves fordncas tambign permiten seleccionar datos relacionados cn varias tablas de esas tablas;
‘esto es conocido como unir los datos. Existe una relacién de uno a varios entre una dave primaria
yuna clave externa correspondiente (por ejemplo, un autor puede escribir muchos Vibros y un libro
pucde ser escrito por muchos autores). Esto significa que una clave externa puede aparceer muchas
veces en su propia tabla, pero s6lo una vez (como clave primatia) en otra tabla; por ejemplo, el isba
(0132151006 puede aparecer en varias filas de isbnautor (porque este libro tiene varios autores), pero
sélo una vez en titulos, donde isbn es la clave principal.
Diagrama de entidad-relacin (ER)
Existe una relacién de uno a muchos entre una dave primaria y una clave externa correspondiente
(por ejemplo, un autor puede escribir muchos 1ibros). Una clave externa puede aparecer muchas
veces en su propia tabla, pero sélo una ver (como clave primaria) en otra tabla. La Figura 24.9 es un
diagrama de relacién de entidades (ER) para la base de datos de libros. Este diagrama muestra las
tables de las bases de datos y las relaciones entre dlas. El primer compsrtimento de cada cuadro contiene
‘nombre dela tabla y los compartimentos restantes contienen las columnas de la tabla. Los nombres en
cursiva son claves primarias. La clave primaria de una tabla identifica de forma inica cada fila de
la tabla, Cada fila debe tener un valor de clave primaria y ese valor debe ser tinico en la tabla. Esto se
conoce como la Regla de integridad de las entidades. Nuevamente, para la tabla tsbnautor la
clave primaria esa combinacién de ambas columnas; esto se conoce como clave primaria compuesta.
Las lineas que conectan ls tablas representan las relaciones entre las tables. Considere la linea entre
las tablas autores c isbnAutor;
cl extremo de autores hay un 1 y en el extreme de isbrAutor hay un
simbolo de infinito (c9), esto indica una relacién de uno a varios: para cada autor de la tabla auto-
res puede haber un mimero arbitrario de ISBN para libros escritos por ese autor en la tabla isbnautor244 SQL 1009
Autores
tutor -
primerNonbre:
apellidoraterno
Fig. 24.9 | Relaciones ce tabla en la base de datos de libros,
(cs decir, un autor puede escribir cualguier niimero de libros). La linea de relacién vineula fa colum-
na idautor en la tabla autores (donde iéAutor es la clave primaria) con ka columna idAutor en la
tabla isbnautor (donde idAutor es una clave externa)s la linea entre las tablas vinculz la clave primaria
con la clave externa correspondiente.
La linea entre las tablas titulos y istnautor ilustra una relacién de uno a varies: un libro puede
ser escrito por varios aucores. Tenga en cuenta que la linea entre las tablas vincula el 1SBN de la clave
primariaen la tabla titulos con la clave externa correspondiente en la tabla 1sbnautor. Las relaciones
cn la Figura 24.9 ilustran que el dnico propésito de la tabla isbnAutor es proporcionar una relacién
de varios a varios entre las tablas de autores y titules: un autor puede escribir muchos libros y un
libro pucde tener muchos autores.
24.4 SQL
Ahora hablamos de SQL en al contexto de nuestra base de datos de 1ibros. Pedra usar el SQL revi-
sado aqui en posteriores ejemplos en el capitulo. Las siguientes subsecciones demuestran consultas
y declaraciones SQL utilizando las palabras clave SQL de la Figurs 24.10. Orras palabras clave SQL.
cestdn mas alli del alcance de este texto.
sevect Recupera datos de una 0 més tablas.
Frow “Tablas implicadas en la consulta. Requerido en cada SELECT.
ier CCriterios de seeccién que determinan as filas por recupera,eliminar 0 actualizas
‘Opsional en una instruccién SQL.
cacur ev CCriterios para agrupar filas. Opcional en una consulta SELECT.
contr BY CCriterios para ordenat filas. Opcional en una consulta SELECT.
INNER 301N Fusionar filas de varias tablas.
INSERT Inserta fils en una tabla especificada.
‘roar ‘Actualiza fis en una tabla especifiada.
eveTe Elmina filas de una tabla especificada.
Fig. 24.10 | Palabras clave de consulta SQL.1@1® Capitulo 24 Acceso a bases de datos con JDBC
24.4.1 Consulta
‘Consideremos varias consultas SQL que extraen informacién de Tibros de bases de datos. Una con-
sulta SQL “selecciona” filas y columnas de una o més tablas en una base de datos. Dichas selecciones
se realizan mediante consulta: con la palabra dave SELECT. La forma bésica de una consulta SELECT es
ica SELECT
SELECT * FROM nombreTuble
cen laque el candeter comodin ascerisco (*) indica que sedeben recuperar todas las columnas de la eable
nombreTabla; por ejemplo, para recuperar todos los datos de la tabla autores ut
SELECT * FROM autores
La mayoria de los programas no requieren todos los datos de una tabla. Para recuperar sélo
columnas especificas, reemplace * con una lista de nombres de columna separados por comas; por
cjemplo, para recuperar sélo las columnas idautor y ape HidoPaterno para todas las filas de la tabla
autores, use fa consulta
SELECT idAutor, apellidoPaterno FROM autores
Esta consulta devuelve los datos listados en la Figura 24.11.
z Deitel 4 Quirk
e Dette? 5 Morgane
3 Deitel
| Datos de ejemplo de idautor y ape11idoPaterno de la tabla autores
Observacion de ingenieria de software 24.2
& En general wted proces los resultades conociendo de antemano el orden de las columnas: por ejemplo,
«al elecconar idtutor y apelTicoPaternode astores ascgura que las columnas eparecerin en dl resl-
ado en exe orden exact, La seleccién de clumnas por nombre evita la devolucin de columnas inne-
cesarias y protege contra cambios en el orden real de las columnas de la base de datox. Luego los
programas pueden procsar colunnas de resultados specficando el nimero de columna en el resultado
(comenzande desde el nimero 1 pars la primera columna).
Si asume que las columnas siempre sedevuelven en el mismo orden deste una consulta que usa el aste-
riveo (+), el programa puede procesar los resultados incorrectament. Siel orden de las columnas
em la(s) tablet) cambia os se agregan columnas adicionalesen un memento patria, el orden de las
columnas en el reultado cambiard en consecuencia
a Error comuin de programacion 24.1
24.4.2 Clausula WHERE
En ls mayoria delos casos es necesario ubicar fas en una base de datos que satisfagan ciertos criterios
de seleccién. Sélo se seleccionan has filas que satisfacen los criterios de seleccién (Formalmente llama-
dos predicados). SQL usa la cldusula WHERE opcional en una consulta para especificar los crterios de
seleccién para ésta. La forma bésica de una consulta con eriterios de seleccién es
SELECT nombrCohiomnal, nombreColumne2, ... FROM nombreTabla WHERE criterios[Link] t0nL
Por ejemplo, para seleccionar las columnas Titulo, numeroEdicion y copyright de la tabla titulos
paralos que la fecha de copyright (derechos de autor) es mayor que 2013, utilice la consulta
SELECT Titulo, numeroEdicion, copyright
FROM titulos
WHERE copyright > ‘2013
Las eadenas en SQI estan delimitadas por commillas simples (*) en lugar de dobles ("). La Figura 24.12
muestra el resultado de la consulta anterior.
Java How to Program, Late Objects Version 10 201s
Visual Basic 2012 How to Program 6 2014
Visual C# 2012 How t0 Program 5 nou
e+ Hom t0 Program 3 2014
Android How to Program 2 201s
Androtd for Programmers: An App-Driven 2 201s
Approach, Volume 1
Fig. 24.12 | Muestra de ttulos con derechas de autor (copyright) después de 2013 de la
tabla titulos:
Coincidencia de patrones: cero 0 més caracteres
Los criterios de la clausula WHERE pueden contener los operadores <>, <=, >=, =| & (no igual) y LIKE.
El operador LIKE se utiliza para la coincidencia de patrones con caracteres comodin porcentaje (8)
y guion bajo (_). La coincidencia de patrones permite que SQL busque cadenas que coincidan con
tun patrén determinado.
Un patrén que contiene un caricter de porcentaje (8) busca cadenas que tienen cero 0 més caracteres,
en la posicién del caricter de porcentaje en el patrén; por ejemplo, la siguiente consulta ubica las filas
de todos los autores cuyo apellido comicnza con Is letsa 0:
SELECT 1éautor, prinerNombre, apellidePaterno
FROM autores
WHERE apel1idoPaterno LIKE 'D%"
Esta consults selecciona las dos filas que se muestran en la Figura 24.13; tres de los cinco autores
tienen un apellido paterno que comienza con la letra D (seguida de cero o mds caracteres). El simbolo
en el patrén LIKE de Ia cléusula WHERE, indica que cualquier niimera de caracteres puede aparecer
después de la letra Den el ape1idoPaterno. La cadena del patrén esté rodeada por caracteres de
comiillas simples.
1 Paul Deitel
2 Harvey Deitel
a Abbey Deitel
Fig. 24.13 | Autores cuyo apelido comienza con D de la tabla autores.1012 Capitulo 24 Acceso a bases de datos con JDBC
Tip de portabilidad 24.1
Consult la documentacién de su sistema de base de dates para deerminar i SQL disingue entre max
plsculasy minisculas en su sistema, y para determinar ls sntaxis de les palabras clave de SQL, como
el operador LIKE.
Coincidencia de patrones: cualquier personaje
Un guion bajo () en la cadena del patrin indica un tinico caréter comodin en esa poscin nel pattén.
La siguiente consulta, por ejemplo, ubica las filas de todos los autores cuyos ap
con cualquier caricter(especificado por _), seguido de la letra 0, seguido de cualquier niimero de carac-
teresadicionales (especificado por):
SELECT idAutor, prinerNombre, apellidePaterno|
FROM autores
WHERE apelTidoPaterno LIKE '_oX'
La consulta anterior produce la fila que se [Link] la Figura 24.14, porque sélo un autor en nuestra
base de datos tiene un apellido que contiene I: let © como segunda letra.
Miguel Morgano
Fig. 24.14 | Eldnico autor de la tabla autores cuyo apellide contiene
© como segunda letra
24.4.3 Clausula ORDER BY
Las filas del resultado de una consulta se pueden clasificar en orden ascendence o descendente me-
diante la clusula ORDER BY opcional. La forma basica de una consulta con una cléusula ORDER BY es
SELECT nambreColumnat, nombreColumne2, ... FROM nombreTabla ORDER BY columns ASC
SELECT nombrCohonna!, nombreColumne2, ... FROM nombreTabla ORDER BY colvmne DESC
donde ASC especifica un orden ascendente (de menor a mayor), DESC especifica un orden descendente
(de mayor a menor) y columna especifica la columna en la que se basa la clasificacién; por ejemplo,
para obtener la lista de autores en orden ascendente por apelido (Figura 24.15), utilice la consulta
SELECT idAutor, prinerNombre, apellidePaterno
FROM autores
ORDER BY apelTidoPaterno ASC
2 Paul Deitel
2 Harvey Defect
3 Abbey Deitel
4 Miguel Norgano
5 an quirk
Fig. 24.15 | Datos de muestra de la table autores en orden ascendente por Apelido.244 SQL 01s
Ordenamiento descendente
Bl orden de clasificacién predeterminado es ascendente, por lo que ASC es opcional. Para obtener la
misma lista de autores en orden descendente por apellido (Figura 24.16) utilice la consulta
SELECT i¢Autor, prinerNombre, apellidePaterno
FROM autores
ORDER BY apelTidoPaterno DESC
4 Den ‘Quirk
s Miguel Morgano
a Paul Deitel
2 arvey Dette?
3 aobey Deitel
Fig. 24.16 | Datos de muestia dela tabla autores en orden descendente por ape idoPatsrne
Ordenar por varias columnas
Se pueden usar varias columnas para ordenar con una cléusula oRDER BY del formulario
ORDER BY colemnal tipaDeOrden, columne2 tisoDeOrden,
donde tipoDcOnden es ASC 0 DESC. El tipeDcOrden no tiene que ser idéntico para cada columna. La
consulta
SELECT idAutor, prinerNombre, apellidePaterno
FROM autores
ORDER BY apelTidoPaterno, primerNoabre
ordena todaslas filas en orden ascendente por apeliido paterno, luego por nombre. Si alguna fila tiene
<1 mismo valor de apellido paterno, se devuelve ontenada por primer nombre (Figura 24.17).
3 ‘Abbey Deitel
2 Harvey Deitel
1 asl Deitel
5 Miguel Nergano
4 as quien
Fig. 24.17 | Datos de muestra de los autores en orden ascendente por ape idoPaterno y primerNoabre
Combinando las cldusulas WHERE y ORDER BY
Las cléusulas WHERE y ORDER BY se pueden combinar en una consulta, como en
SELECT ISBN, Titulo, nunerofdicion, copyright
FROM titulos
WHERE Titulo, LIKE "How to Progran’
ORDER BY Titulo ASC1014 — Capitulo 24 Acceso a bases de datos con JDBC
que devuelveel ISBN, el tuto, el nunerofdicion y copyright de cada libro en la tabla de ti tulos que
un titulo que termine con "How to Progran" y los clasifica en orden ascendente por titulo.
Los resultados de la consulta se muestran en la Figura 24.18,
(o13299044x How to Program ’ 2013
0133378713 Cae How to Program . 201s
132151006 Internet & World Wide Web How to Progras 5 2oz
(0133807800 Java How to Program 10 2ois
(0133406954 Visual Basic 2012 How to Program 5 201s
0133379337 Visual C# 2012 How to Frogram 5 2014
130151574 Visual C+ 2008 How to Program 2 2008
Fig. 24.18 | Ejemplos de libios de la table titutos cuyos ttulos terminan con How to Program, y estén
ordenados en forma ascencente por medio de la columna titulo
24.4.4 Fusionar datos de varias tablas: INNER JOIN
Los disetadores de bases de datos a menudo dividen los datos relacionados en tablas independientes
para garantizar que una base de datos no almacene datos de forma redundante. Por ejemplo, en la base
de ditos libros, la tabla ‘sbnAutor almacema los datos de rlacién entre los autores y sus titulos correspon-
dientes. Sino separamos esta informacién en tabs individuales, necestarfamos induirla informacién dl
autor con cada encrada en la tabla vitutes. Esto darla lugar a que a base de datos almacenara informacion
de autor duplicada, para autores que excribieron varios libros. A menudo es necesario fusionar datos de
varias tablas en un solo resultado, denominado unin de tabas; esto se especifica mediante un operador
INVER 200%, que fasiona fils de dos tablas al hacer coincidirlos valores en columnas que son comuncs &
fas tablas, La forma bésica de INNER JOIN es:
SELECT columnaNombrel, nombreColumna2
FROM tabla
SINNER JOIN tabla2
ON [Link] = [Link]
[a cléusula 0 de TANER OTN especifica las columnas de cada tabla que se comparsn para derer-
minar qué filas se combinan: una es una clave primaria y la otra es una clave externa en las tablas que
se unen; por ejemplo, la siguiente consulta produce una lista de autores acompafiada de los ISBN de
los Tibros escritos por cada autor
SELECT primerNonbre, apellidoPaterno, isa
FROM autores
INNER JOIN isbnéutor
ON autores. idautor = [Link]
‘ORDER BY apellidoPaterno, primerNonbre
La consulta fasiona las columnas prinesNonbre y ape11doPaterno dela tabla autores con la colum-
na isbn de la tabla isbnAutor, oxdenando los resultados en orden ascendente por apel1doPaterno244 SOL 101s
y primesNombre. Tenga en cuenta el uso de la sintaxis [Link] en la cléusula
ON. Esta sintaxis, denominada nombre calificado, especifica las columnas de cada tabla que se deben
Todos los programas > Accesories, haga clic con el botén derecho en el Bioc de notas y se-
leccione Ejecutar como administrador. Fn Windows 10, busque Bloc de nosas, haga clic con
al borén derecho en los resultados de la buisqueda y seleccione Avanzado en la barra de la
aplicacién, luego seleccione Ejecutar como administrador.
Desde el Bloc de notas abra el archivo por lotes setEnbedded¢P. bat que se encuentra en la
carpeta db\bin de la carpeta de instalacién de JDK.
Localice la linea
@rem set DERBY_INSTALL=
y cimbielo a
@set DERBY_INSTALL=KIAVA_HOMEX\ db
este archivo.
Guarde sus cambios y
Abra una ventana del simbolo del sistema y cambie a la carpeta do\bin de instalacién
del JDK. Luego escriba setnbedded¢?. bat y presione Enter para configurar las variables de
entorno requeridas por Java DB.
Utilice l comando cd para cambiar ala carpeta de ejemples de este capitulo y luego a lasub-
carpeta ejomplo_1ibras. Esta carpeta contiene un script SQL. [Link] que crea l base de
datos de libros.
Ejecute el siguiente comando (con las comillas) para iniciar la herramienta de linea de co-
mandos de Java DBs las comillas dobles son necesarias porque la ruta que representa la varia:
ble de entorno XJAVA HOMEX contiene un espacio.
"SIAVA_HOMEX\ db\bin\i.
En d indicador +> escriba el siguiente comando y presione Enter para crear la base de datos
de libres en el directorio actual y para crear el usuario deite1 con la contrasefia deitel para
acceder a la base de datos:
connect ‘jdbc: derby: Tibros ;createstrue;user-deitel; passvord=deitel';
Para crear la tabla de la hase de datas ¢ insertar datos de muestra en ella, proporcionamos el
archivo libros.sq1 en el directorio de este ejemplo. Para cjecutar este scripe SQL, escriba
run ‘[Link]";
Una ver que crea la base de datos, puede ejecutar las sentencias SQL. presentadas en la sec-
ci6n 24.4 para confitmar su ejecuci6n. Cada comando que ingrese en el indicador 13> debe
terminar con un punto y coma (;).
Cambie los directorios 2 la subcarpeta ejenplo_libreta direcciones de la carpeta cap24
cjemplos, que contiene el script SQL. HibretaDi [Link] que crea la base de datos de la
libreta de direcciones. Repita los pasos 6 al 9. En cada paso, reemplace libros con 1a Vibreta
de direcciones.1020 Capitulo 24 Acceso a bases de datos con JDBC
10. Para finalizar la herramienta de linea de comandos de Java DB, escriba
exit:
Ahora esté listo para cjecutar los gemplos de este capitulo.
24.5.2 Creacién de las bases de datos del capitulo en macOS
Después de configurar la variable de entorno JAVA_HONE, ralice loss
nts pasos
1, Abra una Terminal, luego escriba:
DERBY_HOME=/Library/Java/JavaVi rtualMachines/jdk1.8.0_112/Contents/Home/db
y presione Enter. Luego escriba
export DERBY HOME
y presione Euter. Esto especifica dénde se encuentra Java DB en su Mec.
2. En laventana Terminal cambie los directoriosa la carpeta db/bin de la carpeta de instalacién
del JDK. Luego escriba ./setémbeddedC? y presione Enter para configurar las variables de
entomno requeridas por Jeva DB.
3. En la ventana Terminal use el comando ed para cambiar al directorio ejenplos libros. Este
directorio contiene un script SQL [Link] que crea la base de datos de libros.
4, Ejecute el siguiente comando para iniciar la herramienta de linea de comandos para interac-
tuar con Java DB:
SJAVA_HOME/db /bin/i}
5. Realice los pasos 7 al 9 dela seecién 24.5.1 para erear la base de datos de Vibros.
Ahora esté listo para cjecutar los ejemplos de este capitulo.
24.5.3 Creacién de las bases de datos del capitulo en Linux
Después de configurar la variable de entorno JAVA HONE, realice los sig
antes pasos:
1. Abra una ventana shell,
2. Realice los pasos de la seccién 24.5.2, pero en el Paso ! configure DERBY HONE en
DERBY HOME=YourLinusDKIntllationFolder/ Sb
En nuestro sistema Ubuntu Linux, escribimos:
DERBY_HONE=/usr/1ib/vm/java~7-oracle/db
Ahora esté listo para gecutar los ejemplos de este capitulo.
24.6 Conexién y consulta de una base de datos
El ejemplo de la Figura 24.23 realiza una consulta simple en la base de datos de Tibros que recupera
la tabla autores completay muestra los datos. El programa ilustra I conexién ala base de datos, hacer24.6 Conexién y consulta de una base de datos 1021
tuna consulta y procesar el resultado. La revisién que sigue presenta los aspectos clave de JOBC del
programa.
// Fig. 24.23: MostrarAutores. java
// Nisuatizacién del contenido de la tabla autores.
‘mort [Link] .Connection
‘mort [Link] Statement;
‘mort java.sq1-DriverManager;
‘mort [Link] ResultSet;
import java.sq1 ResuleSetMetadata;
‘mort java.sq1 -SQLException;
public class Mostrarautores {
}
public static void main(String args(]) {
final String DATABASE URL = "jdbc:derby:1ibros”:
final String SELECT QUERY =
‘SELECT idAutor, primerNoabre, apel1 idoPaterno FROM autores’
// usa try con recursos para conectarse y consultar 1a base de datos
try ¢
Connection conexion = [Link](
DATARASE_URL, "
Statement instruccion = [Link]();
ResultSet conjuntoResultado = [Link] (SELECT QUERY) {
// obviene los metadatos de conjuntoResultado
ResultSetMetaData netaData = conjunteResuItado. getMetaData (
int numeroDeColunnas = [Link] ( ;
[Link]("Tabla autores de base de datos de Tibros: ako");
// mostrar los nombres de las columnas en e1 ResultSet
for Cint 4 = 1; 4 < mumeroColunnas; 144) {
[Link]™-s0\0", metaData. getColunnNaneCi)) :
¥
[Link];
// mestra los resultados de la consulta
while ([Link]) {
for (int i = 1; i <= mumeroColumnas; i++) {
[Link]('s£2\0", [Link](i))
}
[Link]. printing;
,
}
catch (SQLException excepcionSql) {
excepcionSql .printStackTrace();
?
Fig. 24.23 | Visualizacién del contenido de la table autores. (Parte | de 2.)1022 Capitulo 24 Acceso a bases de datos con JDBC
Tabla autores de base de datos de Vibros:
DAUTOR PRIMERNOMBRE _APELLIDOPATERNO
1 Paul Deitel
2 varvey Deitel
3 Abbey Deitel
4 an Quirk
5 Michael Norgano
Fig. 24.23 | Visualizacién del contenido de la table autores. (Parte 2 de 2.)
Las lineas 3-8 imporsan las interfaces y clases JDBC del paquete java.sa1 utilizado en este pro-
‘grama. El método main se conecta a la base de datos de libros, consulta la base de datos, muestra el
resultado de la consulta y cierra la conexién ala base de datos. La linea 12 declara una cons-
ante String para la URL de la base de datos. Esto identifica el nombre de la base de datos a la cual
conectarse, asi como la informacién sobre el prococolo utilizado por el controlador JOBC (que se
explicard en breve). Las lineas 13-14 declaran una cadena constante que representa la consulta SQL
que scleccionaré las columnas idAutor, primerNonbre y apelidoPaterno de la tabla de autores de la
basede datos.
24.6.1 Deteccion automatica de controladores
JDBC admite la deteccién automatica de controladores: carga el controlador de la base de datos
«en la memoria por usted. Para asegurarse de que el programa pueda ubicar la clase del controlador,
debe incluir la ubicacién de la clase en la ruta de clases del programa cuando ¢jecute el progra-
ma. Ya hizo esto para Java DB en la seccién 24.5 cuando ejecuté el archivo setEmbeddedCP..bat
0 setEnbeddedCP en su sistema; ese paso configuré una variable de entomo CLASSPATH ena ventana de
comandos para su plataforma, Después de hacerlo puede ejecutar esta aplicacién simplemente usindo
‘el comando
Java Mostraraucores
24.6.2 Conexién a la base de datos
Las interfaces JDBC que usamos en este ejemplo amplian la interfaz AutoCloseable, por lo que pue-
de usar objetos que implementan estas interfaces con la instruccién try con recursos (lineas 17-45).
Las lineas 18-21 crean los objetos AutoClaseable de este ejemplo, que se cierran cuando el bloque
try termina (linea 42) 0 si ocurre una excepcién durante la ejecucién del bloque try. Cada obje-
to creado entre paréntesis despues de la palabra clave try debe estar separado del siguiente por un
punto y coma (;).
Las lineas 18-19 crean un objeto Connection que administra la conexién entre el programa Java
y la base de dates. Los objetos Connection permiten a los programas crear instrucciones SQL que
manipulan bases de datos. Fl progeama inicializa canexion con el resultado de una llamada al metodo
«estético getConnection de la clase Drivertianager. Los argumentos del método son:
+ un objeto String que especifique la URL de la base de datos,
+ un objeto String que especifica el nombre de usuario y
+ un objeto String que especifica la contrasefia.24.6 Conexién y consulta de una base de datos 1023
Este método intenta conectarse a la base de datos especificada por su argumento URL; si no
puede, lanza una SQLExceot ion (paquete [Link]). Elnombrede usuario y a contrasefia para la base
de datos de libros fueron establecidos en la seccién 24.5 cuando creé la base de datos. Si alli usé
un nombre de usuario y contrasefia
zente, deberi reemplazar el nombre de usuario (segundo
argumento) y la contrasefia (tercer argumento) pasados al método getConnection en las Iineas
1s.19,
La URL localiza la base de datos. En los ejemplos de este capitulo la base de datos esté en la
computador: local, pero podria residir en una red. La URL jdbe:derby:1ibros especifica:
+ cl protocolo de comunicacién (jab),
+ cloubprosocolo de comunicacién (derby) y
+ el nombre de la base de datos (1ibros).
El subprotocolo derby indica que el programa utiliza un subprotocolo especifico de Java DB/Apache
Derby para conectarse a la base de datos; recuerde que Java DB es simplemente la versién dela marca
Oracle de Apache Derby. La Figura 24.24 enumera los nombres del controlador JDBC y los formatos
URL de la base de datos de varios RDBMS populares.
Observacién de ingenieria de software 24.3
La maypria de lo sistemas de administracin de bases de datos equieren que el usuario inicie sesiin
‘amues de acceder al contenido de la base de datos. El método getConrection de Oriversanager estd
sober ere econ ron eran preproer membrdeeiar7 oee
(para obsener acceso.
cto ee Ree
MySQL /hosname: mimerrDePuerts/nombreBaseDeDitos
ORACLE jdbe-orsce:thin:hastname:mimeraDePuerta:nembreBaseDeDator
DB2 jdbc: ab: houname:nimeroDePuerto/nombreBaseDeDatos
PosigreSQL. segresal://hestnane:nimeroDePuerto/nembreBastDeDatos
Java DB/Apache Derby wombreBaseDeDatos (incrustado; usado en este capitulo)
‘shosename: nimeroDePuerto/nombreBaseDeDatos red)
Microsoft SQL Server jdbc: salserver://hostname: nimeroDePuerto;nonbrebaseDedatos=nombre-
BaseDeDatos
Sybase jdbc: sybase Tds:miimeroDePuertolnombreBaseDeDatos
Fig. 24.24 | Formatos popuiares de URL de bases de datos JDBC.
24.6.3 Creacién de un Statement para ejecutar consultas
La linea 20 de la Figura 24.23 invoca el método de Connection createStatenent para obtener un ob-
jero que implementa la instruccidn de incerfaz (paquete [Link]). Utliza un objeto Stacenent para
enviar instrucciones SQL a la base de datos.
24.6.4 Ejecucién de una consulta
La linea 21 usa el método executequery del objeto Statement para enviar una consulta que selecciona
toda a informacidn del autor de la tabla autores. Este método devuelve un objeto que implementa la
interfaz Resul Set y contiene ls resultados de la consulta.1024 Capitulo 24 Acceso a bases de datos con JDBC
24.6.5 Procesar el Resul tSet de una consulta
Las ineas 24-41 procesan el ResultSet. La linea 24 obtiene el objeto ResultSetMetabata de Result
Set (paquete [Link]). Los metzdatos describen el contenido del ResultSet. Los programas pueden
utilizar metadatos mediante programacién para obtener informacién sobre los tipos y nombres de
columnadel ResultSet. La linea 25 usa el mérodo getColunnCount de Resul tSetMetaData para recuperar
el ntimero de columnas en el ResultSet. Las lineas 30-32 muestran los nombres de las columnas.
Observacién de ingenieria de software 24.4
Los metadacespermiten ales programas procesarelcontenidade Resu1tex de forma dindmica cuando
no e conoce de antemano informacién deallada sobre el ResultSet.
Las lineas 36-41 muestran los datas en cada fila de ResultSet. Primero el programa coloca el cur-
sor ResultSet (que apunta a la fila que se esté procesando) en la primera fila. El método next (linea
36) devuelve un valor booleano verdadero si puede posicionarse en la siguiente fila; de lo contratio, el
método se devuelve falso para indicar que se ha alcanzado al final del ResultSet.
Error comtin de programacién 24.5
! Inicialmente un cursor Resut See st coloca antes de la primera fila. Se produce una SOLException
si intenea acceder al contenide de un ResuleSee antes de colocar el cursor ResultSet en la pric
‘mera fila com el nétodo siquiente
Si ResultSet tiene filas, ls lineas 37-39 extraen y mucstran el contenido de cada columna en la
fila actual. Cada columna se puede extraer como un tipo especifico de Java: el método getCol uasType
de ResultSetMetaData devuclve un entero constante de la clase Types (paquete [Link]) que indica
‘tipo de una columna determinada. Los programas pueden usar estos valores en tna instruccién switch
para invocar métodos ResultSet que devuelven los valores de columna como tipos de Java apropiados;
por ejemplo, si el tipo de una columna ¢s Types. INTEGER, el método getint de ResultSet obtiene
cl valor de fa columna como un int; para simplificar, este ejemplo trata cada valor como un Object.
Recuperames el valor de cada columna con el método get0bject de ResultSet (linea 38), luego
mostramos la representacién String del objeto. Los métodos et de ResultSet normalmente reciben
‘como argumento un niimero de columna (como un int) o un nombre de columna (como un objeto
String) que indica el valor de la columna por obzene. A diferencia de los indices dearreglo, los mimeros de
columna de Resu\tset comienzan en 1,
Error comtin de programacién 24.6
OG Expecifcar ol indice de columma 0 al obtencr valores de um RemsIeSet proves uit SQLException:
el indice dela primera columna en un ResultSet essiempre 1
igs, Tip de rendimiento 24.1
ca Si una consulta especifica ls columnas exacts paraselecionar dela bave de dato, el ResuteSet contie-
ne la columnas en elerden especficado, Para este escenario, usarel nimero de colunna para obtener
cl nalor de la colunna es ds eficiente que ssar el nombre de la columna. E\ mimero de columna
proporciona acceso directo a la columns especficada. El uso del nombre dela colunna requiere
tuna biiiqueda de los nombres de la columnas para ubicar la colunina adeeuada.
Tip para prevenir errores 24.1
El uso de nombre: de colurana para obtener valores de un Resutset produce wn ebdigo que e1 menos
‘propense a errores que obtener valors por niimero de columna; noes necesario recordar elorden de las
columnas. Ademis si te cambia, su cdigo no tiene que modifcerse.24.7 Consultar la base de datos de Vibros 1025
Cuando se alcanza el final del bloque try (linea 42), se llama al método close en los objetos
ResultSet, Statement y Connection que se obtuvieron al comienzo de la instruccién try con
Error comin de programacion 24.7
YS Se produce wna SaLException si intenta manipular un resultSet después de cerar la Stavement que
Oo cered. El ResuleSee se desarta cuando s ciera la Statement.
Observacién de ingenieria de software 24.5
Cada objeto Statement puede abrir slo un objeto kesuitSet a la vez. Cuando un Statement
devuelve un nuevo Rese1eSet, el objets Stavenene circ objeto Stavenene anterior. Para wilizar wavios
Resuteset en paralelo, los objeto: Seavenentscparadhs deben devoler los Resul Set.
24.7 Consultar la base de datos de libros
A continuacién presentamos una aplicacién MostrarResutadosCorsulta que le permite ingresar una
consulta SQL y ver aus resultados. La GUI utiliza una combinacién de controles JavaFX y Swing
“Mostramos los resultados de a consulta en un JTable de Swing (paquete [Link]), que puede ser
completsdo dindmicamente desde un ResultSet a través de un Tableilode) (paquete [Link]
table). Un Tableliadel proporciona mérados que un ITable puede Hamar para acceder a lox
datos de un ResultSet. Aunque el control TableView de JavaFX proporciona capacidades de
enlace de datos (como las del capitulo 13), la combinacién de JTable y TableNodel es mas po-
derosa para mostrar datos de Resu?tSet.
24.7.1 Clase ConjuntoResu] tadoTableModel
La dase ConjuntoResuttadoTableMode! (Figura 24.25) es un TableMode! que realiza la cone-
én a la base de datos y manticne cl ResultSet. La clase exticnde la clase AbstractTabletode!
(paquete javax. swing. table) que implementa la interfaz TableNodel. Conjuntokesul tadoTable-
Wodel sobrescribe a los métodes getColuanClass, eetColunnCount, getColumnNane, getRonCount
y oetValucht de TableMode!, segiin cl ResultSet actual. Las implementaciones predeterminadas de
los métodos isCe11Edi table y setValuest de TableMode? (proporcionadas por AbstractTableModel)
no se anulan, porque este ejemplo no admit la edicién de las celdas JTable. Las implemeataciones
predeterminadas de lor métodos addTabaModelLis tener y ranoveTablellodelListenar (provistat
por AbstractTableModel) de TableMedel no se anulan, porque las implementaciones AbstractTa-
bleMode! de estos métodos agregan y climinan correctamente los oyentes para los eventos que ocu-
seen cuando cambia in Tab!eModat
// Fig. 24.25: ConjuntoResultadoTableModel java
7/ Un TableNodel que proporciona datos ResultSet a una JTable
‘mort [Link] .Connection;
‘mort [Link]]-Statenent;
‘mort java.sq1 -DriverManager;
‘import [Link] ResultSet;
‘mort [Link]]-ResultSetMetaData;
‘mort [Link] -SQLexception;
‘mort [Link]. table. AbstractTablelodel ;
Fig. 24.25 | Un Tablexode! que proporciona datos ResultSet a una JTable. (Parte | des.)1026 Capitulo 24 Acceso a bases de datos con JDBC
"
2
3
4
1s
16
7
19
20
2
2
23
24
2s
26
27
28
29
20
31
32
33
34
35
36
a7
38
29
40
4a
4a
a3
4s
46
at
48
49
50
31
32
33
34
35
56
37
38
39
60
6
@
// as Filas y columas del objeto ResultSet se cuentan desde 1 y
// Jas Filas y columas del objeto JTable se cuentan desde 0. Al procesar
// Filas 0 columnas de ResultSet para usarlas en un objeto Table, es
// necesario sumar 1 al niimero de fila o colusna para manipular
// 1a colunna apropiada del objeto ResultSet (es decir, 1a colunna 0 de JTable
7/ es 1a columa 1 de ResultSet y la fila 0 de JTable es la fila 1 de ResultSet).
public class ConjuntoResultadoTableModel extends AbstractTableModel {
private final Connection conex to
private final Statement instruccior
private ResultSet conjuntoResul tados;
private ResultSetMetaData metaDatos:
private int numeroDeFilas;
// vealiza un seguimiento del estado de 1a conexién de 1a base de datos
private boolean conectadoABaseDatos = false;
// el constructor inicializa Resultset y obtiene su objeto de metadatos;
// determina el nimero de filas
publ ic ConjuntoResul tadoTableModel (String url, String nombreusuario,
String contracenia, String consulta) throws SQLException {
// conecta a 1a base de datos
conexion = [Link](url, nonbreusuarie, contrasenia);
// crea objeto Statement para consultar 1a base de datos
‘instruccion = [Link](
ResultSet. TYPE SCROLL INSENSITIVE, [Link] READ ONLY);
// actualiza el estado de conexién de 12 base de datos
conectadoAbasedates = true}
// establecer 1a consulta y ejecutarla
setConsulta(consulta) ;
}
// obtener la clase que representa el tipo de columna
publ ic Class getColuanClass(int colunna) throns TllegalStatetxception {
// asegura que la conexiéa a 1a base de datos esté disponible
4f CleonectadosBaseDatos) {
throw new THlegalStateException(’No hay conexion a la base de datos!
}
// deverminar 1a clase de colunna de Java
ery f
String nonbreClase = [Link](colunna + 1);
1/ devuelve e1 objeto Class que representa className
return Class. forNane (nombreClase);
$
catch (Exception excepcion) {
[Link] :
}
Fig. 24.25 | Un Tablesode! que proporciona datos ResultSet a una JTable. (Parte 2 des.)24.7 Consulta’ la base de datosde libros 1027
6s return [Link]; // si ocurren problemas en el codigo anterior, asume
el tipo Object
oF
65
66 —_// obtiene el numero de colunnas en e1 objeto ResultSet
67 public int getColumnCount() throws T11egalStateException {
68 // verifica que esté disponible la conexién a la base de datos
69 ‘Af ClconectadosBaseDatos) {
10 throw new TllegalStateException('No hay conexién a la base de datos’
n ?
2
a // devermina el nimero de colunnas
™ try {
7 return metadates .getColumcount ©;
16 }
1 catch (SQLException excepcionSq!) {
78 excepcionSql .printStackTrace();
19 y
80
ar return 0; // si ocurren problemas en el cédigo anterior, devuelve 0 para
el nimero de colunnas
sy
83
84 —_// obtiene el nonbre de una columa especifica en el objeto ResultSet
85 public String getColumnNameCint columns) throws TNegalStatefuception {
86 // verifica que esté disponible la conexién a la base de datos
87 if CleonectadadfazeDatos) {
88 throw new TllegalStateException(’No hay conexion a la base de datos");
89 y
90
0 // devermina el nonbre de 1a columna
92 wry t
93 return [Link](columa + 1);
4 r
95 catch (SQLException excepcionSql) {
96 excepcionSal .printStackTrace():
97 }
90
99 + // si bay problemas, devuelve 1a cadena vacia para el nonbre
de Ta’ columa
100}
102 // devuelve e1 numero de Filas en el objeto ResultSet
103 public int getRowcount() throws Tiegalstateexception {
104 // verifica que esté disponible la conexién a la base de datos
105 ‘If ClconectadosBaseDatos) {
106 throw new TllegalStateException(’No hay conexion a la base de datos");
107 }
108
109 return numeroDeFi las;
10}
nt
112 // obtiene el valor en 1a Fila y columna especificas
113 public Object getValueat(int fila, int columna)
4 ‘throws FVegalstateexception {
Fig. 24.25 | Un Tablexode! que proporciona datos ResultSet a una JTable. (Parte 3 des.)Capitulo 24 Acceso a bases de datos con JDBC
// verifica que esté disponible la conexién a la base de datos
if CleonectadosBaseDatos) {
throw new TilegalStateException(’No hay conexion a la base de datos");
}
// obtiene un valor en una fila y columna especificadas del objeto ResultSet
try £
conjunteResu? [Link](fila + 10;
return conjuntoResultados..getdbject(columna + 1);
}
catch (SQLException excepcionSq!) {
excepcionSql .printStackTrace();
}
return"; // si hay problemas, devuelve el objeto cadena vacia
>
// establece nueva cadena de consulta en 1a base de datos
public void setConsuTta(String consulta)
‘throws SQLException, T1legalStateException (
// verifica que esté disponible la conexion a la base de catos
if CleonectadosBaseDatos) {
throw new TllegalStateException(’No hay conexion a la base de datos");
}
// aspecifica 1a consulta y Ta ejecuta
conjuntoResultados = [Link] (consulta) ;
// obviene metadatos para e1 objeto ResultSet
metaDatos = conjuntoResuTtados. getmetadara() ;
// obtiene metadatos para el objeto ResultSet
conjuntoResultados. last); // avanza a la ditina fila
‘uneroDeFi las = conjuntoResultades .getRow(); // obtiene el nimero de fila
FireTableStructureChanged(); // novifica a1 objeto JTable que ol nodelo
ha canbiado
3
// cierva objetos Statement y Connection
public void desconectarDeBaseDatos() {
if (conectadoasasepatos) {
// cierea objetos Statement y Conection
try
‘conjuntoResul [Link]();
[Link]();
‘[Link]():
,
catch (SQLException excepcionsal) {
‘[Link]);
>
Fig. 24.25 | Un Tablevode! que proporciona datos ResultSet a una JTable. (Parte 4 de.)24.7 Consultar la base de datos de Vibros 1029
168 finally { // actualiza el estado de la conexion a la base de datos
169 conectadoABaseDatos = false;
170 ,
im +
2}
13}
Fig. 24.25 | Un Tabtevode! que proporciona datos ResultSet a una JTable. (Parte § de 5.)
Constructor ConjuntoResul tadoTableModeT
El constructor ConjuntoResultadoTableModel (lineas 29-43) acepta cuatro argumentos String: Ia
URL de la base de datos, el nombre de usuario, la contrasefa y la consulta predeterminada para rea-
lizar. El constructor devuelve cualquier excepci6n que se produzca.a la aplicacién que creé el objero
Conjuntokesul tadoTablevode!, para que la aplicacién pueda determinar cémo manejar la excepcién
(por ejemplo, informar un error y finalizar la aplicacién). La linea 32 establece una conexién a la
base de datos. Las Iineas 35-36 invocan el método createStatenent de Connection para crear
tun objeto Statement. Este cjemplo uss una versién de createstatenent que toma dos argu-
mentos: el tipo de conjunto de resulkades y la concurrencia del conjunto de resultados. El tipo de
conjunto de resultados (Figura 24.26) especifica si el cursor del ResultSet puede desplazare en
ambus dirccciones o sélo hacia adelante, y si el objeto ResultSet cx sensible a los cambios realizados
cen los datos subyacentes.
Tip de portabilidad 24.2
Algunes controladores JDBC no admiten tesuleSer desplazables. En tales casos el controlador generl-
‘mente devuelve un Resuteser en el que el cursor silo puede moverse hacia adelante. Para obtener mds
informaciin consulte la documentaciin del controlador desu base de datos.
Intentar mover el curser hacia airks a través den facuttSet cuando el controlador de a base de davos
¥ Error comiin de programacién 24.
no admite el desplazamiemso hacia ards proveca una excepcibn SQLFestureNotSupportedéxcept on
mere
rend
“TVFE_FCRWARO_ONLY Especifica que el cursor de un ResultSet sélo puede moverseen la
direccién de avance (es decis, desde la primera hasta a tia fia
en el ResultSet).
‘TVFE_SCROLL_INSENSITIVE Especifica que el cursor de un ResultSet puede desplazarse en cualquier
diteccién y que los cambios realizados en los datos subyacentes du-
zante el procesamienco de ResulsSet no se reflejan en el ResultSet a
‘menos que el programa vuelva a consulta la base de datos.
‘TVPE_SCROLL, SENSITIVE Especifica que el cursor de un tesuieset puede desplazarse en cual-
quiet direccidn y que los esmbios realizados en los datos subyacentes
durante el procesamiento de ResultSet se reflejan inmediatamente en
cl Resuieser.
Fig. 24.26 | Constantes ResultSet para especificar el tipo del objeto ResultSet1030 Capitulo 24 Acceso a bases de datos con JDBC
Los ResultSet que son susceptibles a los cambios los reflejan inmediatamente después de que se
realizan con los métodos de la interfaz ResultSet. Si un ResultSet no es susceptible a los cambios,
la consulta que produjo el ResuteSet debe cjecutarse nuevamente para reflejar cualquier cambio rea
lizado. La concurrencia del conjunto de resultados (Figura 24.27) especifica si ResultSet se puede
actualizar con los métodos de actualizacién de ResultSet. Este ejemplo usa un ResultSet que es des-
plazable, que no es susceptible a los cambios y sélo es de lectura. La linea 42 (Figura 24.25) invoca el
método setConsui ta (lineas 134-154) para realizar la consulta predeterminada.
‘CONCUR READ ONLY Especifica que un ResultSet no se puede actualizar; los cambios en el
contenido de ResultSet no se pueden reflejat en la base de datos con
los métedos de actualizaciin de ResultSet.
{CONCUR_UPOATABLE Especifica que un ResuteSee se puede actualizar (es decir, los cambios
se pueden reflejar en la base de datos con los
métodos de actualizacién de Resut Set).
Fig. 24.27 | Constantes Resul eset para especificar propiedades de resuttado
Tip de portabilidad 24.3
lunes controladores JDBC no admiten kesatesec acruaizabla. En tales cass el controlador ner-
malmente devuelve un ResultSet de sdlo lectura. Para obtener mds informacién, consulte la documen-
tacién del controlador de su base de datos,
Error comiin de programacién 24.9
iG; Intentar actualizar un ResultSet cuando el controlador de la base de datos no admite ResultSet
actualible proveca SQLFeatureNetSupportedxceptiens.
Método getColunnCTass de ConjuntoResul tadoTableMode1
El método getColumnClass (liness 46-64) devuelve un objeto Class que representa la superclase de
todos los objetos en una columna en particular, La JTable usa esta informacidn para configurar
cl desplegador de celdas predeterminado y el editor de celdas para ea columna en JTable. La linea 54
usa dl método getColunnclassNane de ResultSetMetabata pars obtener el nombre de clase completo
para la columna especificada. La lines 57 carga ls clac y devuelve el objeto Class correspondiente.
Si ocurre una excepcién, el bloque catch en his lineas 59-61 imprime un seguimiento de la pila y la
linea 63 devuelve [Link] (la instancia de Class que representa a la dase Object) como el tipo
predetcrminado. [Nota: en la inca 54 se utiliza el argumento columart. Aligual que los arreglos, los
ntimeros de fila y columna de 3Table se cuentan desde 0; sin embargo, los mimeros de fila y columna
de ResultSet se cuentan desde 1. Por lo tanto, al procesar filas o columnas de ResultSet para su uso
‘en una JTable, es nccesario agregar 1 al ntimero de fila o column para manipular la fla o columns,
apropiada de Resu1tSet.]
Método getCo1umnCount de ConjuntoResul tadoTableModeT
El método getColumnCount (lineas 67-82) devuelve el mimero de columnas en el ResultSet subya-
cente del modelo. La linea 75 usa el método getColunnCount de ResultSetMetadata para obtener el24.7 Consultar la base de datos de libros 1031
mimero de columnas en el ResuitSet. Si ocurre una excepcida, el bloque catch en las lineas 77-79
imprime un seguimiento de la pila y la linea 81 devuelve 0 como el ntimero predeterminado de
columnas.
Método getColunnvame de ConjuntoResultadoTablevodel
El método getColunnNane (lineas 85-100) devuelve el nombre de la columna en el ResultSet
subyacente del modelo. La linea 93 usa el método getColunn\ane de ResuTtSetMetaData para
obrener el nombre de la columna de KesultSet. Si ocurre una excepciéa, el bloque catch en as lineas
95-97 imprime un seguimiento de la pila y la Linea 99 devuelre la cadena vacia como el nombre de
columna predeterminado.
Método getRowCount de ConjuntoResul tadoTab1eModeT
El método getRowCount (lineas 103-110) devuelve el mimero de filas en el Resu1tSet subyacente del
modelo. Cuando el método sorConsul ta (Iineas 134-154) realiza una consulta, almacena el ntimera
de filas en la variable numerobeFitas.
Método getValueAt de ConjuntoResultadoTableNodel
El método getvaluekt (lineas 113-131) devuelve el objeto en una fila y columna en particular del
ResultSet subyacente del modelo, La linea 123 usa el mécodo absolute de ResultSet para colocar
cl cursor ResultSet en una fila especifica. La linea 124 usa el método getobject de ResultSet pari
obtener el objeto Object en una columna especifica de la fila actual. Si ocurre una excepcién, el blo-
que catch en las lineas 126-12
vyacia como valor predeterminado.
.¢ un seguimicnto de la pila y la linea 130 devuelye una cadena
Método setConsul ta de ConjuntoResul tadoTab]eModeT
El método setConsulta (lineas 134-154) ejecuta lz consulta que recibe como argumento para
obtener un nuevo ResultSet (linea 143). La linea 146 obtiene ResultSetetaData para el nuevo
ResultSet. La linea 149 usa el método ast de ResultSet para colocar el cursor ResultSet en la til-
tima fila del Resu1tSet. [Nota: esto puede ser lento si la tabla contiene muchas filas] En la linea 150
utiliza el mérodo gettow de ResultSet para obtener el ntimero de fila para la fila actual en ResultSet.
La linea 153 invoca el método FireTableStructureChanged (heredado de la clase AbstractTableMo-
4e1) para notificar a cualquier JTable que utilice un objeto ConjuntoResultadoTableMede como su
modelo, que la estructura del modelo ha cambiado. Esto hace que 3Tab1e vuelva a Henar sus filas
ycolumnas con los datos del nuevo ResuTtSet. El método setConsul ta arroja cualquier excepcién que
‘ocurra en su cuerpo 2 la aplicacién que invocé setConsuilta.
Método desconectarDeBaseDatos de ConjuntoResu] tadoTableModel
EI método desconectarDeBaseDatos (lineas 157-172) implementa un método de terminacién apro-
piado para la clase ConjuntoResu1 tadoTableMlodel. Un disefiador de clases debe proporcionar un
método puiblico que los clientes de la clase deben invocar explicitamente, para liberar los recursos que
hha utilizado un objeto. En este caso el método desconectarDeBaseDatos cierra ResultSet, Statement
y Connection (lineas 161-163). Los clientes de la clase ConjuntoResultadoTableMode1 siempre
deben invocar este método cuando su implementacién ya no sca necesaria. Antes de que el mé-
todo libere recursos, la linea 158 verifica si la aplicacién esta actualmente conecrada a la base
de datos; si no lo esté, el método retorna a donde fue llamado. El método desconectarDeBaseDatos
establece a conectadoABaseDatos en falso (linea 169), garantizando que los
tancia de Conjuntokesultadorablewode! despaés de que esa instancia ya haya sido terminada. Cada
uno de los otros métodos de la clase ConjuntoResultadeTableModel arroja una TlegalStatetxception
si conectadoABaseDatos es fabo.
es no usen una ins-1032 Capitulo 24 Acceso a bases de datos con JDBC
24.7.2 GUI de la aplic MostrarResul tadosConsulta
La Figura 24.28 muestra la GUI de [a aplicacién (definida en Most rarResu tadosConsulta. fxm1)
con sus etiquetas fxd. En capitulos anteriores se han disefiado diversas GUI de FXML, por ello
en adelante sefialaremos sdle los elementos clave y los métodos de mancjo de eventos implemen-
tados en la clase MostrarResul tadosConsul taControiler (Figura 24.29). Para obtener los detalles
completos del disefio abra el archivo MostrarResul tadosConsul ta. fxm en Scene Builder o vea el
FXML en un editor de texto. El disefio principal de la GUI es un BorderPane con el feid pane Borde;
se usa esto en Ia clase del controlador para agregar dindmicamente un SwingNode que contiene
el Table al centro del SorderPane (seccién 24.7.3). Las areas superior e inferior de BorderPane
contienen GridPane con los otros controles de a aplicacién. Fl controlador de clase define dos
métodos de manejo de eventos:
+ Se llamaa presionarBotonEnviarConsul ta cuando se hace clic en el botdn Enviar consuta.
+ Se llamaa presionarBotonAplicarFi1tro cuando se hace clic en el botén Aplicar filtro.
IE Mostrar los resultados de la consuta o Xx
‘areaTextoconsulta > ST=CT*ROM autores = =
IDAsTOR PRUERNOMERE | _AELLIDOPAT
{sta ela TTableque ts agegada |
dicmicamenta ita del usiaio
et el rtododeineialzscibn ©) Dat
delaclse del cntlado_ | our
inosine tee dt vo: pica fre
campsTextoFTtro
Fig. 24.
| GUI de la aplicacién MostrarResu tadosConsui ta
24.1.3 Clase MostrarResul tadosConsul taController
La dase MostrarResu1tadosConsultaControler (Figura 24.29) completa la GUL, interactiia con
ConjuntoResu! tadoTableModel a través de un objeto JTable y responde a los eventos dela GUI.
No mosramos la subclase de la aplicacién JavaFX aqui (ubicada en MostrarResultadosConsul ta.
java), porque realiza las mismas tareas que ha visto anteriormente para cargar la GUI FXML de la
aplicacién ¢ inicializar el conolador.
// Fig. 24.29: MostrarResu] tadosConsultaCont ro} ler. java
7/ Controlador para 1a aplicacién MostrarResultadesConsulta
‘mort java.sq1 SQLException;
‘import [Link] .regex. PatternSyntaxException;
‘imoort [Link]. SwingNode;
‘mort [Link]-ActionEvent;
Fig. 24.29 | Controlador para la aplicacién MostrarResul tadosConsul ta. (Parte | de 4.)24.7 Consultar la base de datos de libros 1033
8 vax. Fa FAL
9 wafx. scene. control Alert
10 [Link]. control .[Link];
' Javafx, scene. control .TextArea:
2 wafx. scene. control TextField:
12 mort [Link]. layout .forderPane;
15° mort [Link].Jscrol1Pane;
16 vax. swing. JTable;
7 [Link];
18 [Link]. table. TableMode1:
19 imort [Link];
20
21 public class MostrarResultadosConsultaController {
22 GFAML private Borderrane panelBorde;
23. GFYML private TextArea areaTextoConsulta;
24 GFYML private TextField campoTextoFi Itro;
25
26 —// URL de 1a base de datos, nonbre de usuario y contraseha
27 private static Final String URL BASEDATOS = "jdbe:darby:Tibros
28 private static final String NOMEREUSUARIO = “deitel";
29 private static Final String CONTRASENIA = "deitel";
30
31 // Ja consulta predeterminada recupera todes los datos de la tabla de autores
32 private static final String CONSULTA PREDETERMINADA w "SELECT * FROM autores
33
34 // utilizado para configurar JTable para mostrar y ordenar datos
35 private ConjuntoResultadoTableMode1 tablaModelo;
36 private TablefowSorter clasificador;
37
38 public void mtttatizec) {
39 areaTextoConsultta setText(CONSULTA PREDETERYINADADs
40
4 // crea ConjuntoResultadoTableModel y muestra la tabla de 1a base de datos
4a try
a3 // crear Tablevode! para los resultados de CONSULTA PREDETERMINADA
4 tablaModelo = new ConjuntoResul tadoTablevodel (U2 SASEDATOS,
43 NONBREUSUARIO, CONTRASENIA, CONSULTA PREDETERMINADA) ;
46
at // crea una JTable basada en TableModel
48 JTable tablaResultado = new JTable(tablavodelo);
49
50 // configura Va clazificacién de Filss para JTable
st clasificador = new TableRowSorter(tablaMlodelo) ;
32 ‘tablaResu? tado-setRowSorter (clasificador);
33
34 // configurar SwingNode para nostrar JTable, luego agregar a panelBorde
35 SwingNode nodoSwing = new SwingNodeQ);
56 nodoSwing. setContent (new 3Scro11Pane(tablaResultado)) ;
37 panel Borde. setCenter CnodoSwi na
38 }
59 catch (SQLException excepcionsal) {
MostrarResultadosConsulta. (Parte 2 de 4.)
Fig. 24.29 | Controlador para la aplicacié1034 Capitulo 24 Acceso a bases de datos con JDBC
60 wostraralerta(slertType- ERROR, “Error en base de datos",
6 [Link]());
62 ‘[Link](); // conexién cerrada
6 [Link](i); // finalizar 1a aplicacion
64 }
6}
66
67 —_// consulta 1a base de datos y muestra los resultados en JTable
63 PML
69 old prestonartiotonEnviarConsulta(ActionEvent evento) {
10 // realiza una nueva consulta
1m try
2 ‘tablaModelo. setConsu ta([Link] (0);
B }
" catch (SQLException excepcionsql)
6 wostrarAlerta(AlertType. ERROR, "Error en base de datos",
16 ‘[Link]());
W
18 // intenta recuperarse de una consulta de usuario no valida
9 // al ejecutar 1a consulta predeterminada
80 try
ar ‘tablaModelo -setConsulta(CONSULTA PREDETERNINADAD:
82 areaTextoCorsulta. setText (CONSULTA PREDETERMINAD!)
as >
84 catch (SQLException excepcionsql2) {
es mostraralerta(AlertType-ERROR, "Error en base de datos",
86 [Link]());
87 ‘[Link](); // conexion cerrada
[Link](1); // finalizar la aplicacién
89 ,
90 ,
a}
92
93 // aplica el filtro especificado a los resultados
93 er
95 void presionarBotonAplicarFiltro(Actionfvent evento) {
96 String texto = [Link](;
97
98 if (texto. Tength() == 0) {
99 [Link]#Fi Iter(null):
100 }
101 else {
102 try {
103 clasificador. setRowFi Iter (RowFi Tter. regexFiTter (texte));
104 ,
105 catch (PatternsyntaxException pse) {
106 mostrarAlerta([Link], "Error de registr:
107 "Patron de registro incorrecto");
108 +
109 }
10}
ut
112 // muestra un cuadro de didlogo de alerta
Fig. 24.29 | Controlador para la aplicacié
MostrarResultadosConsulta. (Parte 3 de 4.)24.7 Consultar la base de datosde Tibros 1035,
private void mostraralerta¢
AlertType tipo, String titulo, String mensaje) {
Alert alerta = new Alert(tipo);
[Link](titule)
[Link](mensaje) ;
[Link] tO;
+
120 }
[ieaniesmninietcome CSCS lt et acs
ela tata autores.
SELECT" FROM aores
brook terto 0 ‘oben ro
— b) Mostar el nome yapelide dels autres
1B Meszaros essa de laconsuta BD % | to con los titosy nimero de ecion
SELECT pinerNombre, plidPateno, tio, naneotaien 5 —
ace i)
ert lh ael etal
INNERJOWN tudes ON ktnaaori
noc tao ct |
eaten carne
a a i ere
‘SELECT primerNombre, apellidoPatemo, titulo, numeroidicion | saafmocn cite.
tener charterer || EK
Fmewoue | wEMoMENG | Tmua aeneencoN
ba os Garou gr
fe
[imal ope :
vectcaw [n
Fig. 24.29 | Controlador para la aplicacién MostrarResul tadosConsul ta. (Parte 4 de 4.)1036 — Capitulo 24 Acceso a bases de datos con JDBC
Campos static
Las lineas 27-29 y 32 dedlaran la URL, el nombre de usuario, la contrasefiay la consulta predetermi-
nada que se pasan al constructor ConjuntoResultadsTableMode1 para realizar la conexién inicial
a la base de datos y ls consulta predeterminada.
Método de initialize
Cuando el FaM™LLoader llama al método initialize del controlador, las lineas 44-45 crean un objeto
ConjuntoResu tadoTab1eYodel, lo asignan a la variable de instancia TableMode! (declarada en la It
nea 35) y completan la GUI. La linea 48 crea el objeto JTable que mostraré el ResultSet de Con-
juntoResuI tadoTableMode1. Aqui se usa el constructor JTable que recibe un objeto TableMode1. Este
constructor registra JTable como un oyente de Tab] dodelEvents generado por el ConjuntoResul-
tadoTableMode1. Cuando ocurren rales eventos, por ejemplo, cuando ingresa a una nueva consulta
y presiona Enviar consulta, JTable se actualiza auromiéticamente, basado cn el ResultSet actual de
‘ConjuntokesultadoTabletodel. Si se produce una excepcién cuando Conjuntosesul tadoTablevodel
intenta realizar la consulta predeterminads, las lineas 59-64 detectan la excepciém, muestran un cua-
dro de didlogo de alerta (lamando al mérodo mostrarAlerta en las lincas 113-119), cierran la cone-
xin y finalizan la aplicac
Las JTable permite a los usuarios ordenar filas por datos en una columna especifica. La linea 51
crea un TableRowSorter (del paquete [Link]. table) y lo asigna al clasificador de variables de
nstancia (declarado cn la inca 36). La TableRonSorter usa nucstro ConjuntoResul tadoTabTeModel
para ordenar filasen 3Table. Cuando el usuario hace clic en el rtulo de una columna de 3Table en par-
ticular, TableRowSorter interactia con el TableMode1 subyacente para reordenar las filas en funcién
de los datos de esa columna, La linea 52 usa el método settonSorter de 3Table para espec
TableRowSorter paralla tablaResul ado,
Las lineas 55-57 crean y configuran un Swinglode. Esta clase Java SE.8 le permite incrustar con-
soles de GUI de Swing en las GUI de JavaFX. El argumento del método setContant de SwingNode
sun 3Component: la superclase de todos los controles GUI de Swing. En este caso pasamos un nuevo
objewo IScrot1Pane, una subclase de Component, que inicializamos con JTable. Un 3Scro11Pane
proporciona barras de desplazamiento para las campanentes de la GUI de Swing que tienen m4:
contenido para mostrar del que puede caber en su érea en la pantalla. Para una JTable, depen-
diendo de su nimero de filas y columnas, 3Scro11Pare proporciona automaticamente barras
de desplazamienco vertical y horizontal segiin sea necesario, La linea 57 conecta el SwingNode al érea
central del BorderPane.
ihyge Observacion de ingenieria de software 24.6
La clase SwingNode permite reuilizar la GUI de Swing exsente o controle de Swing expecificsin-
crutdrdolor on nucvas aplicaciones JavaFX.
Método presionarBotonEnviarConsulta
‘Cuando el usuario hace clic en el borin Enviar consulta, el método presionarBotenEnviarConsul ta
(lineas 68-91) invocael método setConsuita de ConjuntoResuitadoTableModel (linea 72) para ejecu-
‘ar le nueva consulta. Si la consulta del usuario falla (por ejemplo, debido a un error de sintaxis en la
entrada del usuario), las lineas 81-82 ejecutan la consulta predeterminada. Si la consulta predetermi
nada también falla, podria haber un error més grave, por lo que la linea 87 garantiza que la conexién
de la base de datos esté cerrada y Ia linea 88 termina el programa. Las capturas de pantalla de
1a Figura 24.29 muestran los resultados de dos consultas. La Figura 24.29(a) muestra la consulta pre-
decerminada que recupera todos los datos de la tabla autores de la base de datos Vibros. La Figura
24.29(b) muestra una consulta que selecciona el nombre y apellido de cada autor de la tabla autores2428 Interfax RowSet ‘1037
y combina es informacisn con los titulos los muimeros de edicidn de referencia de todos los 1ibros
de ese autor de la tabla titulos. Intente ingresar sus propias consultas en el drea de texto y haga
clic en el botén Envier consulta para cjecutar Is consults.
Método presionarBotonApl icarFiltro
Las sTable puede mostrar subconjuntos de datos del TableMode1 subyacente: esto se conoce como
filtrado de datos. Cuandoel usuario ingresa texto en canpoTextoFiItro y presions el botén Aptcar filtro,
se ejecuta el método presionarBotonap!i carFi Itro (lincas 94-110). La linea 96 obtiene el texto
del filtro, si el usuario no especificé el texto del filtro, la linea 99 usa el método setRowFilter de
sTable para eliminar cualquier filtro anterior estableciendo el filtro en nul. De lo contrario, la
linea 103 usa setkowF11 ter para especificar un RowF titer (del paquete [Link]) basado en la en-
‘trad del usuario, La clase RowFi Iter proporciona varios métodos para crear filtros. EI método estitico
regexFilter recibe un objeto String, el cual contiene un patrén de expresién regular como argumen-
woyun
se buscan todas las columnas; en este ejemplo, el patrén de expresién regular es el texto que escribié
el usuario, Una vex que se establece d filtro, los datos que se muestran en JTable se actualizan en
fancién del TabteMode! filtrado. La Figura 24.29(6) muestra los resultados de la consulta dela Figura
24.29(b) filtrados para mostrar sélo los registros que contienen la palabra "Java".
,junto opcional de indices que especifican qué columnas filtsar. Si no se especifican indices,
Método mostrarAlerta
‘Cuando ocurre una excepcién la aplicacién lama al méodo mostrarAlerta (liness 113-119) para crear
yy mostrar un cuadro de didlogo de Alert (paquete [Link]. control) que contiene un mensaje.
La linea 115 crea el dlogo, pasando su AlertType al constructor; la constante [Link] muestra
un cuadio de didlogo de mensaje de error, con un icone rojo que contiene una X pars indicar un error.
La linea 116 establece el titulo que aparece en la barra de utulo del cuadro de didlogo. La linea 117
«stableceel mensaje que aparece dentro del didlogo. Finalmente, la linea 118 llama al método showAnd-
aitde Alert, loquelo convierte en un dislogo modal. El usuario debe cerrar el cuadro de dislogo antes
de interactuar con el resto de la aplicacién,
24.8 Interfaz RowSet
En los ejemplos anteriores se mostr6 cémo consular una base de datos, estableciendo explicitamente
una conexién (Connectien) a la base de datos, preparando una inscruccién (Statement) para consul-
tar la base de datos y ejecutando la consulta, En esta seccién demostramos Is interfx RonSet que
configura la conexién dela base de datos y prepara las instrucciones de consulta autométicamente. La
intesfaz Rowset proporciona varies mézodos set que le permiten especificar las propiedades necesatias
para establecer una conexién (como la URL de la base de datos, el nombre de usuario yla contrasefia
de la base de datos) y crear una Statenent (como una consulta). RowSet también proporciona varios
ctodos get que devuclven estas propiedades.
RowSet conectadas y desconectadas
Hay dos tipos de objetos RowSet: conectados y desconectados. Un objeto RowSet conectadlo se conecta
a la base de datos una ver y permanece conectado mientras el objeto esta en uso. Un objeto RonSet
ddesconectado se conecta a la base de datos, eecuta una consulta para recuperar los datos de la base de
datos y luego cierra la conexién. Un programa puede cambiar los datos en un Ronset desconectado
mientras esta desconectado, Los datos modificados se pueden actualizar enla base de datos después de que
un Rowset desconectado restablezca la conexicn con la base de datos.
Paquete [Link] rowset contiene dos subinterfaces de RowSet: IdbcRowSet y CachedRovSet.
Jdbeonset, un objeto RovSet conectado, actiia como un contenedor alrededor de un objeto ResultSet1o32 Capitulo 24 Acceso a bases de datos con JDBC
y le permite desplazarse y actualizar lis filas en el ResultSet. Recuerde que, de forma predetermina-
da, un objeto ResultSet no es desplazable y sélo es de lectura; debe establecer explicitamente
Ia constante de tipo del conjunto de resultados cn TYPE SCROLL_INSENSITIVE y establecer la
constante de concurrencia del conjunto de resultados en CONCUR_UPDATABLE para que un objeto
ResultSet se pueda desplazar y actualizar. Un objeto JdbcRowSet se puede desplazar y actualizar de
forma predeterminada, CachedlouSet, un RovSet desconestada, almacena en caché lor datos de un
ResultSet en la memoria y se desconecta de la base de datos. Al igual que 3ébcRowSet, un objeto
CachedRowSet se puede desplazar y actualizar deforma predeterminada. Un objeto CachedRowSet también
se puede serializar, por ello puede parar entre aplicaciones Java a través de una red, com
sin embargo, CachedfonSet tiene una limitacién: la cantidad de datos que se pueden almacenar en la
memoria es limitada. El paquete [Link] .RowSet contiene otras tres subinterfaces de RowSet.
Tip de portabilidad 24.4
PG lyon OO ee ee
“ES pesuteser desplazable.
Usando un RowSet
La Figura 24.30 vuelve a implementar el ejemplo de la Figura 24.23 usando un Rosset, en lugar de
establecer la conexin y crear una Statenent de manera explicita; en la Figura 24.30 se utiliza un ob-
jeto IdbcRowSet para crear una Connection y una Statement de manera automatica.
// Fig. 24.30: PruebaldbcRowSet. java
7/ Nisuatizacién del contenido de la tabla autores usando JdbcRowSet.
‘mort java.sq1-ResultSetMetaData;
‘mort [Link] .SQLexception;
‘import [Link] .ronset .JdbcRowset;
‘import [Link] -rowset .RowSetProvider;
public class PruebaldbcRowset {
// nombre del controlador JD3C y URL de 1a base de datos
private static final String URL BASEDATOS = "'jdbc:derby:Tibres";
private static final String NOMEREUSUARIO = "deitel
private static final String CONTRASENIA = "deitel";
public static void main(String argst]) {
// conectarse a lez Vibros de la base de datos y consultar 1a base de datos
‘try CldbcRowSet conjuntoFila =
RowSet Provider .nenFactory().create}dbcRowset() {
19 // especifique las propiecades de 3dbcRowset.
20 [Link] (url BASEDATOS);
21 conjuntoFi Ta. setUsernane (jt! USUARIO);
2 conjuntoFila. setPassword(cON 251);
23 [Link]("SELECT * FR0! autores"); // establecer consulta
24 [Link](); // ejecutar la solicitud
25
26 / procesar los resultados de 1a consulta
27 ResultSetMetaData netadatos = [Link] ;
28 int numerodeCalunnas = motaDatas .getColuenCount 0;
Fig. 24.30 | Visualizacion del contenido de la table autores usando JabcRowset. (Parte | de 2)24.28 Interfaz RowSet ‘1039
29 [Link](“Tabla Autores de Ta base de datos Libros:snsn");
30
3 // muestra el encabezado del objeto RowSet
32 for Cint i = 1; i <= mmeroDeColumnas; i++) {
33 [Link](™-s\0", metaDatos. getColunnName )) ;
34 +
35 [Link]() ;
36
37 // wostrar cada fila
30 while CeonjunteFila-next@) {
39 for (int i = 1; 1 < numeroDeColunnas; i++) {
40 [Link]('s-ss\c", ConfuntoF ila. getobject1)) ;
a }
42 [Link]. printing;
3 »
44 3
45 catch (SQLException excepcionSal) {
46 ‘excepcionSal .printStackTrace() ;
47 Systom.oxitC1) ;
48 3
ae)
so}
Tabla Autores de Ta base de dates Libros:
TOAUTOR PRIMERNOMBRE APELLTDOPATERNO
1 Paul Deitel
2 varvey better
3 ‘Abbey Deitel
4 an Quirk
5 Michael Morgane
24.30 | Visualzacin del contenido de la tabla autores usando JdbcRowSet. (Parte 2 de 2)
La clase RonSetProvider (paquete javax.sq1-RowSet) proporciona el método estético new
interfaz RowSetFactory (paquete [Link]
Rowset). Este objeto se puede utilizar para crear varios tipos de RowSet. Las lineas 16-17 en la
Factory que devuelye un objeto que implementa
inseruceidn tey con recursos usan el método croatecdbcRouSet de RowSetFactory para obtener un
objeto JdbcRowset.
Las lineas 20-22 establecen las propiedades de RowSet que utiliza DriverMenager para establecer una
conexién a la hase de datos. La linea 20 invaca el mérodo settiri de IdbeRowSet para especificar la
URL de la base de datos. La linea 21 invoca el método setUsernane de dbcRonSet para especificar
el nombre de usuario, La linea 22 invoca el método setPassword de 3ébcRowSet para especificar la
contrasefia. La linea 23 invoca el método setConmand de 3ébcRowSet para especificar Iz consul-
ta SQL que completars el Rowset. La linea 24 invoca el método execute de 3dbcRowSet para
gjecutar la consulta SQL. El método execute realiza cuatro acciones: establece una conexién
(Connection) a la base de datos, prepara la instruccién (Statement) de la consulta, ejecuta la
consulta y almacena el ResultSet devuelto por la consulta. Connection, Statenent y ResultSet
estan encapsulados en el objeto 3dbcRowset.
El cédigo restante es casi idéntico al de lz Figura 24.23, excepto que la linea 27 (Figura 24.30)
obtiene un objeto ResultSetMetaData de JédbcRowset, la linea 38 usa cl siguiente método de IdbcRowSet