En esta oportunidad les traigo un ejemplo de como hacer búsquedas en una base de datos MySQL, y mostrarlas en un grid. Para esto usaremos el lenguaje de programación Java, y la IDE Eclipse para poder trabajarlo mejor.
Antes que nada, la base de datos MySQL:
Código:
create database bd_samplebusqueda;
use bd_samplebusqueda;
create table tm_linea
(
tm_idlinea int auto_increment primary key not null,
tm_nombrelinea varchar(150),
tm_idreflinea int,
ta_idindest varchar(2)
);
create table tm_producto
(
tm_idproducto int auto_increment primary key not null,
tm_nombreproducto varchar(150),
tm_idmarca int,
tm_idlinea int,
tm_estadoprod varchar(2)
);
create table ta_valorcomun
(
ta_idvalor int auto_increment primary key not null,
ta_idcampo varchar(50),
ta_idcodigo varchar(2),
ta_denomina varchar(50)
);
create table tm_marca
(
tm_idmarca int auto_increment primary key not null,
tm_denomarca varchar(100),
tm_nombrecompania varchar(150),
ta_idindest varchar(2)
);
insert into ta_valorcomun (ta_idcampo, ta_idcodigo, ta_denomina) values ('ta_idindest', '00', 'ACTIVO');
insert into ta_valorcomun (ta_idcampo, ta_idcodigo, ta_denomina) values ('ta_idindest', '01', 'INACTIVO');
insert into ta_valorcomun (ta_idcampo, ta_idcodigo, ta_denomina) values ('tm_estadoprod', '00', 'ACTIVO');
insert into ta_valorcomun (ta_idcampo, ta_idcodigo, ta_denomina) values ('tm_estadoprod', '01', 'INACTIVO');
insert into ta_valorcomun (ta_idcampo, ta_idcodigo, ta_denomina) values ('tm_estadoprod', '02', 'CADUCADO');
insert into ta_valorcomun (ta_idcampo, ta_idcodigo, ta_denomina) values ('tm_estadoprod', '03', 'DEFECTUOSO');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('ARTÍCULOS', 0, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('ELECTRODOMÉSTICOS', 1, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('ROPA', 1, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('LÍNEA BLANCA', 2, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('CÓMPUTO', 2, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('COMPUTADORAS', 5, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('LECTORAS CD-ROM', 5, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('MONITORES', 5, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('MOUSE', 5, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('TECLADOS', 5, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('AUDIFONOS PC', 5, '00');
insert into tm_linea (tm_nombrelinea, tm_idreflinea, ta_idindest) values ('CÁMARAS WEB', 5, '00');
insert into tm_marca (tm_denomarca, tm_nombrecompania, ta_idindest) values ('SAMSUNG', 'SAMSUNG', '00');
insert into tm_marca (tm_denomarca, tm_nombrecompania, ta_idindest) values ('GENIUS', 'GENIUS', '00');
insert into tm_marca (tm_denomarca, tm_nombrecompania, ta_idindest) values ('HALION', 'HALION', '00');
insert into tm_marca (tm_denomarca, tm_nombrecompania, ta_idindest) values ('MICRONICS', 'MICRONICS', '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 20 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 20 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03003', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03013', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('AUDIFONOS PC T71', 3, 11, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('WEBCAM MIC W315', 4, 12, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('TECLADO INALÁMBRICO KB-3974', 2, 10, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('TECLADO INALÁMBRICO MB-1542', 2, 10, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('TECLADO INALÁMBRICO GB-3183', 2, 10, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('TECLADO INALÁMBRICO RB-9646', 2, 10, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('TECLADO INALÁMBRICO TB-2377', 2, 10, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('TECLADO INALÁMBRICO QB-4568', 2, 10, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03023', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03013', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03015', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03012', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03025', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03033', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03062', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MOUSE ÓPTICO GM-03021', 2, 9, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 21 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 21 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 17 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 17 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 17 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 15 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 15 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 15 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 25 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 25 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 25 PULGADAS SyncMaster 2033', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 30 PULGADAS SyncMaster 2035', 1, 8, '00');
insert into tm_producto (tm_nombreproducto, tm_idmarca, tm_idlinea, tm_estadoprod)
values ('MONITOR 30 PULGADAS SyncMaster 2035', 1, 8, '00');
CREATE FUNCTION `fc_Obtenervalorcomun`(
codigo VARCHAR(2),
campo VARCHAR(50)
) RETURNS varchar(50) CHARSET utf8
BEGIN
DECLARE denomina VARCHAR(50);
SELECT ta_denomina INTO denomina FROM ta_valorcomun WHERE UPPER(RTRIM(ta_idcodigo)) = UPPER(RTRIM(codigo))
AND UPPER(RTRIM(ta_idcampo)) = UPPER(RTRIM(campo));
RETURN denomina;
END;
Luego de creada la base y sus tablas, necesarias para este ejemplo, abriremos nuestro Eclipse (o algún otro editor que tengamos disponible), crearemos un proyecto Java y luego agregarmos dos paquetes:
isma.db e
isma.gui (en realidad lo de
isma es por mi, pueden usar el prefijo que ustedes quieran).
Después, descarguen y agreguen el .jar que contiene el driver para trabajar con MySql (el link de descargar lo encuentrna en este artículo: ).
Ahora, en el paquete isma.db crearemos el archivo DbConnection.java, el cula contendrá una clase del mismo nombre:
package isma.db;
import java.sql.*;
public class DbConnection {
static String bd = "bd_samplebusqueda";
static String login = "root";
static String password = "";
static String url = "jdbc:mysql://localhost/" + bd;
Connection conn = null;
public DbConnection() {
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,login,password);
}catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}
}
public Connection getConnection(){
return conn;
}
public void desconectar(){
conn = null;
}
}
Luego crearemos, en el mismo paquete, un archivo
DbProducto.java, que nos servirá para extraer los datos de la base:
package isma.db;
import java.sql.*;
public class DbProducto {
DbConnection cn;
public DbProducto() {
cn = new DbConnection();
}
public Object[][] listarProducto(String cadenaBusqueda){
int registros = 0;
try{
PreparedStatement pstm = cn.getConnection().prepareStatement("select count(1) as cont" +
" from tm_producto as a" +
" inner join tm_linea as b on a.tm_idlinea = b.tm_idlinea" +
" inner join tm_marca as c on a.tm_idmarca = c.tm_idmarca" +
" where a.tm_nombreproducto like '%" + cadenaBusqueda + "%' ");
ResultSet res = pstm.executeQuery();
res.next();
registros = res.getInt("cont");
res.close();
}catch(SQLException e){
System.out.println(e);
}
Object [][] data = new Object[registros][5];
try{
String strsql = "";
strsql = "select a.tm_idproducto, a.tm_nombreproducto, b.tm_nombrelinea, c.tm_denomarca, " +
" fc_Obtenervalorcomun(a.tm_estadoprod, 'tm_estadoprod') as Estado" +
" from tm_producto as a " +
" inner join tm_linea as b on a.tm_idlinea = b.tm_idlinea" +
" inner join tm_marca as c on a.tm_idmarca = c.tm_idmarca" +
" where a.tm_nombreproducto like '%" + cadenaBusqueda + "%' ";
PreparedStatement pstm = cn.getConnection().prepareStatement(strsql);
ResultSet res = pstm.executeQuery();
int i = 0;
while(res.next()){
int idproducto = res.getInt("tm_idproducto");
String nomproducto = res.getString("tm_nombreproducto");
String nomlinea = res.getString("tm_nombrelinea");
String denomarca = res.getString("tm_denomarca");
String estadolinea = res.getString("Estado");
data[i][0] = idproducto;
data[i][1] = nomproducto;
data[i][2] = nomlinea;
data[i][3] = denomarca;
data[i][4] = estadolinea;
i++;
}
res.close();
}catch(SQLException e){
System.out.println(e);
}
return data;
}
}
El código anterior hace primero un conteo de todos los registros que aparecerán según el criterio que hayamos ingresado, para poder llenar el array de objeto que contendrá los datos que nosotros queremos que se listen o se muestren en el formulario.
Como verás, la consulta empleada para devolver los datos tiene un par de INNER JOIN, para aprovechar las otras dos tablas y su relación con tm_producto, y una llamada a una función (fc_Obtenervalorcomun), con el objetivo de demostrar que esto funciona con cualquier consulta empleada.
Demás está mencionar la cláusula WHERE, que nos servirá para hacer las búsquedas.
Vayamos ahora a realizar la interfaz gráfica en el paquete isma.gui. Primero importaremos el paquete isma.db y las librerías necesarias:
import isma.db.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
Ahora definamos la clase, los controles y las variables que usaremos para desarrollar el formulario:
public class frmProducto extends JFrame {
private static final long serialVersionUID = 1L;
private BorderLayout esquema;
private JPanel panelnorte, panelsur, panelcentro, panelBusqueda;
private JLabel lbltitulo, lblnomproducto;
private JTextField txtNomProducto;
JButton btnBuscar;
JScrollPane spProducto;
DefaultTableModel dtmProducto;
JTable jtbProducto;
Object[][] dtProducto;
DbProducto producto = new DbProducto();
int fila = -1;
Luego definamos la naturaleza de los paneles:
public frmProducto() {
super("Búsqueda de registros - Desarrollado por Loveless Isma");
esquema = new BorderLayout();
panelnorte = new JPanel();
panelcentro = new JPanel(new BorderLayout());
panelBusqueda = new JPanel(new FlowLayout());
panelsur = new JPanel();
Ahora mostramos el estado inicial de los registros, esto es, la tabla que contendrá los datos traídos desde la base:
dtProducto = producto.listarProducto("");
String[] columNames = {"ID", "Nombre de Producto", "Línea", "Marca", "Estado"};
dtmProducto = new DefaultTableModel(dtProducto, columNames);
jtbProducto = new JTable(dtmProducto);
jtbProducto.setPreferredScrollableViewportSize(new Dimension(700, 120));
jtbProducto.setAutoCreateRowSorter(true);
spProducto = new JScrollPane(jtbProducto);
En el código anterior vemos como primero llenamos el objeto array bidimensional
dtProducto con el resultado de la función
listarProducto, para luego definir los nombres o las etiquetas que tendrán las columnas de la grilla.
Luego, como se darán cuenta instanciamos a DefaultTableModel en dtmProducto, lo que significa que estamos creando la plantilla para armar nuestra grilla o tabla, y lo hermoso es que sólo hemos tenido que pasarle dos arrays para conseguirlo.
Después, creamos la tabla utilizando la plantilla anteriormente creada, le añadimos propiedades y finalmente la agregamos a un JScrollPane, de vital importancia si queremos que se nos muestre una barra deslizante por si los registros son muchos.
Instanciamos los controles que hacen falta y seteamos algunas mariconadas:
lbltitulo = new JLabel("BÚSQUEDA DE REGISTROS");
lbltitulo.setForeground(Color.WHITE);
lbltitulo.setFont(new Font("Verdana", Font.BOLD, 14));
lblnomproducto = new JLabel("Producto a buscar:");
txtNomProducto = new JTextField(25);
btnBuscar = new JButton("Buscar");
Antes de programar el botón
btnBuscar, primero crearemos un método para realizar la búsqueda y presentarlo de manera gráfica (eso si, fuera del constructor de la clase, no demuestres tener mente de Daddy Yankee):
private void mostrarProductos(String criterio)
{
dtProducto = producto.listarProducto(criterio);
int contRows = dtmProducto.getRowCount();
for (int i = 0; i < contRows; i++){
dtmProducto.removeRow(0);
}
for (int i = 0; i < dtProducto.length; i++){
Object[] nuevaFila = {dtProducto[i][0], dtProducto[i][1], dtProducto[i][2], dtProducto[i][3], dtProducto[i][4]};
dtmProducto.addRow(nuevaFila);
}
}
En el método
mostrarProductos, primero volvemos a definir la variable objeto de array llenándola con los nuevos datos que hayamos obtenido según el criterio ingresaod.
Hacemos un conteo de las filas mostradas recientemente en la tabla, y en base a eso hacemos un recorrido para borrar todas las filas.
Luego, añadimos nuevamente las filas en base a la información obtenida en el objeto array.
Ahora bien, programemos el botón de búsqueda:
btnBuscar.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent evento)
{
mostrarProductos(txtNomProducto.getText());
}
}
);
Armamos luego nuestro formulario:
panelBusqueda.add(lblnomproducto);
panelBusqueda.add(txtNomProducto);
panelBusqueda.add(btnBuscar);
getContentPane().setLayout(esquema);
panelnorte.add(lbltitulo);
panelnorte.setBackground(Color.black);
panelcentro.add(panelBusqueda, BorderLayout.NORTH);
panelcentro.add(spProducto, BorderLayout.CENTER);
panelsur.setBackground(Color.BLACK);
getContentPane().add(panelnorte, BorderLayout.NORTH);
getContentPane().add(panelcentro, BorderLayout.CENTER);
getContentPane().add(panelsur, BorderLayout.SOUTH);
this.pack();
setSize(800, 350);
setResizable(false);
setLocationRelativeTo(this.getParent());
setVisible(true);
}
Y finalmente mostramos en la terminal principal el ejemplo ya terminado:
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch ( Exception e ) {
JOptionPane.showMessageDialog(null, "Imposible modificar el tema visual", "Lookandfeel inválido.", JOptionPane.ERROR_MESSAGE);
}
frmProducto aplicacion = new frmProducto();
aplicacion.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
}
} //Fin de la clase
Ahora, pasemos a la prueba de rigor:

Eso ha sido todo muchachos, espero les sirva para algo. Ah, si notan que no estuve insultando mucho en este artículo es porque estoy de buen humor: vi el final de una película de judíos donde al final dos niños mueren, me cagué de risa. Si quieren saber que película es se llama El niño del pijama a rayas, muy buena, a mi me hizo reír la muerte del niñito ese XD. Que la pasen bien.
Actualización 15 de septiembre del 2010:
Por motivos de tiempo (y olvido, mi memoria a veces es una mierda), olvidé subir el archivo del ejemplo. Mil disculpas en serio.

Descargar ejemplo
¿Dudas sobre el ejemplo? ¿Algún comentario? Escríbeme a lovelessisma@gmail.com. Regálame una alegría más.
Me gusta:
Sé el primero en decir que te gusta esta post.
Gracias:)
Gracias..
coloca mas ejemplos man
gracias amigo atte jfranco
QUE GRANDE que sos… se podra hacerlo sin el boton buscar y con un evento keypress?
Buenisimo aporte!!!!.. ayudas como estas son las que en realidad te van guiando por este dificil camino cuando eres novato..