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.
Código:
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):
Código:
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:
Código:
/*
* 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:
Código:
/*
* 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:
Código:
/*
* 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.