Continuación del tutorial «Utiliza 2 bases de datos diferentes en una aplicación»
La Interfaz
frmSelected.java: Haciendo uso de la paleta de controles, crea una interfaz como la imagen inferior:
Los controles marcados con un punto rojo, son importantes y debes renombrarlos tal cual se ve en la imagen.
Nuestra aplicación hará uso de dos SGBD, entonces deben agregarse esas opciones al JComboBox en su propiedad «model«, los valores «Access» y «SQLite»
frmData: Esta interfaz nos sirve para mostrar los registros de la base de datos seleccionada (Access o SQLite), los nombres de los controles son importantes.
La clase conexión Access/SQLite
Como se dijo el principio, necesitamos de una clase que nos conecte ya sea a Access o SQLite según la opción del usuario, ademas necesitamos que esta misma clase, realice consultas a ambas base de datos, respetando su propia sintaxis SQL.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import javax.swing.JOptionPane; /** * @web https://www.jc-mouse.net * @author Mouse */ public class ConexionDB { //Variable para guardar que tipo de base de datos se esta utilizando private String modo=""; /** Base de datos SQLite */ private String dbNameSQLite="oops.sqlite"; /** Base de datos Access */ private String password = ""; private String dbNameAcces = "oops.accdb"; /** Dirección completa del JAR */ //private String path = System.getProperty("user.dir") + "\\" ; // descomentar para crear el *.JAR private String path = "C:\\Users\\obama\\Documents\\NetbeansProjects\\dbDouble\\" ; //ruta del proyecto netbeans private Connection connection = null; /** * Constructor de clase * @param opcion de tipo String * valores: * "Access" * "SQLite" */ public ConexionDB( String opcion ) { if( opcion.equals("Access") ) { try{ //obtenemos el driver para Access Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //obtenemos la conexión connection = DriverManager.getConnection( "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=" + path + dbNameAcces + ";PWD=" + password ); }catch(SQLException e){ System.err.println( e.getMessage() ); }catch(ClassNotFoundException e){ System.err.println( e.getMessage() ); } } else if( opcion.equals("SQLite")) { try{ Class.forName("org.sqlite.JDBC"); connection = DriverManager.getConnection("jdbc:sqlite:" + path + dbNameSQLite ); }catch(Exception e){ System.err.println( "Error: " + e.getMessage() ); } } else //El sistema termina { JOptionPane.showMessageDialog(null,"Error: Base de Datos no existe"); System.exit(0); } modo = opcion ; } /** * Retorna el tipo de base de datos que se esta utilizando * @return String valor de variable "Modo" */ public String getModo() { return this.modo; } /** * Metodo que obtiene el registro de una frase celebre aleatoriamente * @return Map */ public Map Obtener_Frase_Celebre() { String sql=""; Map data = new HashMap(); if( this.modo.equals("Access")) //Consulta SQL para Access { sql = " SELECT TOP 1 texto, autor FROM frases ORDER BY Rnd( id * Timer() * 1000 ) "; } else if( this.modo.equals("SQLite") ) //Consulta SQL para SQLite { sql = " SELECT texto, autor FROM frases ORDER BY RANDOM() LIMIT 1; "; } try{ PreparedStatement pstm = this.connection.prepareStatement( sql ); ResultSet res = pstm.executeQuery(); while(res.next()){ data.put( "texto" , res.getString("texto") ); data.put( "autor" , res.getString("autor") ); } res.close(); }catch(SQLException e){ System.err.println( "Error SQL: " + e.getMessage() ); } return data; } }//--> fin clase
Observamos en la clase anterior «ConexionDB.java«, que se deben indicar parámetros para cada Base de Datos, SQLite no hace uso de contraseña pero Access si, así también cuando se realiza la conexión a las bases de datos, se debe usar su driver respectivo.
En el método de consulta «Obtener_Frase_Celebre()» vemos que según la opción «Access» o «SQLite», la instrucción SQL varia un poco, ambas instrucciones hacen lo mismo pero cada lenguaje tiene sus diferencias, esto no solo ocurre en la sintaxis, sino también en la forma en que se manejan internamente los datos, por ejemplo los campos de tipo FECHA.
Vamos a unir todo
Para terminar este tutorial, debemos implementar la clase conexiónDB.java en la interfaz de usuario.
frmSelected.java : En este JFrame, declaramos las variables:
private ConexionDB conexion; frmData Data = new frmData();
En los botones btnEntrar y btnSalir se coloca el código:
private void btnEntrarActionPerformed(java.awt.event.ActionEvent evt) { this.conexion = new ConexionDB( this.jcOpcion.getSelectedItem().toString() ); // se realiza la conexión Data.setConexion(conexion); // Data.iniciar(); // se cargan los datos en el JFrame this.dispose(); // se cierra JFrame actual Data.setVisible(true); // Se muestra JFrame con los datos } private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); }
frmData: EL código del JFrame debe quedar de esta forma:
import java.util.Map; /** * @web https://www.jc-mouse.net * @author Mouse */ public class frmData extends javax.swing.JFrame { private ConexionDB conexion; /** * Creates new form frmData */ public frmData() { initComponents(); this.setLocationRelativeTo(null); this.setTitle("Frases Celebres"); } /** * conexion a base de datos * @param con de tipo ConexionDB */ public void setConexion( ConexionDB con ) { this.conexion = con; } /** * obtiene registro de base de datos y asiga a controles */ public void iniciar() { this.txtDB.setText( this.conexion.getModo() ); //Obtiene registros de la base de datos Map data = this.conexion.Obtener_Frase_Celebre(); this.txtTexto.setText( data.get("texto").toString() ); this.txtAutor.setText( data.get("autor").toString() ); } ...
OJO: no copies y pegues, estudia el código ¿ después porque tenemos errores de compilación? :/
Compilación y ejecución
Antes de ejecutar el programa, debes copiar las bases de datos *.accdb y *.sqlite en la misma carpeta donde esta el proyecto netbeans.
Ademas, en la clase ConexionDB.java, debes modificar la variable «path» que tiene el valor de «C:\\Users\\obama\\Documents\\NetbeansProjects\\dbDouble\\» , por la dirección de TU proyecto netbeans. Esto solo para la ejecución desde el IDE, cuando crees el *.JAR con «Clean and Build» , debes descomentar la linea de código: «private String path = System.getProperty(«user.dir») + «\\» ;» de esta forma cuando se creen los archivos en la carpeta DIST, copias dentro de ellos las bases de datos y ya podrás ejecutar la aplicación.
EL proyecto completo en el siguiente enlace pobre
🙂
TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de[...]
En este post veremos como conectarnos a una base de datos Access con C# En un nuevo proyecto en consola con Visual Studi[...]
Si te gusta realizar tus propios memes o foto montajes pero tienes poca o nula experiencia en editores gráficos como Pho[...]
En este post dejo el código fuente de un blog en PHP desarrollado siguiendo el patrón de diseño MVC (Modelo, Vista y Con[...]
En posts anteriores hablamos sobre los metadatos y el porque son importantes en la Seguridad Informática, vimos el manej[...]
Un JList nos permite almacenar objetos en una lista y mostrarlos gráficamente en una serie vertical en el cual el usuari[...]