You are on page 1of 4

LA BASE DE DATOS Presuponemos que tenemos instalado MySQL y que hemos creado una base de datos y una tabla

con datos similar a la siguiente: mysql> create database prueba; mysql> use prueba; mysql> create table persona (id smallint auto_increment, nombre varchar(60), nacimiento date, primary key(id)); mysql> insert persona values (NULL, 'Pedro', '1995-09-12'); Es decir, una base de datos prueba con una tabla persona que tiene los campos id, nombre y nacimiento tal cual se ve en el recuadro. Tambin suponemos que tenemos disponible el jar con el Driver de MySQL y que lo ponemos en el CLASSPATH o lo aadimos a nuestro proyecto si usamos un IDE. LA CONSULTA Y EL ResultSet Primero se obtiene la conexin a la base de datos con un cdigo como este: DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/prueba","usuario", "clave");

Por supuesto tendrs que cambiar el "usuario" y "clave" por los que t tengas en la base de datos. Tambin, si la base de datos no corre en tu ordenador local, tienes que cambiar "localhost" por el nombre o IP del ordenador donde corra la base de datos. El siguiente paso es realizar la consulta y obtener el ResultSet. El cdigo es el siguiente Statement s = conexion.createStatement(); ResultSet rs = s.executeQuery("select * from persona"); METER EL ResultSet EN UN JTable Para meter los datos en el JTable, usaremos un DefaultTableModel. Para ello basta con instanciar el JTable de esta forma

DefaultTableModel modelo = new DefaultTableModel(); JTable tabla = new JTable(modelo); Ahora slo hay que rellenar el DefaultTableModel con los datos del ResultSet. La forma "manual" de hacer esto es la siguiente // Creamos las columnas. modelo.addColumn("id"); modelo.addColumn("nombre"); modelo.addColumn("nacimiento"); // Bucle para cada resultado en la consulta while (rs.next()) { // Se crea un array que ser una de las filas de la tabla. Object [] fila = new Object[3]; // Hay tres columnas en la tabla // Se rellena cada posicin del array con una de las columnas de la tabla en base de datos. for (int i=0;i<3;i++) fila[i] = rs.getObject(i+1); // El primer indice en rs es el 1, no el cero, por eso se suma 1. // Se aade al modelo la fila completa. modelo.addRow(fila); } Con esto basta. Todo lo que hagamos en el DefaultTableModel se refresca automticamente en el JTable. Por ello, segn se va ejecutando este cdigo, en el JTable se iran aadiendo automticamente los datos. LOS METADATOS El cdigo que acabamos de hacer est claro que es muy dependiente de la tabla de base de datos que estamos consultando. Hay que aadir tantas columnas como campos tenga el resultado de base de datos. El nombre de las columnas depende de qu estemos consultando, es decir, un nombre de persona, una marca de coche, etc. Sin embargo, existe una forma ms o menos automtica de hacer esto. Dado un ResultSet que obtenemos como consulta de base de datos, podemos interrogarle sobre cuntas columnas tiene y cules son los nombres de sus campos. Con ello, podemos hacer el

cdigo anterior de forma genrica, de tal manera que slo teniendo el ResultSety le DefaultTableModelo, podemos rellenarlo sin saber en absoluto qu consulta ni qu tablas se han consultado. Para obtener esta informacin, hay que pedirle los MetaDatos al ResulSet. El cdigo que lo hace es este ResultSetMetaData metaDatos = rs.getMetaData(); La clase ResultSetMetaData contiene toda la informacin sobre los campos de base de datos contenidos en el ResultSet. Necesitamos preguntarle por el nmero de columnas y por la etiqueta para cada una de las columnas. Este es el cdigo que lo hace // Se obtiene el nmero de columnas. int numeroColumnas = metaDatos.getColumnCount(); // Se crea un array de etiquetas para rellenar Object[] etiquetas = new Object[numeroColumnas]; // Se obtiene cada una de las etiquetas para cada columna for (int i = 0; i < numeroColumnas; i++) { // Nuevamente, para ResultSetMetaData la primera columna es la 1. etiquetas[i] = metaDatos.getColumnLabel(i + 1); } Listo. Ya hemos obtenido de forma genrica la informacin necesaria para rellenar el DefaultTableModel. En la clase ConversorResultSetADefaultTableModel del ejemplo se hace precisamente esto. Se le pasa un DefaultTableModel y un ResultSet y se encarga de meter los datos de un lado a otro, utilizando este cdigo genrico que hemos hecho. Una vez que tenemos el array de etiquetas, basta hacer esta llamada al DefaultTableModelo para configurar su nmero de columnas modelo.setColumnIdentifiers(etiquetas); El relleno de los datos es inmediato. Igual que el cdigo "manual", pero se puede quitar el "3" y poner un "numeroColumnas". EL EJEMPLO

En ResultSetATableModel.zip tienes los fuentes completos del ejemplo. Si tienes configurada la base de datos como se indic al principio y tienes un usuario y password similar al del cdigo, puedes desempaquetar, compilar y ejecutar con Linux $ unzip ResultSetATableModel.zip $ export CLASSPATH=.:<path_driver_mysqql>/mysql-connector-java-3.1.12bin.jar $ javac chuidiang/ejemplos/base_datos/*.java $ java chuidiang.ejemplos.base_datos.PruebaMySQL Windows $ unzip ResultSetATableModel.zip $ set CLASSPATH=.;<path_driver_mysqql>\mysql-connector-java-3.1.12bin.jar $ javac chuidiang\ejemplos\base_datos\*.java $ java chuidiang.ejemplos.base_datos.PruebaMySQL Puesto que en el cdigo de ejemplo he puesto que cada segundo se realice la consulta nuevamente y se refresquen los datos, mientras el progrma est en marcha puedes modificar, aadir o borrar datos de la tabla de base de datos. Vers como se actualizan en el JTable. Puedes revisar los fuentes de ejemplo. La clase realmente interesante es ConversorResultSetADefaultTableModel que posiblemente puedas reutilzar tal cual o con pequeos cambios en tus proyectos. Una pequea observacin respecto al cdigo. Como SWING no es thread-safe, es decir, no se puede usar alegremente con varios hilos. Como en el ejemplo hay dos hilos: el del main y el de AWT, me he visto obligado en los sitios en que modifico el DefaultTableModel a usar un SwingUtilities.invokeAndWait(). Si quitas eso, es posible que te salten excepciones en el repintado del JTable (es lo que me pasaba a m y por eso tuve que ponerlo).

You might also like