Underc0de

Programación General => Java => Mensaje iniciado por: LKI en Octubre 04, 2014, 04:33:17 PM

Título: [JAVA][MYSQL] Tutorial Basico
Publicado por: LKI en Octubre 04, 2014, 04:33:17 PM
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
(http://oi58.tinypic.com/15pmpsk.jpg)

Diseño:

Base de datos
[/list]
Código (sql) [Seleccionar]
CREATE DATABASE  `dbtest` ;
Código (sql) [Seleccionar]
-- 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:
                         (http://oi59.tinypic.com/11rwshe.jpg)

Programacion:
(http://oi60.tinypic.com/6znccx.jpg)
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:
               (http://oi58.tinypic.com/2m2xbvb.jpg)

VentanaVista2:
Crearemos dentro del paquete vista otra ventana que nos permitira ingresar nuevos registros a la base de datos:
Código (JAVA) [Seleccionar]
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);

}
}

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) [Seleccionar]
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

}

}

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.
Código (java) [Seleccionar]
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;
}

}

Código (java) [Seleccionar]
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;
}

}
Sera aquella que inicie la aplicacion e instancie al controlador con los objetos correspondientes.
Código (java) [Seleccionar]
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:
                                         (http://oi58.tinypic.com/15rzhw5.jpg)


Se pueden descargar la aplicacion desde aca -> https://www.dropbox.com/s/e0fpo6fu3uuuva8/tutoUndercode.rar?dl=0 (https://www.dropbox.com/s/e0fpo6fu3uuuva8/tutoUndercode.rar?dl=0)
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: Expermicid en Octubre 04, 2014, 04:37:25 PM
Buenísimo LKI. Yo he utilizado java y postgres.

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

Saludos
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: LKI en Octubre 04, 2014, 04:38:58 PM
Ok ahora lo edito gracias :)
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: ANTRAX en Octubre 04, 2014, 05:17:31 PM
Muy bueno bro!! Se ve excelente!
Te dare +1

Saludos!
ANTRAX
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: Gabriela en Octubre 05, 2014, 12:19:40 AM

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

G.
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: Ruleman en Octubre 05, 2014, 11:49:26 AM
Muy bueno LKI, me gusto mucho.

GRACIAS POR TU APORTE!!!


Saludos
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: Naab en Octubre 05, 2014, 07:03:03 PM
No funciona, tendré que hacer algunos ajustes pero no se mucho java.
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: LKI en Octubre 05, 2014, 09:27:46 PM


No tienes permitido ver enlaces. Registrate o Entra a tu 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!.
Título: Re:[JAVA][MYSQL] Tutorial Basico
Publicado por: blackdrake en Octubre 06, 2014, 06:21:49 AM
Muy bueno LKI, estoy seguro de que si se hace bien funcionará perfectamente.

Gracias por el aporte.

Un saludo.