Consultar DB en Java – Mostrar resultados en un JTable
Siguiendo con nuestro tema de conexiones a bases de datos desde Java… Cuando estamos trabajando con bases de datos y aplicaciones que usen Swing, la manera más elegante de presentar los datos a un usuario es usando tablas usando la clase JTable.

Lo que haremos será básicamente crear una clase que herede de la clase AbstractTableModel:
Esta clase abstracta provee la implementación por defecto de la mayoría de los métodos en la interfaz
TableModel. Para crear unTableModelcomo subclase deAbstractTableModelnecesitarás implementar únicamente los sigientes tres métodos:public int getRowCount(); public int getColumnCount();public Object getValueAt(int row, int column);
Dicha clase administrará el contenido de nuestra tabla. Ten en cuenta que vamos a trabajar con la base de datos que hicimos aquí. Veamos entonces el código:
import java.sql.*;
import java.util.*;
import javax.swing.table.*;
// Las filas y columnas del objeto ResultSet se cuentan desde 1 y las filas
// y columnas del objeto JTable se cuentan desde 0. Al procesar filas
// o columnas del objeto ResultSet para usarlas en un objeto JTable, es
// necesario sumar 1 al número de fila o columnas para manipular la
// columna apropiada del objeto ResultSet (es decir, la columna 0 del objeto JTable
// es la columna 1 del objeto ResultSet y la fila 0 del objeto JTable es la fila 1 del objeto ResultSet).
public class ModeloTablaResultados extends AbstractTableModel {
private Connection conexion;
private Statement instruccion;
private ResultSet conjuntoResultados;
private ResultSetMetaData metaDatos;
private int numeroDeFilas;
// mantener el registro del estado de la conexión a la base de datos
private boolean conectadoALaBaseDeDatos = false;
// inicializar conjuntoResultados y obtener su objeto de meta datos;
// determinar el número de filas
public ModeloTablaResultados( String controlador, String url,
String consulta ) throws SQLException, ClassNotFoundException {
// cargar clase de controlador de base de datos
Class.forName( controlador );
// conectarse a la base de datos
conexion = DriverManager.getConnection( url );
// crear objeto Statement para consultar la base de datos
instruccion = conexion.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY );
// actualizar estado de conexión a la base de datos
conectadoALaBaseDeDatos = true;
// establecer consulta y ejecutarla
establecerConsulta( consulta );
}
// obtener la clase que representa al tipo de columna
public Class getColumnClass( int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar la clase de Java de columna
try {
String nombreClase = metaDatos.getColumnClassName( columna + 1 );
// devolver objeto Class que representa a nombreClase
return Class.forName( nombreClase );
}
// atrapar excepciones SQLException y ClassNotFoundException
catch ( Exception excepcion ) {
excepcion.printStackTrace();
}
// si ocurren problemas arriba, suponer que es tipo Object
return Object.class;
}
// obtener el número de columnas en el objeto ResultSet
public int getColumnCount() throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar el número de columnas
try {
return metaDatos.getColumnCount();
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si ocurren problemas arriba, devolver 0 para el número de columnas
return 0;
}
// obtener el nombre de una columna específica en el objeto ResultSet
public String getColumnName( int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar el nombre de la columna
try {
return metaDatos.getColumnName( columna + 1 );
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver cadena vacía para el nombre de la columna
return "";
}
// devolver el número de filas en el objeto ResultSet
public int getRowCount() throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
return numeroDeFilas;
}
// obtener el valor en una fila y columna específicas
public Object getValueAt( int fila, int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// obtener un valor en una fila y columna específicas del objeto ResultSet
try {
conjuntoResultados.absolute( fila + 1 );
return conjuntoResultados.getObject( columna + 1 );
}
// atrapar excepciones SQLExceptions e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver objeto cadena vacía
return "";
}
// establecer nueva cadena de consulta para la base de datos
public void establecerConsulta( String consulta )throws SQLException, IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// especificar consulta y ejecutarla
conjuntoResultados = instruccion.executeQuery( consulta );
// obtener meta datos para el objeto ResultSet
metaDatos = conjuntoResultados.getMetaData();
// determinar el número de filas en el objeto ResultSet
conjuntoResultados.last(); // mover a la última fila
numeroDeFilas = conjuntoResultados.getRow(); // obtener número de fila
// notificar al objeto JTable que el modelo ha cambiado
fireTableStructureChanged();
}
// cerrar objetos Statement y Connection
public void desconectarDeLaBaseDeDatos() {
// cerrar objetos Statement y Connection
try {
instruccion.close();
conexion.close();
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// actualizar estado de conexión a la base de datos
finally {
conectadoALaBaseDeDatos = false;
}
}
} // fin de la clase ResultSetTableModel
Cosas por explicar el en código anterior:
- Si tienes dudas respecto a las operaciones hechas con el API de JDBC significa que debes leer esto primero: Ejemplo Programación con JDBC
- public Class getColumnClass(); con este método obtendremos el tipo de dato de la columna (Integer, String, Float, etc).
- public int getColumnCount(); este método devuelve el número de columnas que tendrá la tabla.
- public String getColumnName(int x); devuelve el nombre de la columna X de la tabla.
- public int getRowCount(); este método devuelve el número de filas que tendrá la tabla.
- public Object getValueAt(int f, int c); asigna a la tabla el valor de la celda que se encuentra en la fila f y en la columna c.
- fireTableStructureChanged(); esto le indica al objeto AbstractTableModel que la estructura de la tabla ha cambiado.
Ahora el código del frame que contiene la tabla:
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class MostrarResultadosConsulta extends JFrame {
// controlador JDBC y URL de la base de datos
static final String CONTROLADOR_JDBC = "com.mysql.jdbc.Driver";
static final String URL_BASEDEDATOS = "jdbc:mysql://localhost/ejemplo?user=root&password=";
// la consulta predeterminada recupera todos los datos de la tabla autores
static final String CONSULTA_PREDETERMINADA = "SELECT * FROM datos";
private ModeloTablaResultados modeloTabla;
private JTextArea areaConsulta;
// crear objeto ModeloTablaResultados y GUI
public MostrarResultadosConsulta() {
super( "Mostrando resultados de la consulta" );
// crear objeto ModeloTablaResultados y mostrar tabla de la base de datos
try {
// crear objeto TableModel para los resultados del a consulta SELECT * FROM autores
modeloTabla = new ModeloTablaResultados( CONTROLADOR_JDBC, URL_BASEDEDATOS,
CONSULTA_PREDETERMINADA );
JTable tablaResultados = new JTable(modeloTabla);
getContentPane().setLayout(new BorderLayout());
getContentPane().add( new JScrollPane(tablaResultados) , BorderLayout.CENTER );
// establecer tamaño de ventana y mostrarla en pantalla
setSize( 500, 250 );
setVisible( true );
} // fin de bloque try
// atrapar la excepción ClassNotFoundException lanzada por el
// objeto ModeloTablaResultados si no se encuentra el controlador de la base de datos
catch ( ClassNotFoundException claseNoEncontrada ) {
JOptionPane.showMessageDialog( null,
"No se encontro el controlador de la base de datos", "No se encontro el controlador",
JOptionPane.ERROR_MESSAGE );
System.exit( 1 ); // terminar la aplicación
} // fin de bloque catch
// atrapar la excepción SQLException lanzada por el objeto ModeloTablaResultados
// si ocurren problemas al establecer la conexión a la base de datos
// y realizar la consulta en la misma
catch ( SQLException excepcionSQL ) {
JOptionPane.showMessageDialog( null, excepcionSQL.getMessage(),
"Error en la base de datos", JOptionPane.ERROR_MESSAGE );
// asegurar que la conexión a la base de datos esté cerrada
modeloTabla.desconectarDeLaBaseDeDatos();
System.exit( 1 ); // terminar la aplicación
}
// desechar la ventana cuando el usuario salga de la aplicación
// (esta opción sobrescribe a la opción predeterminada de HIDE_ON_CLOSE)
setDefaultCloseOperation( DISPOSE_ON_CLOSE );
// asegurar que la conexión a la base de datos esté cerrada cuando el usuario salga de la aplicación
addWindowListener(
new WindowAdapter() {
// desconectarse de la base de datos y salir cuando se haya cerrado la ventana
public void windowClosed( WindowEvent evento ) {
modeloTabla.desconectarDeLaBaseDeDatos();
System.exit( 0 );
}
}
);
} // fin del constructor de MostrarResultadosConsulta
// ejecutar la aplicación
public static void main( String args[] ) {
JFrame.setDefaultLookAndFeelDecorated(true);
new MostrarResultadosConsulta();
}
} // fin de la clase MostrarResultadosConsulta
Puedes ver un ejemplo más completo, llamado TableExample, en el set de demos que proporciona el JDK (puedes descargarlo abajo).
Descargas
57 Comentarios | deja el tuyo





Primero que nada, te felicito por hacer este gran espacio de ayuda.
y Segundo ¿ este codigo sirve para trabajar en una base hecha en sql server 2005?
Hola Ivan… el código sirve para cualquier base de datos siempre y cuando tengas el conector JDBC…
La verdad los hay para todos los gestores: MySQL, SQLite, Postgres, Oracle, MSSQLServer… es solo que busques en Google.
Un saludo!
lo acabo de probar y me lanza un cuadro que dice “no suitable driver ”
Que quiere decir eso?
el nombre del driver que uso es” com.microsoft.sqlserver.jdbc.SQLServerDriver”
y el url es “dbc:sqlserver://localhost:1433;databaseName=Voleibol2″
usuario=sa
pass=sa1234
Te repito: debes tener el conector JDBC, que es un archivo .jar que incluyes en el classpath al momento de ejecutar tu programa. Busca el conector para la base de datos que estás usando.
Un saludo!
Hola, tengo un problemita en la interfaz de la tabla generada de la consulta, lo que pasa que tengo varios formularios en mi aplicacion pero al momento de mostrar el formulario de la tabla generada cambia de color azul la interfaz y en los demas formularios me los deja en color azul como le hago para que no cambie a color azul
Re madre esta super bueno el ejemplo sencillo pero poderoso grax man
Me salvastes la vida man hoy mismo tengo que entregar un sistema y me dio voluda hacerlo asi que te ganastes un 100 man
Grax
Hola bueno el ejemplo que mostraste esta muy bueno pero me gustaria que me orientes en este caso;
estoy haciendo un sistema para un colegio que esta con el DBMS Mysql, en el jpanel tengo un jcombobox y un jtable en resumen y mi problema esta que el jcombobox serviria de filtro por asi decirlo donde seleccione el curso y en el jtable me muestre los alumnos que llevan dicho curso.
gracias.
Oye Carlos dame tu correo si quieres ayuda man
Hola Snak_X, bueno mi correo es cael_sr@hotmail.com espero que eme ayudes.
Que hondas
tal vez ya ni me contestes esto pero vale la pena intentar
del ejemplo que dejaste para descargar “TableExample”
me podrias pasar el codigo java de ese programita
te lo agradecere mucho tanks
darcarngel_espartano@hotmail.com
hola diablo hola a todos bueno esta interesante el ejemplo solo que tengo una dificultad descargue el conectro o controlador mysql-connector-java-5.1.13.zip pero al ejecutar me dice no se encuentra el controlador de la base de datos otra pregunta en que carpeta lo ubico el classpat que mencionan espero una respuesta manes . lo necesito urgente
Hola tendras algun Ejemplo para administrar usuarios… lo basico agregar, modificar, eliminar
oe Neon especifica bien tu pregunta o comentario por para administrar usuarios es eso q pusistes
INSERCION MODIFICACION ELIMINACION Y PERMISOS MAN
eso lo haces desde tu aplicacion la configuras y la programas al momento de hacerla simplemente son validaciones
haces una consulta a tu base de datos lee los permisos y en tu aplicacion hces el codigo de los permisos por decir asi tenes
1 atributo para Insercion de Datos
1 atributo para Modificacion de Datos
1 atributo para Eliminacion de Datos
1 atributo para Identificar si es Administrador o no
y al momento de entrar a tu aplicacion o sistemas lo q debes de hacer es ocultar las acciones a las q no tiene permiso esa es la mejor manera de hacerlo y creo q la unika realmente no se pero creo q la mas razonable si me entiendes bueno si no contactame shak_beast@hotmail.com
ok ya te agrege a mi correo, es neo_genesis_5@hotmail.com por si te llega va, pero pues queria saber si tenias el codigo de la aplicacion que realice esos procedimientos de eliminar, modificar, agregar y por consecuencia validar un usuario.
Tengo un problema al ejecutar la aplicacion en otra maquina me corre pero no me carga la informacion. Yo cargo los datos en un combo box en mi maquina si me funciona la paso a otra me corre pero no me carga la info y tambien tengo la opcion de insertar en mi maquina funciona pero en la de prueba no.
Ambas maquinas tienen acceso a la base.
En primera debes de tener todas las clases que ocupas en la carpeta del sistema o programa q estas haciendo,
te recomiendo q uses netbeans si es asi no agregues al classpath las clases q necesitas ocupar sino que dando click derecho en el proyecto y agregando librerias desde la interfaz de propiedas xq a la hora de crear el build atrves de NetBeans el ya te crea un classpath interno para tu aplicacion .jar y te crea una carpeta donde contendra todas las clases q tu has agregado, x otra parte verifica si te manda algun error a la consola de Java xq la aplicacion te puede correr bien pero si no te muestra lo deseado es x algun problema, falla o error en tu aplicacion.
Cualquier cosa solo contactame shak_beast@hotmail.com
Hola, tengo un problema a la hora de hacer consultas a mi base de datos en MySQL conectada a NetBeans 6.8, la base conecta bien pero cuando trato de hacer consultas a ella me dice que no puede encontrar una columna de la base de datos y otro error es que a la hora de retornar los resultados me da un error que dice “imposible retornar el resulset” y no tengo idea del porque ocurre….Agradesco cualquier ayuda que puedan brindarme
Uhm eso puede ser x los permisos, bueno yo solo he trabajado con SQL Server y ese problema me daba cuando no tenia los permisos del SA en el caso de MySQL es el root verifica los permisos con los q haces la conexion, xq seguro es eso si te conecta sin ningun problema lo mas probable q sea eso
Cualquier cosa solo contactame shak_beast@hotmail.com