Diferencia entre revisiones de «Exemplos JDBC»
(Sin diferencias)
|
Revisión actual del 11:58 20 may 2010
Exemplos JDBC
Exemplos Java DB Derby
Exemplo 1: Conexión mediante JDBC a Java DB Derby amosando os resultados das consultas por pantalla
Código fonte Exemplo1
package exemplo; import java.sql.*; public class Exemplo1 { public static void main(String args[]){ try { Class.forName("org.apache.derby.jdbc.ClientDriver"); Connection conexion = DriverManager.getConnection( "jdbc:derby://localhost:1527/BDExemplo;create=true;user=app;password=abc1234"); Statement consulta = conexion.createStatement(); ResultSet taboa = consulta.executeQuery("SELECT * FROM app.exemplo"); while(taboa.next()) System.out.println(taboa.getInt(1)+"\t"+taboa.getString(2)+"\t"+taboa.getInt(3)); } catch(ClassNotFoundException e){ System.out.println(e); } catch(SQLException e){ System.out.println(e); } catch(Exception e){ System.out.println(e); } } }
Explicación código fonte Exemplo1
try { 01 Class.forName("org.apache.derby.jdbc.ClientDriver"); 02 Connection conexion = DriverManager.getConnection( 03 "jdbc:derby://localhost:1527/BDExemplo;create=true;user=app;password=abc1234"); 04 Statement consulta = conexion.createStatement(); 05 ResultSet taboa = consulta.executeQuery("SELECT * FROM app.exemplo"); 06 while(taboa.next()) 07 System.out.println(taboa.getInt(1)+"\t"+taboa.getString(2)+"\t"+taboa.getInt(3)); }
Liña 01: Cárgase o driver para poderse conectar mediante jdbc a unha base de datos Derby
Liñas 02-03: Establécese a conexión á base de datos Derby mediante DriverManager mediante a variable conexion(obxecto Connection). Pechado entre parénteses
teremos a URL da conexión á base de datos:
- jdbc:derby:// -->Protocolo de conexión á base de datos Derby mediante jdbc
- localhost:1527/ -->Máquina:porto onde existe á base de datos Derby á acceder
- BDExemplo --> Nome da base de datos Derby
- create=true --> Crear a conexión
- user=app --> Usuario con permisos de acceso á base de datos, neste caso app
- password=abc1234 --> Contrasinal do usuario con acceso á base de datos, neste caso abc1234
Liña 04: Créase a variable consulta(obxecto Statement) que permitirá executar sentencias SQL
Liña 05: Contén os resultados das consultas SQL na variable taboa(obxecto ResultSet), isto é, a variable taboa contén as filas obtidas ao executar a sentencia SELECT * FROM app.exemplo
Liñas 06-07: Namentres existan rexistros que ensinar na variable táboa imprímeos por pantalla de forma tabulada.
08 catch(ClassNotFoundException e){ System.out.println(e); } 09 catch(SQLException e){ System.out.println(e); } 10 catch(Exception e){ System.out.println(e); }
Liña 08: Excepción ClassNotFoundException, que terá lugar polo xeral cando o programa non atope o Driver.
Liña 09: Excepción SQLException, que terá lugar cando existan erros de SQL: erros ao insertar datos, erros de sintaxe nas consultas, ...
Liña 10: Excepción xenérica Exception para calquera tipo de excepción.
Exemplo 2: Conexión mediante JDBC a Java DB Derby amosando os resultados das consultas nun JTable
- A base de datos empregada para iste exemplo e máis información sobre Java DB Derby na seguinte ligazón: Traballando con Java DB Derby no IDE NetBeans
- Para entender iste exemplo é recomendable botarlle unha ollada ao Exemplo 1
- public int getRowCount() --> Devolve o número de filas que terá a táboa
- public int getColumnCount() --> Devolve o número de columnas que terá a táboa
- public Object getValueAt(int row, int column) --> Devolve o dato indicado dunha celda da táboa mediante o par (fila, columna), considerando que (0,0) representa a primeira fila e a primeira columna respectivamente.
Código fonte Exemplo2
package exemplo; import java.awt.*; import java.sql.*; import javax.swing.*; public class Exemplo2 extends JFrame { public Exemplo2() { super( "Amosando resultados da consulta nun JTable" ); try { AmosarTaboaResultados modeloTaboa = new AmosarTaboaResultados( "org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/BDExemplo;create=true;user=app;password=abc1234", "SELECT * FROM app.exemplo" ); JTable taboaResultados = new JTable(modeloTaboa); getContentPane().setLayout(new BorderLayout()); getContentPane().add( new JScrollPane(taboaResultados) , BorderLayout.CENTER ); setSize( 450, 150 ); setVisible( true ); } catch (ClassNotFoundException e) {JOptionPane.showMessageDialog(null, e.getMessage(), "Non se atopou controlador", JOptionPane.ERROR_MESSAGE );} catch (SQLException e) {JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na consulta SQL", JOptionPane.ERROR_MESSAGE);} catch (Exception e){JOptionPane.showMessageDialog(null, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);} } public static void main( String args[] ) { JFrame.setDefaultLookAndFeelDecorated(true); new Exemplo2(); } }
package exemplo; import java.sql.*; import javax.swing.table.*; public class AmosarTaboaResultados extends AbstractTableModel { private Connection conexion; private Statement consulta; private ResultSet taboa; private ResultSetMetaData metaDatos; private int numeroDeFilas; public AmosarTaboaResultados( String controlador, String url, String consulta ) throws SQLException, ClassNotFoundException { Class.forName( controlador ); conexion = DriverManager.getConnection( url ); this.consulta = conexion.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); establecerConsulta( consulta ); } public int getRowCount() throws IllegalStateException { return numeroDeFilas; } public int getColumnCount() { try { return metaDatos.getColumnCount(); } catch (SQLException e) {e.printStackTrace();} return 0; } public String getColumnName( int columna ) { try { return metaDatos.getColumnName( columna + 1 ); } catch (SQLException e) {e.printStackTrace();} return ""; } public Object getValueAt( int fila, int columna ) { try { taboa.absolute( fila + 1 ); return taboa.getObject( columna + 1 ); } catch (SQLException e) {e.printStackTrace();} return ""; } public void establecerConsulta( String consulta ) { try { taboa = this.consulta.executeQuery( consulta ); metaDatos = taboa.getMetaData(); taboa.last(); numeroDeFilas = taboa.getRow(); fireTableStructureChanged(); } catch (SQLException e) {e.printStackTrace();} } }
Explicación código fonte Exemplo2
Explicación Clase Exemplo2
00 public class Exemplo2 extends JFrame { 01 public Exemplo2() { 02 super( "Amosando resultados da consulta nun JTable" ); 03 try { 04 AmosarTaboaResultados modeloTaboa = new AmosarTaboaResultados( 05 "org.apache.derby.jdbc.ClientDriver", 06 "jdbc:derby://localhost:1527/BDExemplo;create=true;user=app;password=abc1234", 07 "SELECT * FROM app.exemplo" ); 08 JTable taboaResultados = new JTable(modeloTaboa); 09 getContentPane().setLayout(new BorderLayout()); 10 getContentPane().add( new JScrollPane(taboaResultados) , BorderLayout.CENTER ); 11 setSize( 450, 150 ); 12 setVisible( true ); 13 } 14 catch (ClassNotFoundException e) {JOptionPane.showMessageDialog(null, 15 e.getMessage(), "Non se atopou controlador", JOptionPane.ERROR_MESSAGE );} 16 catch (SQLException e) {JOptionPane.showMessageDialog(null, 17 e.getMessage(), "Erro na consulta SQL", JOptionPane.ERROR_MESSAGE);} 18 catch (Exception e){JOptionPane.showMessageDialog(null, 19 e.getMessage(), "", JOptionPane.ERROR_MESSAGE);} 20 } 21 public static void main( String args[] ) { 22 JFrame.setDefaultLookAndFeelDecorated(true); 23 new Exemplo2(); 24 } 25 }
Liñas 4,5,6,7: Chamada ao constructor da clase AmosarTaboaResultados mediante a creación da variable obxecto modeloTaboa. Na sinatura do constructor envíanse o driver para recoñecer a base de datos, a conexión á base de datos e a consulta requerida á base de datos, respectivamente.
Liña 8: Creación da variable obxecto taboaResultados co modelo modeloTaboa como parámetro na sinatura do construtor JTable
Liña 9: Establecer para a formulario JFrame da clase Exemplo2 o xestor de compoñentes (distribuidor de contidos) BorderLayout.
Liña 10: Engadir barras de desprazamento á táboa.
Liña 11: Tamaño predeterminado para o formulario.
Liña 12: Facer visible o formulario con todos os compoñentes pertencentes ao mesmo.
Liñas 14,15: Excepción ClassNotFoundException, que terá lugar polo xeral cando o programa non atope o Driver.
Liña 16,17: Excepción SQLException, que terá lugar cando existan erros de SQL: erros ao insertar datos, erros de sintaxe nas consultas, ...
Liña 18,19: Excepción xenérica Exception para calquera tipo de excepción.
Explicación Clase AmosarTaboaResultados
01 public class AmosarTaboaResultados extends AbstractTableModel { 02 private Connection conexion; 03 private Statement consulta; 04 private ResultSet taboa; 05 private ResultSetMetaData metaDatos; 06 private int numeroDeFilas; 07 public AmosarTaboaResultados( String controlador, String url, 08 String consulta ) throws SQLException, ClassNotFoundException { 09 Class.forName( controlador ); 10 conexion = DriverManager.getConnection( url ); 11 this.consulta = conexion.createStatement( 12 ResultSet.TYPE_SCROLL_INSENSITIVE, 13 ResultSet.CONCUR_READ_ONLY ); 14 establecerConsulta( consulta ); 15 } 16 public int getRowCount() throws IllegalStateException { 17 return numeroDeFilas; 18 } 19 public int getColumnCount() { 20 try { 21 return metaDatos.getColumnCount(); 22 } 23 catch (SQLException e) {e.printStackTrace();} 24 return 0; 25 } 26 public String getColumnName( int columna ) { 27 try { 28 return metaDatos.getColumnName( columna + 1 ); 29 } 30 catch (SQLException e) {e.printStackTrace();} 31 return ""; 32 } 33 public Object getValueAt( int fila, int columna ) { 34 try { 35 taboa.absolute( fila + 1 ); 36 return taboa.getObject( columna + 1 ); 37 } 38 catch (SQLException e) {e.printStackTrace();} 38 return ""; 39 } 40 public void establecerConsulta( String consulta ) { 41 try { 42 taboa = this.consulta.executeQuery( consulta ); 43 metaDatos = taboa.getMetaData(); 44 taboa.last(); 45 numeroDeFilas = taboa.getRow(); 46 fireTableStructureChanged(); 47 } 48 catch (SQLException e) {e.printStackTrace();} 49 } 50 }
Liña 1: Declaración da clase AmosarTaboaResultados que herda da clase AbstractTableModel
Liñas 2,3,4,5,6: Declaración dos campos da clase para poder establecer a conexión coa base de datos e representar os datos nunha táboa creada a través dun modelo personalizado mediante a clase AbstractTableModel
Liñas 7,8,9,10,11,12,13,14,15: Declaración do construtor AmosarTaboaResultados. Na súa signatura espera 3 parámetros, respectivamente: o driver para recoñecer a base de datos, como conectar á base de datos, a consulta requerida á base de datos. Nas liñas 12,13 o conxunto de resultados obtidos son non sensibles ao desprazamento e de só lectura respectivamente.
Liñas 16,17,18: Declaración do método getRowCount que permite a obtención do número de filas da táboa resultado da consulta SQL do ResultSet. O número de filas que debe ter un JTable debe coincidir co número de rexistros aos que fai referencia a consulta SQL do ResulSet. A interface ResultSet non dispón de ningún método que devolva esa información, polo que a forma de obtela será mediante o desprazamento do ResulSet á última fila e devolvendo a continuación o índice asociado a ésta. Por iso existen as liñas 44, 45.
Liñas 19,20,21,22,23,24,25: Declaración do método getColumnCount que permite a obtención do número de columnas da táboa resultado da consulta SQL do ResulSet. O número de columnas que debe ter un JTable debe coincidir co número de campos aos que fai referencia a consulta SQL do ResulSet. Esta información a interface ResultSet pode obtela a partir do obxecto ResulSetMetaData de nome metaDatos.
Liñas 26,27,28,29,30,31,32: Declaración do método getColumnName que permite a obtención dos nomes das columnas, o cal tamén pode obterse a partir do obxecto ResulSetMetaData de nome metaDatos.
Liñas 33,34,35,36,37,38,39: Declaración do método getValueAt que devolve á táboa o valor correspondente á celda indicada. Para isto emprega unha variable obxecto ResultSet de nome taboa desprazable, para obter todos os valores das celdas.
Liñas 44,45: Ver explicación liñas 16,17,18.
Liña 46: Actualizar a táboa.
Exemplo 3: Base de datos Derby embebida na aplicación. Conexión mediante JDBC a Java DB Derby Embebida amosando os resultados das consultas por pantalla
Código fonte Exemplo3
package exemplo; import java.sql.*; public class Exemplo1 { public static void main(String args[]){ try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); Connection conexion = DriverManager.getConnection( "jdbc:derby:dist/BDExemplo;create=true;user=app;password=abc1234"); Statement consulta = conexion.createStatement(); ResultSet taboa = consulta.executeQuery("SELECT * FROM app.exemplo"); while(taboa.next()) System.out.println(taboa.getInt(1)+"\t"+taboa.getString(2)+"\t"+taboa.getInt(3)); } catch(ClassNotFoundException e){ System.out.println(e); } catch(SQLException e){ System.out.println(e); } catch(Exception e){ System.out.println(e); } } }
Explicación código fonte Exemplo3
try { 01 Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 02 Connection conexion = DriverManager.getConnection( 03 "jdbc:derby:dist/BDExemplo;create=true;user=app;password=abc1234"); 04 Statement consulta = conexion.createStatement(); 05 ResultSet taboa = consulta.executeQuery("SELECT * FROM app.exemplo"); 06 while(taboa.next()) 07 System.out.println(taboa.getInt(1)+"\t"+taboa.getString(2)+"\t"+taboa.getInt(3)); }
Liña 01: Cárgase o driver para poderse conectar mediante jdbc a unha base de datos Derby
Liñas 02-03: Establécese a conexión á base de datos Derby mediante DriverManager mediante a variable conexion(obxecto Connection). Pechado entre parénteses
teremos a URL da conexión á base de datos:
jdbc:derby:dist/BDExemplo;create=true;user=app;password=abc1234"'
- jdbc:derby:// -->Protocolo de conexión á base de datos Derby mediante jdbc
- dist/ -->Ruta onde existe á base de datos Derby á acceder
- BDExemplo --> Nome da base de datos Derby
- create=true --> Crear a conexión
- user=app --> Usuario con permisos de acceso á base de datos, neste caso app
- password=abc1234 --> Contrasinal do usuario con acceso á base de datos, neste caso abc1234
Liña 04: Créase a variable consulta(obxecto Statement) que permitirá executar sentencias SQL
Liña 05: Contén os resultados das consultas SQL na variable taboa(obxecto ResultSet), isto é, a variable taboa contén as filas obtidas ao executar a sentencia SELECT * FROM app.exemplo
Liñas 06-07: Namentres existan rexistros que ensinar na variable táboa imprímeos por pantalla de forma tabulada.
08 catch(ClassNotFoundException e){ System.out.println(e); } 09 catch(SQLException e){ System.out.println(e); } 10 catch(Exception e){ System.out.println(e); }
Liña 08: Excepción ClassNotFoundException, que terá lugar polo xeral cando o programa non atope o Driver.
Liña 09: Excepción SQLException, que terá lugar cando existan erros de SQL: erros ao insertar datos, erros de sintaxe nas consultas, ...
Liña 10: Excepción xenérica Exception para calquera tipo de excepción.
Empaquetar a aplicación Exemplo3 para que sexa embebida
-
En GNU/Linux:
IMPORTANTE: Para que funcione o exemplo en calquera equipo GNU/Linux onde executemos a aplicación é imprescindible empaquetar a aplicación mediante a estrutura seguinte:instalacion/ |-- dist | |-- BDExemplo | | |-- db.lck | | |-- dbex.lck | | |-- log | | |-- seg0 | | |-- service.properties | | `-- tmp | |-- EmbeberDerby.jar | `-- lib | |-- derby.jar | `-- derbytools.jar `-- instalacion.sh
- En Windows teremos case a mesma estrutura, soamente hai que cambiar o arquivo instalacion.sh polo arquivo instalacion.bat. Os 2 arquivos básicamente diferencianse en como cargar as variables de contorna, en GNU/Linux emprégase o comando export mentres que en Windows emprégase o comando set
Descargar unha estrutura tipo da aplicación embebida Exemplo3
Podes atopar esta estrutura exemplo válida para GNU/Linux e Windows na seguinte ligazón: instalacion.zip
Explicación da estrutura da aplicación embebida Exemplo3
- Cartafol de nome instalacion--> O cartafol raiz da aplicación embebida.
- Arquivo instalacion/EmbeberDerby.jar--> Paquete jar da aplicación.
- Arquivo instalacion/instalacion.sh para GNU/Linux ou instalacion/instalacion.bat para Windows--> Script ou ficheiro por lotes que incorpora á variable CLASSPATH a ruta onde se atopan os paquetes Derby: derby.jar e derbytools.jar; o seu contido é o seguinte:
- Arquivo instalacion.sh:
#!/bin/sh RUTA_ACTUAL=`pwd` export CLASSPATH=$RUTA_ACTUAL/dist/lib/derby.jar:$RUTA_ACTUAL/dist/lib/derbytools.jar:${CLASSPATH} java -jar dist/EmbeberDerby.jar
- Arquivo instalacion.bat:
@echo off set CLASSPATH=.\dist\lib\derby.jar;.\dist\lib\derbytools.jar;%CLASSPATH% java -jar dist/EmbeberDerby.jar
- Arquivo instalacion.sh:
- Cartafol instalacion/dist --> Cartafol que contén a BBDD Derby, neste caso, BDExemplo
- Cartafol instalacion/dist/lib--> Cartafol que contén os paquetes Derby: derby.jar e derbytools.jar
Execución da aplicación embebida Exemplo3
Execución en liña de comandos, nun terminal, da aplicación embebida Exemplo3
- Entrar no directorio raiz da aplicación embebida:
cd instalacion
- En GNU/Linux executar o script instalacion.sh:
sh instalacion.sh
- En Windows executar o ficheiro por lotes instalacion.bat:
instalacion.bat
- En GNU/Linux executar o script instalacion.sh:
Execución en contorna gráfica da aplicación embebida Exemplo3
- Navegar mediante un explorador á ruta onde está situada a aplicación embebida
- Dobre clic co rato en instalacion.sh para sistemas operativos GNU/Linux ou en instalacion.bat para sistemas operativos Windows
Exemplos MySQL
Exemplo 1: Conexión mediante JDBC a MySQL amosando os resultados das consultas por pantalla
- Estes exemplos son os mesmos que os de Java DB Derby. Soamente cambia nos mesmos as liñas de código correspondentes á carga do driver e a conexión coa base de datos:
Class.forName("com.mysql.jdbc.Driver"); Connection conexion = DriverManager.getConnection( "jdbc:mysql://localhost:3306/BDExemplo?" + "user=app&password=abc1234");
- A base de datos empregada para iste exemplo e máis información sobre Java DB Derby na seguinte ligazón: Traballando con Java DB Derby no IDE NetBeans
Código fonte Exemplo1
package exemplo; import java.sql.*; public class Exemplo1 { public static void main(String args[]){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexion = DriverManager.getConnection( "jdbc:mysql://localhost:3306/BDExemplo?" + "user=app&password=abc1234"); Statement consulta = conexion.createStatement(); ResultSet taboa = consulta.executeQuery("SELECT * FROM BDExemplo.EXEMPLO"); while(taboa.next()) System.out.println(taboa.getInt(1)+"\t"+taboa.getString(2)+"\t"+taboa.getInt(3)); } catch(ClassNotFoundException e){ System.out.println(e); } catch(SQLException e){ System.out.println(e); } catch(Exception e){ System.out.println(e); } } }
Explicación código fonte Exemplo1
try { 01 Class.forName("com.mysql.jdbc.Driver"); 02 Connection conexion = DriverManager.getConnection( 03 "jdbc:mysql://localhost:3306/BDExemplo?" + "user=app&password=abc1234"); 04 Statement consulta = conexion.createStatement(); 05 ResultSet taboa = consulta.executeQuery("SELECT * FROM BDExemplo.EXEMPLO"); 06 while(taboa.next()) 07 System.out.println(taboa.getInt(1)+"\t"+taboa.getString(2)+"\t"+taboa.getInt(3)); }
Liña 01: Cárgase o driver para poderse conectar mediante jdbc a unha base de datos MySQL
Liñas 02-03: Establécese a conexión á base de datos MySQL mediante DriverManager mediante a variable conexion(obxecto Connection). Pechado entre parénteses
teremos a URL da conexión á base de datos:
- jdbc:mysql:// -->Protocolo de conexión á base de datos MySQL mediante jdbc
- localhost:3306/ -->Máquina:porto onde existe á base de datos MySQL á acceder
- BDExemplo --> Nome da base de datos MySQL
- create=true --> Crear a conexión
- user=app --> Usuario con permisos de acceso á base de datos, neste caso app
- password=abc1234 --> Contrasinal do usuario con acceso á base de datos, neste caso abc1234
Liña 04: Créase a variable consulta(obxecto Statement) que permitirá executar sentencias SQL
Liña 05: Contén os resultados das consultas SQL na variable taboa(obxecto ResultSet), isto é, a variable taboa contén as filas obtidas ao executar a sentencia SELECT * FROM BDExemplo.EXEMPLO
Liñas 06-07: Namentres existan rexistros que ensinar na variable táboa imprímeos por pantalla de forma tabulada.
08 catch(ClassNotFoundException e){ System.out.println(e); } 09 catch(SQLException e){ System.out.println(e); } 10 catch(Exception e){ System.out.println(e); }
Liña 08: Excepción ClassNotFoundException, que terá lugar polo xeral cando o programa non atope o Driver.
Liña 09: Excepción SQLException, que terá lugar cando existan erros de SQL: erros ao insertar datos, erros de sintaxe nas consultas, ...
Liña 10: Excepción xenérica Exception para calquera tipo de excepción.
Exemplo 2: Conexión mediante JDBC a MySQL amosando os resultados das consultas nun JTable
- Estes exemplos son os mesmos que os de Java DB Derby. Soamente cambia nos mesmos as liñas de código correspondentes á carga do driver e a conexión coa base de datos:
Class.forName("com.mysql.jdbc.Driver"); Connection conexion = DriverManager.getConnection( "jdbc:mysql://localhost:3306/BDExemplo?" + "user=app&password=abc1234");
- A base de datos empregada para iste exemplo e máis información sobre Java DB Derby na seguinte ligazón: Traballando con Java DB Derby no IDE NetBeans
- Para entender iste exemplo é recomendable botarlle unha ollada ao Exemplo 1
- public int getRowCount() --> Devolve o número de filas que terá a táboa
- public int getColumnCount() --> Devolve o número de columnas que terá a táboa
- public Object getValueAt(int row, int column) --> Devolve o dato indicado dunha celda da táboa mediante o par (fila, columna), considerando que (0,0) representa a primeira fila e a primeira columna respectivamente.
Código fonte Exemplo2
package exemplo; import java.awt.*; import java.sql.*; import javax.swing.*; public class Exemplo2 extends JFrame { public Exemplo2() { super( "Amosando resultados da consulta nun JTable" ); try { AmosarTaboaResultados modeloTaboa = new AmosarTaboaResultados( "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/BDExemplo?" + "user=app&password=abc1234", "SELECT * FROM BDExemplo.EXEMPLO" ); JTable taboaResultados = new JTable(modeloTaboa); getContentPane().setLayout(new BorderLayout()); getContentPane().add( new JScrollPane(taboaResultados) , BorderLayout.CENTER ); setSize( 450, 150 ); setVisible( true ); } catch (ClassNotFoundException e) {JOptionPane.showMessageDialog(null, e.getMessage(), "Non se atopou controlador", JOptionPane.ERROR_MESSAGE );} catch (SQLException e) {JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na consulta SQL", JOptionPane.ERROR_MESSAGE);} catch (Exception e){JOptionPane.showMessageDialog(null, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);} } public static void main( String args[] ) { JFrame.setDefaultLookAndFeelDecorated(true); new Exemplo2(); } }
package exemplo; import java.sql.*; import javax.swing.table.*; public class AmosarTaboaResultados extends AbstractTableModel { private Connection conexion; private Statement consulta; private ResultSet taboa; private ResultSetMetaData metaDatos; private int numeroDeFilas; public AmosarTaboaResultados( String controlador, String url, String consulta ) throws SQLException, ClassNotFoundException { Class.forName( controlador ); conexion = DriverManager.getConnection( url ); this.consulta = conexion.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); establecerConsulta( consulta ); } public int getRowCount() throws IllegalStateException { return numeroDeFilas; } public int getColumnCount() { try { return metaDatos.getColumnCount(); } catch (SQLException e) {e.printStackTrace();} return 0; } public String getColumnName( int columna ) { try { return metaDatos.getColumnName( columna + 1 ); } catch (SQLException e) {e.printStackTrace();} return ""; } public Object getValueAt( int fila, int columna ) { try { taboa.absolute( fila + 1 ); return taboa.getObject( columna + 1 ); } catch (SQLException e) {e.printStackTrace();} return ""; } public void establecerConsulta( String consulta ) { try { taboa = this.consulta.executeQuery( consulta ); metaDatos = taboa.getMetaData(); taboa.last(); numeroDeFilas = taboa.getRow(); fireTableStructureChanged(); } catch (SQLException e) {e.printStackTrace();} } }
Explicación código fonte Exemplo2
Explicación Clase Exemplo2
00 public class Exemplo2 extends JFrame { 01 public Exemplo2() { 02 super( "Amosando resultados da consulta nun JTable" ); 03 try { 04 AmosarTaboaResultados modeloTaboa = new AmosarTaboaResultados( 05 "com.mysql.jdbc.Driver", 06 "jdbc:mysql://localhost:3306/BDExemplo?" + "user=app&password=abc1234", 07 "SELECT * FROM BDExemplo.EXEMPLO" ); 08 JTable taboaResultados = new JTable(modeloTaboa); 09 getContentPane().setLayout(new BorderLayout()); 10 getContentPane().add( new JScrollPane(taboaResultados) , BorderLayout.CENTER ); 11 setSize( 450, 150 ); 12 setVisible( true ); 13 } 14 catch (ClassNotFoundException e) {JOptionPane.showMessageDialog(null, 15 e.getMessage(), "Non se atopou controlador", JOptionPane.ERROR_MESSAGE );} 16 catch (SQLException e) {JOptionPane.showMessageDialog(null, 17 e.getMessage(), "Erro na consulta SQL", JOptionPane.ERROR_MESSAGE);} 18 catch (Exception e){JOptionPane.showMessageDialog(null, 19 e.getMessage(), "", JOptionPane.ERROR_MESSAGE);} 20 } 21 public static void main( String args[] ) { 22 JFrame.setDefaultLookAndFeelDecorated(true); 23 new Exemplo2(); 24 } 25 }
Liñas 4,5,6,7: Chamada ao constructor da clase AmosarTaboaResultados mediante a creación da variable obxecto modeloTaboa. Na sinatura do constructor envíanse o driver para recoñecer a base de datos, a conexión á base de datos e a consulta requerida á base de datos, respectivamente.
Liña 8: Creación da variable obxecto taboaResultados co modelo modeloTaboa como parámetro na sinatura do construtor JTable
Liña 9: Establecer para a formulario JFrame da clase Exemplo2 o xestor de compoñentes (distribuidor de contidos) BorderLayout.
Liña 10: Engadir barras de desprazamento á táboa.
Liña 11: Tamaño predeterminado para o formulario.
Liña 12: Facer visible o formulario con todos os compoñentes pertencentes ao mesmo.
Liñas 14,15: Excepción ClassNotFoundException, que terá lugar polo xeral cando o programa non atope o Driver.
Liña 16,17: Excepción SQLException, que terá lugar cando existan erros de SQL: erros ao insertar datos, erros de sintaxe nas consultas, ...
Liña 18,19: Excepción xenérica Exception para calquera tipo de excepción.
Explicación Clase AmosarTaboaResultados
01 public class AmosarTaboaResultados extends AbstractTableModel { 02 private Connection conexion; 03 private Statement consulta; 04 private ResultSet taboa; 05 private ResultSetMetaData metaDatos; 06 private int numeroDeFilas; 07 public AmosarTaboaResultados( String controlador, String url, 08 String consulta ) throws SQLException, ClassNotFoundException { 09 Class.forName( controlador ); 10 conexion = DriverManager.getConnection( url ); 11 this.consulta = conexion.createStatement( 12 ResultSet.TYPE_SCROLL_INSENSITIVE, 13 ResultSet.CONCUR_READ_ONLY ); 14 establecerConsulta( consulta ); 15 } 16 public int getRowCount() throws IllegalStateException { 17 return numeroDeFilas; 18 } 19 public int getColumnCount() { 20 try { 21 return metaDatos.getColumnCount(); 22 } 23 catch (SQLException e) {e.printStackTrace();} 24 return 0; 25 } 26 public String getColumnName( int columna ) { 27 try { 28 return metaDatos.getColumnName( columna + 1 ); 29 } 30 catch (SQLException e) {e.printStackTrace();} 31 return ""; 32 } 33 public Object getValueAt( int fila, int columna ) { 34 try { 35 taboa.absolute( fila + 1 ); 36 return taboa.getObject( columna + 1 ); 37 } 38 catch (SQLException e) {e.printStackTrace();} 38 return ""; 39 } 40 public void establecerConsulta( String consulta ) { 41 try { 42 taboa = this.consulta.executeQuery( consulta ); 43 metaDatos = taboa.getMetaData(); 44 taboa.last(); 45 numeroDeFilas = taboa.getRow(); 46 fireTableStructureChanged(); 47 } 48 catch (SQLException e) {e.printStackTrace();} 49 } 50 }
Liña 1: Declaración da clase AmosarTaboaResultados que herda da clase AbstractTableModel
Liñas 2,3,4,5,6: Declaración dos campos da clase para poder establecer a conexión coa base de datos e representar os datos nunha táboa creada a través dun modelo personalizado mediante a clase AbstractTableModel
Liñas 7,8,9,10,11,12,13,14,15: Declaración do construtor AmosarTaboaResultados. Na súa signatura espera 3 parámetros, respectivamente: o driver para recoñecer a base de datos, como conectar á base de datos, a consulta requerida á base de datos. Nas liñas 12,13 o conxunto de resultados obtidos son non sensibles ao desprazamento e de só lectura respectivamente.
Liñas 16,17,18: Declaración do método getRowCount que permite a obtención do número de filas da táboa resultado da consulta SQL do ResultSet. O número de filas que debe ter un JTable debe coincidir co número de rexistros aos que fai referencia a consulta SQL do ResulSet. A interface ResultSet non dispón de ningún método que devolva esa información, polo que a forma de obtela será mediante o desprazamento do ResulSet á última fila e devolvendo a continuación o índice asociado a ésta. Por iso existen as liñas 44, 45.
Liñas 19,20,21,22,23,24,25: Declaración do método getColumnCount que permite a obtención do número de columnas da táboa resultado da consulta SQL do ResulSet. O número de columnas que debe ter un JTable debe coincidir co número de campos aos que fai referencia a consulta SQL do ResulSet. Esta información a interface ResultSet pode obtela a partir do obxecto ResulSetMetaData de nome metaDatos.
Liñas 26,27,28,29,30,31,32: Declaración do método getColumnName que permite a obtención dos nomes das columnas, o cal tamén pode obterse a partir do obxecto ResulSetMetaData de nome metaDatos.
Liñas 33,34,35,36,37,38,39: Declaración do método getValueAt que devolve á táboa o valor correspondente á celda indicada. Para isto emprega unha variable obxecto ResultSet de nome taboa desprazable, para obter todos os valores das celdas.
Liñas 44,45: Ver explicación liñas 16,17,18.
Liña 46: Actualizar a táboa.
--ricardofc [20/05/10]