como es mejor programar respecto a bases de datos y java?

Iniciado por josco, 24 Septiembre 2012, 05:17 AM

0 Miembros y 1 Visitante están viendo este tema.

josco

que tal tengo una duda aber si me explico.



yo siempre cuando manejo bases de datos programo de esta manera:

tengo una classe para mi conexion a mysql:

no tienen que revisar todo el codigo, solo lo pongo para que se den una idea.

import java.sql.*;

public class ConexionMySql {

      private Connection conn;
      private ResultSet rs;
      private Statement instruc;

      private static String ip = "localhost";
      private static String db_name = "bases_de_datos_y_java_estructura";
      private static String user = "root";
      private static String passwd = "noe87";



    public ConexionMySql()
    {

                  try{

           Class.forName("org.gjt.mm.mysql.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://"+ip+":3306/"+db_name, user, passwd);

           System.out.println("Driver org.gjt.mm.mysql.Driver in use");
           System.out.println("");

           instruc=(Statement) conn.createStatement();
           }

           catch(Exception e)
           {
                 System.out.println("Error en o al cargar ");
                 System.out.println(e.getMessage());
                 System.exit(0);
           }


    }
//realizar cambios por nimf
public void ejemplo(/*colocar parametros*/)
     {
        try{
            instruc.execute("colocar intsruccion");
        }catch(SQLException ex){
            System.out.println(ex);
        }
     }
//fin realizar cambios por nimf
    public ResultSet exec( String StrSql ) throws SQLException
     {
        rs = (ResultSet) instruc.executeQuery(StrSql);
       return rs;
     }
    public ResultSet execConsola( String StrSql )
    {
       try{
           System.out.println("--------------------------------------------");
           System.out.print("( " + StrSql + " )");
           System.out.print(" Only First and Last Rows ");
           System.out.println("  ");

           rs = (ResultSet) instruc.executeQuery(StrSql);

           ResultSetMetaData rsMetaData = rs.getMetaData();
           int numberOfColumns = rsMetaData.getColumnCount();


            System.out.println("--------------------------------------------");

            for (int i = 1; i < numberOfColumns + 1; i++)
            {
              String columnName = rsMetaData.getColumnName(i);
              System.out.print("- " + columnName + " ");
            }

            System.out.print("-");
            System.out.println("");
            System.out.println("--------------------------------------------");




            while(rs.next())
                  {
                        for (int i = 1; i < numberOfColumns + 1; i++)
                        {
                        String columnName = rsMetaData.getColumnName(i);
                        System.out.print( rs.getString(columnName) + " ");
                        }

                   rs.last();
                   System.out.println("");

                        for (int i = 1; i < numberOfColumns + 1; i++)
                        {
                        String columnName = rsMetaData.getColumnName(i);
                        System.out.print( rs.getString(columnName) + " ");
                        }
                  }

            System.out.println("");
            System.out.println("--------------------------------------------");

          }
       catch(Exception e)
         {
           System.out.println("Error en la base de datos");
           System.out.println(e.getMessage());
         }

       return rs;
      }



}



y hago mi jframe y coloco una tabla ahi y la empiezo a llenar de esta manera (ver metodoo llenarTabla):



import classes.ConexionMySql;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;

/**
*
* @author Noe
*/
public class Formulario2 extends javax.swing.JFrame {

    /** Creates new form Formulario2 */
    ResultSet rs;
    public Formulario2() {
        initComponents();
        llenarTabla();
    }
    private void llenarTabla(){
        Object object[]={""};
        DefaultTableModel tabla =  (DefaultTableModel) jTable1.getModel();
        tabla.addRow(object);
        ConexionMySql con = new ConexionMySql();
        try {
            rs = con.exec("select * from alumnos");
            int i=0;
            while (rs.next()){
                jTable1.setValueAt(rs.getInt(1), i, 0);
                jTable1.setValueAt(rs.getString(2), i, 1);
                jTable1.setValueAt(rs.getString(3), i, 2);
                jTable1.setValueAt(rs.getString(4), i, 3);
                i++;
            }
        } catch (SQLException ex) {
            Logger.getLogger(Formulario2.class.getName()).log(Level.SEVERE, null, ex);
        }
       
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Formulario2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Formulario2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Formulario2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Formulario2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Formulario2().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
}






y asi de facil, pero despues de meterme a un curso de java de oracle me doy cuenta de que para todo se usa que setNombre getNombre y asi sus get y sus set y listas como si fuese todo muy organizadito, pero en el curso no veiamos todo eso con base de datos y entonce yo pienso: pues esas variables de nombres y apellidos las podremos tomar de la base  de datos y todo lo que hay en la base de datos traernolo a java y meterlo en lista pero eso seria crear objetos para cada persona y asi no se si esto ocupe mucha memoria o que pero bueno aqui les dejo la otra forma que se ve un poco mas organizada para java:


bueno conciderando la misma classe de conexion al proyecto solo se le agregarian otras dos classes mas (procesos y alumnos) y el frame.


aqui la clase de alumnos con sus geters y sus seters:



/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package classes;

/**
*
* @author Noe
*/


public class Alumnos {
    private String nombre;
    private String apellido;
    private String matricula;
    private int id;
    public Alumnos(){
       
    }
   
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    public String getNombre(){
        return nombre;
    }
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
     public String getApellido(){
        return apellido;
    }
    public void setApellido(String apellido){
        this.apellido = apellido;
    }
     public String getMatricula(){
        return matricula;
    }
    public void setMatricula(String matricula){
        this.matricula = matricula;
    }

   
}


y aqui la clase procesos para las consultas y conexion a la base de datos:



/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package classes;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author Noe
*/
public class Procesos {
    ResultSet rs;
   
    public List <Alumnos> ListAlumnos(/*String codAlumno*/){
        List<Alumnos> lista = new ArrayList();
        String consulta = "select * from alumnos";
        ConexionMySql con = new ConexionMySql();
        try {
            rs = con.exec(consulta);
            while(rs.next()){ 
                Alumnos a = new Alumnos();
                a.setId(rs.getInt(1));
                a.setNombre(rs.getString(2));
                a.setApellido(rs.getString(2));
                a.setMatricula(rs.getString(4));
                lista.add(a);
               
            }
        } catch (SQLException ex) {
            Logger.getLogger(Procesos.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lista;
       
    }
   
}



notamos que dentro del while esta alumnos a = new alumnos().

esto provoca crear objetos para cada alumno, no se a la memoria como le valla con esto. imaginense tener que pasar varias tablas como por ejemplo alumnos, maestros, horarios, calificaciones. seria un objeteriio barbaro a mi pensar jeje.


y en el frame quedaria algo asi:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/*
* Formulario.java
*
* Created on Sep 23, 2012, 8:12:31 PM
*/
package formulario;

import classes.Alumnos;
import classes.Procesos;
import javax.swing.table.DefaultTableModel;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter.DEFAULT;

/**
*
* @author Noe
*/
public class Formulario extends javax.swing.JFrame {

    /** Creates new form Formulario */
    Procesos obj = new Procesos();
    DefaultTableModel tabla = new DefaultTableModel();
    public Formulario() {
        initComponents();
        jTable1.setModel(tabla);
        tabla.addColumn("id");
        tabla.addColumn("nombre");
        tabla.addColumn("apellido");
        tabla.addColumn("matricula");
        llenarTabla();
    }
    private void llenarTabla(){
        System.out.println(""+obj.ListAlumnos().get(1).getNombre());
        tabla.setRowCount(0);
        for(Alumnos x:obj.ListAlumnos()){
            tabla.addRow(new Object[]{x.getId(),x.getNombre(),x.getApellido(),x.getMatricula()});
        }
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(37, 37, 37)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 578, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(93, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(32, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Formulario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Formulario().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
}


notamos que el metodo de este frame para llenar la tabla tiene menos codigo



bueno espero entiendan lo que quiero decir.

entonces la pregunta es que forma de diseno o estrucura seguirian ustedes para programar en java y bases de datos? y poque?



saludos..



a por si quieren el proyecto lo pueden bajar de aqui:


https://skydrive.live.com/redir?resid=97F9EDE94EA165E!38231&authkey=!AKZ5JFoyrD63prg


lo hice en netbeans.


sapito169

#1
la segunda es la correcta y yo jamas lo haría de la primera forma

estas en el año 2012 donde las computadores tienen alrededor de 2 gigas de ran y incluso le puedes poner 4 o 6 mas de ran si te quedas sin memoria las memorias ran son baratas

mira una computadora barata de escritorio común y corriente no se va a quedar sin ran por crear 20 o 30 objetos en memoria y si tienes miles pues los sacas paginados de 20 en 20

mira no entiendo por que la mayoría prefiere variaciones de la primera solución yo pienso por que no conocen bien cuales son las ventajas y desventajas de la segunda

mira cualquier diseño que muestre la intención del código es mejor que otro que no la muestre en el segundo caso hay una clase llamada alumno la cual auto documenta que se trabaja con alumnos el diseño muestra la intención

cualquier diseño que reduzca las lineas de código es en esencia mejor .El mejor código es el que no se escribe  agregar mas lineas de código lo único es que agrega mas complejidad innecesaria.la única manera de evitar complejidad es evitándola

la segunda forma es mejor por que una correcta separación de responsabilidades comensemos que hay una clase que se encargada de la conexión a base de datos (que posierto deberia llamarse base de datos no como tu la llamaste) otra de vista y otra de tu clase alumno

por decir tu clase alumno puede tener mas métodos como nombreCompleto puedeGurdarseEnBaseDeDatos etc y estos metodos pueden modificarse en un solo lugar ademas habria un lugar para poner esos metodos de forma ordenada.

en el segundo caso debido a que cada clase tiene una responsabilidad diferente cada clase tiene una sola razón para cambiar.Por ejemplo que tal si se te ocurre un dia que no te gusta que se presente los alumnos en una tabla y quieres mostrar tus alumnos en una bonito arbol con la ultima libreria de moda pues solo cambias la clase del formulario y la unica clase que cambiaria seria la del formulario.

En el segundo caso digamos que quieres mejorar el rendimiento de tu aplicación,aunque pienso que te preocupas innecesariamente, pues solo cambiarias la clase conexion para usar un pool de conexiones solo tocarias la clase conexion pero no tocarías las otras clases

la optimisacion prematura es la madre de todos los desastres mira no te preocupes demasiado en el rendimiento preocúpate en que tus clases sigan una correcta separación de responsabilidades y que tus clases griten lo mas que puedan su intencion.

si el diseño no es optimo pero funciona regular esta bien tratar de alcanzar la perfección no solo es tonto sino imposible.si nadie se queja del rendimiento entonces no existe problema de rendimiento. si luego de realizar pruebas empíricas objetivas basadas en la realidad,objetivas ,es decir en números usando una erramienta que no te mienta (sin subjetividad) se demuestra que existe problemas de rendimiento pues lo solucionas

profavor porfavor responde me si no me deprimo

josco

gracias por responder sapito169. es una gran respuesta y muy detallada, pienso que tienes razon mientras el codigo exprese mejor lo que se desea hacer es mejor, aparte si se va a desarrollar un proyecto en equipo creo que la segunda manera de programar seria muy conveniente para todo el equipo ya que tendrian un codigo muy limpio, ordenado y muy bien organizado.

entonces de hoy en adelante voy a programar de la segunda manera y vere que resultados tengo.

saludos..