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.
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 https://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
Detalles Proyecto
IDE: Netbeans 7.3
Base de datos: MySQL necesario conector MySQL JDBC Driver
Descarga AQUI
Comparte: + abajo
🙂
El método Bífido es un cifrado fraccionario. Es decir que cada letra viene representada por una o más letras o símbolos,[...]
En esta ocasión vemos un ejemplo sencillo de como usar Tile Map en nuestros juegos android con la librería LibGDX utiliz[...]
En post anteriores vimos lo que son los parámetros IN y los parámetros OUT pero existe otro tipo de parámetro que es la[...]
Existen muchas camaras de seguridad por internet algunas protegidas por contraseña pero la mayoria no, utilizando el hac[...]
VLC Media Player es un reproductor multimedia de código abierto muy popular desarrollado por el proyecto VideoLAN. VLCJ [...]
En este post mostramos un ejemplo de uso de la interface ResultSetMetaData el cual se extiende Wrapper que es una interf[...]