Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / JTree Recursivo

JTree Recursivo

Autor jc mouse viernes, junio 20, 2014

En un post anterior se vio como llenar un JTree en donde se conocía de antemano que estructura iba a tener esta sin embargo en muchas ocasiones esto no es así. Tal el caso la estructura que tiene o puede tener una empresa, en donde una persona puede o no tener personas a su cargo,  el siguiente ejemplo ilustra mejor lo que se quiere decir.

estructura

Así también la forma en que se puede guardar este tipo de jerarquías en la base de datos es gracias a tablas recursivas :/ por ejemplo:

-- 
-- Estructura de tabla para la tabla 'estructura'
-- 

CREATE TABLE estructura (
  estructura_id bigint(10) NOT NULL auto_increment,
  nombre varchar(32) NOT NULL,
  depende_id bigint(10) NOT NULL default '0',
  PRIMARY KEY  (estructura_id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;

-- 
-- Volcar la base de datos para la tabla 'estructura'
-- 

INSERT INTO estructura VALUES (1, 'Fernando Coco Cuadrado', 0);
INSERT INTO estructura VALUES (2, 'Tomas Turbado', 0);
INSERT INTO estructura VALUES (3, 'Ramona Ponte Alegre', 1);
INSERT INTO estructura VALUES (4, 'Pascual Conejo Enamorado', 1);
INSERT INTO estructura VALUES (5, 'Elvis Cochuelo decaca', 2);
INSERT INTO estructura VALUES (6, 'Miren Amiano', 4);
INSERT INTO estructura VALUES (7, 'Ernesto Quiere Unriñon', 4);
INSERT INTO estructura VALUES (8, 'Susana Horia Legusta', 3);
INSERT INTO estructura VALUES (9, 'Adam lumio', 5);
INSERT INTO estructura VALUES (10, 'Aldo Lorido', 2);
INSERT INTO estructura VALUES (11, 'Alex Cremento', 7);
INSERT INTO estructura VALUES (12, 'Viviana K. Lavuelta', 4);
INSERT INTO estructura VALUES (13, 'Armando Esteban Quito', 3);
INSERT INTO estructura VALUES (14, 'Federico Chino', 2);
INSERT INTO estructura VALUES (15, 'Helen Chufe', 5);
INSERT INTO estructura VALUES (16, 'Al K. Huete', 6);

En este post no explicaremos a detalle como es que se hizo el proyecto (falta de tiempo 🙂 ) pero si dejo el proyecto para descarga al final del post para su respectivo análisis, lo que si dejo es una breve explicación de cada clase utilizada

1. Declaramos nuestra clase que gestionara la base de datos

import java.sql.*;
/**
 * @web http://www.jc-mouse.net
 * @author Mouse
 */
public class Database {

    /* DATOS PARA LA CONEXION */
  private String bd = "db123";
  private String login = "***";//USUARIO
  private String password = "***";//CONTRASEÑA
  private String url = "jdbc:mysql://localhost/"+bd;
  private Connection conn = null;
//___________________________________________________________________________________ Soy una barra separadora 🙂
   public Database(){
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         if (conn!=null){
            System.out.println("OK base de datos "+bd+" listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
    }
//___________________________________________________________________________________ Soy una barra separadora 🙂
    public Connection getConnection()
    {
        return this.conn;
    }
//___________________________________________________________________________________ Soy una barra separadora 🙂
/* METODO PARA REALIZAR UNA CONSULTA A LA BASE DE DATOS
 * INPUT:
 * table => nombre de la tabla donde se realizara la consulta, puede utilizarse tambien INNER JOIN
 * fields => String con los nombres de los campos a devolver Ej.: campo1,campo2campo_n
 * where => condicion para la consulta
 * OUTPUT: un object[][] con los datos resultantes, sino retorna NULL
 */
    public Object [][] select(String table, String fields, String where){
      int registros = 0;
      String colname[] = fields.split(",");

      //Consultas SQL
      String q ="SELECT " + fields + " FROM " + table;
      String q2 = "SELECT count(*) as total FROM " + table;
      if(where!=null)
      {
          q+= " WHERE " + where;
          q2+= " WHERE " + where;
      }
      //obtenemos la cantidad de registros existentes en la tabla
      try{
         PreparedStatement pstm = conn.prepareStatement(q2);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][fields.split(",").length];
    //realizamos la consulta sql y llenamos los datos en la matriz "Object"
      try{
         PreparedStatement pstm = conn.prepareStatement(q);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            for(int j=0; j<=fields.split(",").length-1;j++){
                data[i][j] = res.getString( colname[j].trim() );
            }
            i++; }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }
//___________________________________________________________________________________ Soy una barra separadora 🙂

}

2. Declaramos un método getHojas al cual se le pasan como parámetros  una raíz y el id para la consulta en SQL, se realizara una consulta a la base de datos y se retornan los hijos si es que los tuviera se vuelve a llamar al metodo getHojas y así se va llenando todo el árbol de jerarquías.

01 
02     /**
03  * Obtiene las hojas de una hoja o.O
04  * @param raiz DefaultMutableTreeNode
05  * @param id String
06  */
07     public void getHojas( DefaultMutableTreeNode raiz, String id ){        
08         Object[][] data =  db.select("estructura", " estructura_id, nombre ", " depende_id='"+id+"'");        
09         for(int i=0; i < data.length; i++){
10             DefaultMutableTreeNode hoja = new DefaultMutableTreeNode( data[i][1] );            
11             getHojas( hoja , data[i][0].toString() );
12             raiz.add( hoja );
13         }        
14     }
15 

jerarquias

Detalles Proyecto

IDE: Netbeans 7.3

Base de datos: MySQL necesario conector MySQL JDBC Driver

Descarga AQUI

Comparte: + abajo

🙂

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Control de Paginación (Pagination) en tus Apps FX

Control de Paginación (Pagination) en tus Apps FX

El control de paginación de JavaFX (Pagination) se usa para navegar a través de varias paginas de contenido divididas en...

Generador de códigos QR (Quick Response)

Generador de códigos QR (Quick Response)

En este tutorial aprenderemos a crear nuestra propia aplicación java para generar códigos QR. ¿Que es un Código QR?...

Minimizar aplicación al SystemTray/Bandeja del Sistema

Minimizar aplicación al SystemTray/Bandeja del Sistema

El SystemTray/Bandeja del Sistema o como también se le llama “Área de Notificación” es la sección de la barr...

Laberinto del Terror (Código Fuente + juego)

Laberinto del Terror (Código Fuente + juego)

El laberinto del terror es un juego en el que haciendo uso del ratón y de tu pulso de borracho debes cruzar distintos la...

Firebird iSQL – introducción

Firebird iSQL – introducción

iSQL: Es una herramienta de linea de comandos que acompaña a Firebird, se encuentra en la carpeta BIN, sirve para realiz...

Crea un servicio web REST con PHP y MYSQL -Parte 2

Crea un servicio web REST con PHP y MYSQL -Parte 2

Segunda parte del tutorial “Crea un servicio web REST con PHP y MYSQL“, en esta segunda y ultima parte se co...

2 comentarios en “JTree Recursivo”

  1. Richii dice:

    Me encanta tus tutoriales,sos un capoo…solo queria saber como realizar un ABM siguiendo este ejemplo.Saludos

  2. Raul Narvaez dice:

    Amigo muy buen trabajo, pero tengo una pregunta en la base de datos esta que por defecto tendra 0 si es la raiz per como es una relacion recursiva al hacer la relación sale que ID con el que estas relacionando no existe y es verdad el registro con el ID = 0 no existe. Me puedes sacar de esa duda? gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Comparte lo que sabes

Categorias

Últimas entradas

PHPUnit es un framework que se utiliza para escribir tests en PHP, Netbeans nos permite configurarlo y usarlo fácilmente...

Una Prueba Unitaria, es una forma de comprobar que nuestro código, hace lo que se supone debe hacer; es decir, se asegur...

La prueba del camino básico, es una prueba de “caja blanca” que consiste en verificar el código de nuestros...

Si quieres cambiar el nombre de tus atributos sin tener que reescribir código java por X o Y razón, GSON te permite reno...

Android Bolivia

Bandera en Alto