[JAVA][MYSQL] Tutorial Basico

Iniciado por LKI, Octubre 04, 2014, 04:33:17 PM

Tema anterior - Siguiente tema

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

Octubre 04, 2014, 04:33:17 PM Ultima modificación: Octubre 04, 2014, 05:04:15 PM por Expermicid
Buenas gente llevo unos días preparando este tutorial que por mas básico que sea, me llevo un buen rato asi que espero que lo disfruten :P

Requisitos:
-IDE (Eclipse/Netbeans) No es obligatorio.
-Gestor de base de datos con MYSQL (Yo usare AppServ  2.5.10 pero se puede usar cualquier otro) Obligatorio.
-El driver MYSQL para conectarnos a la base de datos (Se puede bajar de la pagina oficial de MYSQL) Obligatorio.
-Conocimientos Básico-Intermedios de programación.


Introduccion:
Para llevar a cabo este tutorial se hará uso de la metodología MVC (Modelo-Vista-Controlador).
CitarEl cual es un patrón de arquitectura de software que separa los datos y la lógica de negocio de una aplicación de la interfaz de usuario y el módulo encargado de gestionar los eventos y las comunicaciones. Para ello MVC propone la construcción de tres componentes distintos que son el modelo, la vista y el controlador, es decir, por un lado define componentes para la representación de la información, y por otro lado para la interacción del usuario.Este patrón de arquitectura de software se basa en las ideas de reutilización de código y la separación de conceptos, características que buscan facilitar la tarea de desarrollo de aplicaciones y su posterior mantenimiento. WIKIPEDIA


Diseño:

Base de datos


  • Creacion de la base de datos.
[/list]
Código: sql
CREATE DATABASE  `dbtest` ;

  • Creacion de la tabla y volcado de la misma.
Código: sql
-- Estructura de tabla para la tabla 'producto'
--

CREATE TABLE producto (
  p_id varchar(6) NOT NULL,
  p_nombre varchar(21) NOT NULL,
  p_precio float NOT NULL default '0',
  p_cantidad int(20) NOT NULL default '0',
  PRIMARY KEY  (p_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

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

INSERT INTO producto VALUES ('P9-U7J', 'Producto 1', 100, 0);
INSERT INTO producto VALUES ('KO-8HY', 'Producto 2', 56.9, 0);
INSERT INTO producto VALUES ('UJ-9KK', 'Producto 3', 120.5, 0);
INSERT INTO producto VALUES ('KK-77G', 'Producto 4', 23.4, 0);
INSERT INTO producto VALUES ('KJ-886', 'Producto 5', 88, 0);
INSERT INTO producto VALUES ('PP-99P', 'Producto 6', 78.9, 0);
INSERT INTO producto VALUES ('GH-77U', 'Producto 7', 99.9, 0);


Estructura de la base de datos:
                         

Programacion:

  • Estructura del programa

  • Creación de las clases:
Empezaremos creando un nuevo proyecto en eclipse FILE -> New -> Java Project y de nombre al proyecto le pondremos TutorialUndercode. Click izquierdo en el proyecto (NEW -> Package ) y crearemos los paquetes controlador,vista y modelo.

La Vista:
Empezaremos creando el modelo GUI (Interfaz Grafica de Usuario) para nuestro proyecto que tendrá la siguiente forma:
               

VentanaVista2:
Crearemos dentro del paquete vista otra ventana que nos permitira ingresar nuevos registros a la base de datos:
Código: JAVA
package vista;

import javax.swing.JDialog;
/*
* Se desarrolla una clase de tipo JDialog que permite
*  agregar elementos a partir de una nueva ventana.
*
*/
public class VentanaVista2 extends JDialog {
public JTextField txtID;
public JTextField txtNombre;
public JTextField txtPrecio;
public JTextField txtCantidad;
public JButton aceptar;

public VentanaVista2() {

iniciarComponentes();

}

/*
* Se inicializa una GUI normal.
*/
private void iniciarComponentes() {

this.setSize(225, 209);
getContentPane().setLayout(null);

JLabel id_producto = new JLabel("id_producto");
id_producto.setFont(new Font("Tahoma", Font.PLAIN, 13));
id_producto.setBounds(10, 11, 75, 14);
getContentPane().add(id_producto);

JLabel nombre_producto = new JLabel("Nombre");
nombre_producto.setFont(new Font("Tahoma", Font.PLAIN, 13));
nombre_producto.setBounds(10, 36, 75, 14);
getContentPane().add(nombre_producto);

JLabel precio_producto = new JLabel("Precio");
precio_producto.setFont(new Font("Tahoma", Font.PLAIN, 13));
precio_producto.setBounds(10, 61, 75, 14);
getContentPane().add(precio_producto);

JLabel cantidad_producto = new JLabel("Cantidad");
cantidad_producto.setFont(new Font("Tahoma", Font.PLAIN, 13));
cantidad_producto.setBounds(10, 86, 75, 14);
getContentPane().add(cantidad_producto);

txtID = new JTextField();
txtID.setBounds(95, 9, 86, 20);
getContentPane().add(txtID);
txtID.setColumns(10);

txtNombre = new JTextField();
txtNombre.setColumns(10);
txtNombre.setBounds(95, 34, 86, 20);
getContentPane().add(txtNombre);

txtPrecio = new JTextField();
txtPrecio.setColumns(10);
txtPrecio.setBounds(95, 59, 86, 20);
getContentPane().add(txtPrecio);

txtCantidad = new JTextField();
txtCantidad.setColumns(10);
txtCantidad.setBounds(95, 84, 86, 20);
getContentPane().add(txtCantidad);

aceptar = new JButton("Aceptar");
aceptar.setBounds(50, 127, 119, 33);
getContentPane().add(aceptar);

}
}


  • El Controlador:
Creamos dentro del paquete controlador una clase llamada Controlador que hara de interfaz entre la conexion y consulta a la base de datos y la GUI.
Código: java
package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

import vista.VentanaVista2;
import vista.VentanaVista;
import modelo.Modelo;

public class Controlador implements ActionListener, MouseListener {
/*
* Controlador:
* Comunica a la interfaz grafica con la logica
*/
private VentanaVista2 vista2;
private Modelo modelo;
private VentanaVista vista;

public Controlador(Modelo _modelo, VentanaVista _vista,
VentanaVista2 _vista2) {
this.vista2 = _vista2;
this.modelo = _modelo;
this.vista = _vista;
this.vista.setVisible(true);
agregarEventos();

}

private void agregarEventos() {

this.vista.btnAgregarProductos.addActionListener(this);// añadimos el// evento
this.vista.btnAgregarProductos.setActionCommand("agregarProductos");// reconocimiento del boton
this.vista.btnEliminarProductos.addActionListener(this);

this.vista.btnEliminarProductos.setActionCommand("eliminarProductos");// reconocimiento del boton
this.vista.btnVerProductos.addActionListener(this);// añadimos el evento
this.vista.btnVerProductos.setActionCommand("verProductos");// reconocimiento del boton
this.vista.itemCreditos.setActionCommand("creditos");
this.vista.itemCreditos.addActionListener(this);
this.vista.btnEditarProductos.addActionListener(this);
this.vista.btnEditarProductos.setActionCommand("editarProductos");

// añade e inicia el jtable con un DefaultTableModel vacio
this.vista.__tabla_producto.addMouseListener(this); // añadimos el
// evento
this.vista.__tabla_producto.setModel(new DefaultTableModel());
this.vista.setLocationRelativeTo(null); // Centramos la aplicacion

}


@Override
public void actionPerformed(ActionEvent evento) { //Se lleva a cabo el manejo de eventos
                                                     
switch (evento.getActionCommand()) {         

case "verProductos":

this.vista.__tabla_producto
.setModel(this.modelo.getTablaProducto());
this.vista.btnVerProductos.setEnabled(false);
break;

case "agregarProductos":

this.vista2 = new VentanaVista2();
this.vista2.setModal(true);
this.vista2.setLocationRelativeTo(vista);
this.vista2.aceptar.addActionListener(this);
this.vista2.aceptar.setActionCommand("nuevoRegistro");
this.vista2.setVisible(true);
break;

case "eliminarProductos":

if (this.modelo.EliminarProducto(
this.vista.__id_producto.getText(),
this.vista.__nombre.getText())) {

this.vista.__tabla_producto.setModel(this.modelo
.getTablaProducto());
this.vista.__id_producto.setText("");
this.vista.__nombre.setText("");
this.vista.__precio.setText("0");
this.vista.__cantidad.setText("0");
}

break;
case "creditos":
JOptionPane.showMessageDialog(this.vista,
"Modificiado y adaptado de http://www.jc-mouse.net/",
"Creditos", JOptionPane.INFORMATION_MESSAGE);

break;
case "editarProductos":

String id = this.vista.__id_producto.getText();
String nombre = this.vista.__nombre.getText();
String precio = this.vista.__precio.getText();
String cantidad = this.vista.__cantidad.getText();
if (this.modelo.editarProducto(id, nombre, precio, cantidad)) {

this.vista.__tabla_producto.setModel(this.modelo
.getTablaProducto());
this.vista.__id_producto.setText("");
this.vista.__nombre.setText("");
this.vista.__precio.setText("0");
this.vista.__cantidad.setText("0");
JOptionPane.showMessageDialog(vista,
"Registro agregado correctamente!!");
} else {
JOptionPane.showMessageDialog(vista,
"Error no pueden existir campos vacios");
}

break;

case "nuevoRegistro":

if (this.modelo.NuevoProducto(this.vista2.txtID.getText(),
this.vista2.txtNombre.getText(),
this.vista2.txtPrecio.getText(),
this.vista2.txtCantidad.getText())) {
this.vista2.dispose();
this.vista.__tabla_producto.setModel(this.modelo
.getTablaProducto());
JOptionPane.showMessageDialog(vista,
"Exito: Nuevo registro agregado.");
this.vista.__id_producto.setText("");
this.vista.__nombre.setText("");
this.vista.__precio.setText("0");
this.vista.__cantidad.setText("0");
} else
// ocurrio un error
JOptionPane.showMessageDialog(vista,
"Error: Los datos son incorrectos.");
break;

}

}

          /*Se implementa el metodo abstracto que atiende el click del mouse
           */
public void mouseClicked(MouseEvent e) {
if (e.getButton() == 1)// Si se presiona click sobre algun elemento del
// JTable lo mostramos en los textFields
{
int fila = this.vista.__tabla_producto.rowAtPoint(e.getPoint());
if (fila > -1) {
this.vista.__id_producto.setText(String
.valueOf(this.vista.__tabla_producto
.getValueAt(fila, 0)));
this.vista.__nombre.setText(String
.valueOf(this.vista.__tabla_producto
.getValueAt(fila, 1)));
this.vista.__precio.setText(String
.valueOf(this.vista.__tabla_producto
.getValueAt(fila, 2)));
this.vista.__cantidad.setText(String
.valueOf(this.vista.__tabla_producto
.getValueAt(fila, 3)));
}

this.vista.__id_producto.setEditable(false);
}
}

@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}

}

  • El Modelo:
Dentro del modelo crearemos dos clases Conexion y Modelo, la primera nos conectara a la base de datos y la segunda obtendrá la información necesaria de la misma.

  • Conexion
Código: java
package modelo;

import java.io.ObjectInputStream.GetField;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
* LLeva a cabo la conexion con la base de datos.
*/
public class Conexion {

/*
* Se declaran los atributos de la conexion.
*/
private static String usuario = "root";
private static String password = "root";
private static String baseDeDatos = "";
private static String driver = "com.mysql.jdbc.Driver";
private static String servidor = "jdbc:mysql://localhost/" + baseDeDatos;
private static Connection conexion = null;

/*
* Constructor sobrecargado permite configurar el acceso a cualquier DB especificando
* la tabla el usuario y la contraseña.
*/
public Conexion(String usuario, String password, String baseDeDatos) {
setUsuario(usuario);
setPassword(password);
setBaseDeDatos(baseDeDatos);
Conexion.servidor = "jdbc:mysql://localhost/" + getBaseDeDatos();

}

public Conexion() {

Conexion.servidor = "jdbc:mysql://localhost/" + getBaseDeDatos();

}

/*
* Metodo que se conecta y establece la conexion al servidor
*/
void establecerConexion() {

try {
Class.forName(driver); // Cargo el driver de MYSQL
          conexion = DriverManager.getConnection(servidor, usuario, password); // Establezco la conexion
} catch (ClassNotFoundException | SQLException excepcion) {
System.out.println("Error en la conexion trate incorporando\n El driver a su proyecto ");
}

}
/*
* Metodos GETTERS y SETTERS
*/

public static String getUsuario() {
return usuario;
}

public static void setUsuario(String usuario) {
Conexion.usuario = usuario;
}

public static String getPassword() {
return password;
}

public static void setPassword(String password) {
Conexion.password = password;
}

public static String getDriver() {
return driver;
}

public static void setDriver(String driver) {
Conexion.driver = driver;
}

public static String getServidor() {
return servidor;
}

public static void setServidor(String servidor) {
Conexion.servidor = servidor;
}

public Connection getConexion() {
return conexion;
}

public void setConexion(Connection conexion) {
Conexion.conexion = conexion;
}

public static String getBaseDeDatos() {
return baseDeDatos;
}

public static void setBaseDeDatos(String baseDeDatos) {
Conexion.baseDeDatos = baseDeDatos;
}

}

  • Modelo
Código: java
package modelo;

import javax.swing.table.DefaultTableModel;
import javax.swing.*;

import java.sql.*;
/*
* LLeva a cabo la logica del programa y le entrega los datos procesados
* a los niveles adyacentes
*
*/

public class Modelo {
private Conexion conexionMYSQL;
private boolean res = false;
private boolean bandera = false;

public Modelo() {
conexionMYSQL = new Conexion("root", "root", "dbtest");
//Se establece la base de datos y las claves de acceso para la conexion aL GESTOR MYSQL.
}

//Metodo que retorna un DefaultTableModel permitiendo llenar la tabla del GUI.
public DefaultTableModel getTablaProducto() {
DefaultTableModel tablemodel = new DefaultTableModel();
int registros = 0;
String[] columNames = { "ID", "Nomnbre", "Precio", "Cantidad" }; //Se establecen las columnas de la tabla
// obtenemos la cantidad de registros existentes en la tabla y se
// almacena en la variable "registros"
// para formar la matriz de datos
try {

conexionMYSQL.establecerConexion(); //Nos conectamos a la base de datos

PreparedStatement pstm = conexionMYSQL.getConexion()
.prepareStatement("SELECT count(*) as total FROM producto");
ResultSet res = pstm.executeQuery();
res.next();
registros = res.getInt("total"); //Obtenemos el total de los registros para crear la matriz de objetos
res.close();
} catch (SQLException e) {
System.err.println(e.getMessage());
}
// se crea una matriz con tantas filas y columnas que necesite
Object[][] data = new String[registros][4];
try {
// realizamos la consulta sql y llenamos los datos en la matriz
// "Object[][] data"
PreparedStatement pstm = conexionMYSQL.getConexion()
.prepareStatement("SELECT * FROM producto");
ResultSet res = pstm.executeQuery();
int i = 0;
while (res.next()) {
data[i][0] = res.getString("p_id");
data[i][1] = res.getString("p_nombre");
data[i][2] = res.getString("p_precio");
data[i][3] = res.getString("p_cantidad");
i++;
}
res.close();
// se añade la matriz de datos en el DefaultTableModel
tablemodel.setDataVector(data, columNames);
} catch (SQLException e) {
System.err.println(e.getMessage());
}
return tablemodel; //Retornamos la matriz de datos para que sea cargada en el evento "VER PRODUCTOS"
}

//Metodo para editar/actualizar un registro
public boolean editarProducto(String id, String nombre, String _precio,String _cantidad) {
//Se valida el producto
if (nombre.trim().length() > 0 && id.trim().length() > 0) {
try {
Double precio = Double.parseDouble(_precio.replace(",", "."));

int cantidad = Integer.parseInt(_cantidad);
String actualizar = "UPDATE  `producto` SET  `p_nombre` = ?,`p_precio` =  ?,`p_cantidad` =  ?  WHERE  `p_id` = ?";
PreparedStatement consulta = conexionMYSQL.getConexion()
.prepareStatement(actualizar);
consulta.setString(1, nombre);
consulta.setDouble(2, precio);
consulta.setInt(3, cantidad);
consulta.setString(4, id);

if (consulta.executeUpdate() == 1) {
//Si la consulta se ejecuto correctamente devolvemos verdadero

bandera = true;
} else { //Sino devolvemos falso
bandera = false;
}
} catch (SQLException e) {

System.out.println(e);
}
}
return bandera;

}

//Metodo para eliminar un producto
public boolean EliminarProducto(String id, String nombre) {
if (nombre.trim().length() > 0) { //Si se selecciono un registro se lo elimina

// se arma la consulta
String consultaSQL = " DELETE FROM producto WHERE  p_id='" + id
+ "' ";
// se ejecuta la consulta
try {
PreparedStatement pstm = conexionMYSQL.getConexion()
.prepareStatement(consultaSQL);
pstm.execute();
pstm.close();
res = true;
JOptionPane.showMessageDialog(null,
"Registro eliminado correctamente!!");
} catch (SQLException e) {
System.err.println(e.getMessage());
}
} else {  //Si no se selecciono un registro devuelve un error
res = false;
JOptionPane.showMessageDialog(null,
"Debe seleccionar un registro!!", "Error",
JOptionPane.ERROR_MESSAGE);
}
return res;
}

//Metodo que añade un producto a la base de datos
public boolean NuevoProducto(String id, String nombre, String precio,
String cantidad) {
if (valida_datos(id, nombre, precio, cantidad)) {
// se reemplaza "," por "."
precio = precio.replace(",", ".");
// Se arma la consulta
String consulta = " INSERT INTO producto ( p_id , p_nombre , p_precio, p_cantidad  ) "
+ "VALUES ( '"
+ id
+ "','"
+ nombre
+ "', '"
+ precio
+ "'," + cantidad + " ) ";
// se ejecuta la consulta
try {
PreparedStatement pstm = conexionMYSQL.getConexion()
.prepareStatement(consulta);
pstm.execute();
pstm.close();
return true; // Solo si la consulta se ejecuto devuelve TRUE en
// los demas casos FALSE
} catch (SQLException e) {
System.err.println(e.getMessage());
}
return false;
} else
return false;
}

//Valida que el ID,NOMBRE Y PRECION SEAN VALIDOS
private boolean valida_datos(String id, String nombre, String precio,
String cantidad) {
if (id.equals("  -   ")) //Si el id es igual a - devuelve falso
return false;
else if (nombre.length() > 0 && precio.length() > 0
&& cantidad.length() > 0) { //Si cumple la condicion  devuelve verdadero
return true;
} else   //Si ninguno de los dos cumple devuelve falso
return false;
}

}


  • Clase Ejecutable:
Sera aquella que inicie la aplicacion e instancie al controlador con los objetos correspondientes.
  • Main
Código: java
package ejecutable;

import controlador.Controlador;
import modelo.Modelo;
import vista.VentanaVista;
import vista.VentanaVista2;

/*
* Main es la clase principal que se encarga de ejecutar y correr el programa
*/
public class Main {

public static void main(String[] args) {
VentanaVista2 vista2 = new VentanaVista2();
VentanaVista vista = new VentanaVista();
Modelo modelo = new Modelo();
new Controlador(modelo, vista, vista2);
  //Se pasa como parametro al controlador la vista y el modelo para que este los atienda.                                     

}

}


Por ultimo solo tenemos que añadir el driver a nuestra aplicación y corrobar que todo ande bien.
En eclipse: Click derecho en el proyecto Build Patch -> Configure Build Patch -> Libraries -> Add External Jars
                 

                                           Proyecto andando:
                                         


Se pueden descargar la aplicacion desde aca -> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Ser mejor cada día es mi meta

=LKI=

Buenísimo LKI. Yo he utilizado java y postgres.

Después  ponle a las etiquetas code el  '=java' asi colorea las palabras

Saludos

Ok ahora lo edito gracias :)
Ser mejor cada día es mi meta

=LKI=

Muy bueno bro!! Se ve excelente!
Te dare +1

Saludos!
ANTRAX



!Gracias, por tu contribución a la comunidad.!
:-*

G.
Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

Muy bueno LKI, me gusto mucho.

GRACIAS POR TU APORTE!!!


Saludos

No funciona, tendré que hacer algunos ajustes pero no se mucho java.



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No funciona, tendré que hacer algunos ajustes pero no se mucho java.

Naab decime en que parte no te funciona o cual es el problema que tenes así te ayudo.

PD:

Gracias a todos por comentar, sus comentarios y las visitas me ayudan a crecer y me dan confianza para seguir aportando en esta comunidad tan hermosa como es underc0de!.
Ser mejor cada día es mi meta

=LKI=

Muy bueno LKI, estoy seguro de que si se hace bien funcionará perfectamente.

Gracias por el aporte.

Un saludo.