En este post veremos una forma de realizar la paginación en una base de datos Access utilizando el lenguaje de programación java. Pero primero.
¿Qué es paginación de resultados?
Paginar los resultados de una consulta SQL quiere decir mostrar al usuario solo una pequeña parte a la vez en lugar de todos los registros de golpe, al dividir los resultados en varias partes, se forma virtualmente una especie de libro con varias páginas, de ahí el nombre de paginación. Por ejemplo de un resultado de 1000 registros, pueden mostrarse paginas de 100 registros a la vez haciendo un total de 10 paginas, esto hace la navegación más amigable al usuario, optimizamos uso de memoria y tiempo de ejecución.
Aclarado conceptos, vamos a lo bueno, el código.
Utilizaremos
– Microsoft Access
– Java y Netbeans 7.x
Nivel: Intermedio
Tiempo: 20 minutos
Base de datos: dbpage.accdb
La base de datos creada en MS Access, consta de una sola tabla con 4 campos (Id, Nombre, Paterno, Materno), para apreciar mejor la paginación, debes añadir una cantidad considerable de registros, con unos 1000 registros es más que suficiente. Al final del post, tenemos el archivo de base de datos para descarga 🙂
El proyecto: JPage
El proyecto consta de dos clases Paginacion.java, es la clase donde se implementa la conexión a la base de datos y sus respectivos métodos para crear la paginacion.
Tenemos también la clase interfaz.java, como su nombre indica es la interfaz de usuario, es un JFrame que tiene el siguiente diseño:
La clase Paginacion.java tiene el siguiente código:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; /** * @web http://jc-mouse.net/ * @author Mouse */ public class Paginacion { //contraseña a la base de datos si es que tuviera, si no se deja vacio private String password = ""; //nombre de la base de datos Acces con extension *.mdb o *.accdb private String dbName = "dbpage.accdb"; //direccion de la base de datos private String bd = System.getProperty("user.dir") + "\\" + dbName + ";PWD=" + password; //driver para base de datos Access 2000, 2003, 2007, 2010 private String url = "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=" + bd; private Connection conn = null; /** * Constructor de clase */ public Paginacion() { try{ //obtenemos el driver para Access Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //obtenemos la conexión conn = DriverManager.getConnection(url); if ( conn!=null ){ //si la conexion tuvo exito System.out.println("Conexión a base de datos "+bd+". listo"); } }catch(SQLException e){ System.out.println(e); }catch(ClassNotFoundException e){ System.out.println(e); } } /* Variables para paginacion */ private int numPage=0; private int numPages=0; private String[] columnames; private Object[][] data; /** * Paginacion * @param numRegPagina Numero de registros por pagina * @param numPage Numero de Pagina * @return Matriz nxm con los registros que corresponde a Numero de Pagina dado por numPage */ public Object[][] getPagina( int numPage, int numRegPagina ) { //Numero de pagina this.numPage = ( numPage<=1 )? 1 : numPage; //Consulta SQL para obtener todos los registros String q = "SELECT id, nombre, paterno, materno FROM persona " ; Statement st; ResultSet rs; try { st = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY ); rs = st.executeQuery( q ); //Obtiene la cantidad total de registros en la tabla rs.last(); int numReg = rs.getRow(); rs.first(); //calcula posicion de registro de inicio de paginacion int fila = numRegPagina * ( this.numPage - 1 ) + 1; this.numPages = numReg / numRegPagina + ((numReg%numRegPagina > 0)? 1 : 0); //obtencion de metadatos de la tabla //nombre de las columnas ResultSetMetaData md = rs.getMetaData(); int numeroColumnas = md.getColumnCount();//numero de columnas de la tabla //recorre las columnas de la tabla y asigna a array de columnas columnames = new String[numeroColumnas]; for (int i = 1; i <= numeroColumnas; i++) { this.columnames[i-1] = md.getColumnName(i); } //-- end metadatos //Inicia matriz para los registros this.data = new String[ numRegPagina ][ numeroColumnas ]; int cont = 1; // Se mueve a la "fila" indicada y si hay datos llena la matriz con los registros if ( rs.absolute( fila ) && numRegPagina > 0 ) { int f = 0; do { for (int i = 1; i <= numeroColumnas; i++ ) { data[f][i-1] = rs.getString( i ); } f++; cont++; } while ( rs.next() && ( cont <= numRegPagina ) ); } } catch ( Exception e ) { System.err.println( "Error: "+ e.getMessage() ); } return data; } /** * @return String[] Nombres de las columnas */ public String[] ColumNames() { return columnames; } /** * @return Numero de pagina actual de paginacion */ public int getNumPage() { return this.numPage; } /** * Numero total de paginas */ public int getNumPages() { return this.numPages; } }//--> fin clase
Uniendo todo en a interfaz:
Antes
01 package JPage; 02 /** 03 * @web http://jc-mouse.net/ 04 * @author Mouse 05 */ 06 public class interfaz extends javax.swing.JFrame { 07 08 /** 09 * Creates new form interfaz 10 */ 11 public interfaz() { 12 initComponents(); 13 } 14 15 ...
Despues:
01 package JPage; 02 import javax.swing.table.DefaultTableModel; 03 /** 04 * @web http://jc-mouse.net/ 05 * @author Mouse 06 */ 07 public class interfaz extends javax.swing.JFrame { 08 09 // 10 private Paginacion paginacion = new Paginacion(); 11 12 /** 13 * Creates new form interfaz 14 */ 15 public interfaz() { 16 initComponents(); 17 18 DefaultTableModel datos = new DefaultTableModel( paginacion.getPagina( 1 , 80 ), paginacion.ColumNames() ); 19 this.TABLA.setModel( datos ); 20 this.CAJA.setText( paginacion.getNumPage() + " de " + paginacion.getNumPages() ); 21 22 }
Para terminar, añadimos el código para poder navegar entre las diferentes paginas a los JButton ANTERIOR y SIGUIENTE
private void SIGUIENTEActionPerformed(java.awt.event.ActionEvent evt) { DefaultTableModel datos = new DefaultTableModel( paginacion.getPagina( paginacion.getNumPage()+1 , 80 ), paginacion.ColumNames() ); this.TABLA.setModel( datos ); this.CAJA.setText( paginacion.getNumPage() + " de " + paginacion.getNumPages() ); } private void ANTERIORActionPerformed(java.awt.event.ActionEvent evt) { DefaultTableModel datos = new DefaultTableModel( paginacion.getPagina( paginacion.getNumPage()-1 , 80 ), paginacion.ColumNames() ); this.TABLA.setModel( datos ); this.CAJA.setText( paginacion.getNumPage() + " de " + paginacion.getNumPages() ); }
Ejecuta y tenemos:
Proyecto completo en el siguiente Link pobre 🙁
Spark Framework es un conjunto de librerías para los lenguajes Java y Kotlin que nos sirve para el desarrollo rápido y s[...]
El JTable de Java es un gran componente para mostrar datos en una tabla de una forma rápida y sencilla, sin embargo en v[...]
En un post anterior [Introducción a VueJS framework para el desarrollo FrontEnd] realizamos una breve introducción a Vue[...]
En este videoTutorial veremos la forma mas sencilla de crear un instalador para programas hechos en Java utilizando el p[...]
Slim es un micro framework para PHP que nos ayuda a escribir rápidamente aplicaciones Web y APIs sencillas pero poderosa[...]
Uno de los cambios principales introducidos a las interfaces en Java 8 fue que estos puedan tener métodos concretos, es[...]