Subdireccin acadmica
Entorno
MySQL 5.1.
NetBeans IDE 6.9.1
Apache Tomcat
JDK 1.6.0 - 21
Base de datos
CREATE DATABASE IF NOT EXISTS bdtutorial;
USE bdtutorial;
--- Creando la tabla `detalleventa`
-DROP TABLE IF EXISTS `detalleventa`;
CREATE TABLE `detalleventa` (
`codigoVenta` int(11) NOT NULL,
`codigoProducto` int(11) NOT NULL,
`cantidad` decimal(18,2) NOT NULL,
`descuento` decimal(18,2) NOT NULL,
PRIMARY KEY (`codigoVenta`,`codigoProducto`),
KEY `FK_DetalleVenta_Producto` (`codigoProducto`),
CONSTRAINT `FK_DetalleVenta_Producto` FOREIGN KEY (`codigoProducto`)
REFERENCES `producto` (`codigoProducto`),
CONSTRAINT `FK_DetalleVenta_Venta` FOREIGN KEY (`codigoVenta`)
REFERENCES `venta` (`codigoVenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--- Creando la tabla `producto`
-DROP TABLE IF EXISTS `producto`;
CREATE TABLE `producto` (
`codigoProducto` int(11) NOT NULL,
`nombre` varchar(100) NOT NULL,
`precio` decimal(18,2) NOT NULL,
PRIMARY KEY (`codigoProducto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--- Creando la tabla venta
-DROP TABLE IF EXISTS `venta`;
CREATE TABLE `venta` (
`codigoVenta` int(11) NOT NULL,
`cliente` varchar(100) NOT NULL,
`fecha` datetime NOT NULL,
PRIMARY KEY (`codigoVenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
p.precio
FROM
producto p
ORDER BY
P.nombre
;
END $$
DELIMITER ;
END $$
DELIMITER ;
-- Procedimiento almacenado para obtener todas las ventas
DROP PROCEDURE IF EXISTS `spF_venta_All`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_venta_All`(
)
BEGIN
SELECT
v.codigoVenta AS CodigoVenta,
v.cliente AS Cliente,
v.fecha AS Fecha,
d.codigoProducto AS CodigoProducto,
p.nombre AS Nombre,
p.precio AS Precio,
d.cantidad AS Cantidad,
d.descuento AS Descuento,
p.precio*d.cantidad AS Parcial,
((p.precio*d.cantidad)-d.descuento) AS SubTotal,
(
SELECT
SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar
FROM
DetalleVenta AS dT INNER JOIN
Producto AS pT ON dT.codigoProducto = pT.codigoProducto
WHERE
dT.codigoVenta=v.codigoVenta
) AS TotalPagar
FROM
Venta AS v INNER JOIN
DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN
Producto AS p ON d.codigoProducto = p.codigoProducto
ORDER BY
CodigoVenta, Nombre
;
END $$
DELIMITER ;
-- Procedimiento almacenado para obtener una venta
DROP PROCEDURE IF EXISTS `spF_venta_one`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_venta_one`(
_codigoVenta int
)
BEGIN
SELECT
v.codigoVenta AS CodigoVenta,
v.cliente AS Cliente,
v.fecha AS Fecha,
d.codigoProducto AS CodigoProducto,
p.nombre AS Nombre,
p.precio AS Precio,
d.cantidad AS Cantidad,
d.descuento AS Descuento,
p.precio*d.cantidad AS Parcial,
((p.precio*d.cantidad)-d.descuento) AS SubTotal,
(
SELECT
SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar
FROM
DetalleVenta AS dT INNER JOIN
Producto AS pT ON dT.codigoProducto = pT.codigoProducto
WHERE
dT.codigoVenta=v.codigoVenta
) AS TotalPagar
FROM
Venta AS v INNER JOIN
DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN
Producto AS p ON d.codigoProducto = p.codigoProducto
WHERE
v.codigoVenta=_codigoVenta
ORDER BY
Nombre
;
END $$
DELIMITER ;
_____
Cdigo en Java
package Modelo;
public class Producto {
//Las columnas que tiene la tabla Producto
private int codigoProducto;
private String nombre;
private double precio;
//Constructor de la clase sin parametros
public Producto() {
}
//Constructor de la clase con parametros
public Producto(int codigoProducto, String nombre, double precio) {
this.codigoProducto = codigoProducto;
this.nombre = nombre;
this.precio = precio;
}
//Metodo toString de la clase que nos retorna
//el nombre del producto
@Override
public String toString() {
return nombre.toUpperCase();
}
//Metodos get y set de la clase
public int getCodigoProducto() {
return codigoProducto;
}
public void setCodigoProducto(int codigoProducto) {
this.codigoProducto = codigoProducto;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public double getPrecio() {
return precio;
}
public void setPrecio(double precio) {
this.precio = precio;
}
}
Clase Venta
La clase Venta tiene la misma estructura de nuestra tabla Venta de nuestra base de datos,
a continuacin les comparto el cdigo fuente de la clase.
package Modelo;
// @author hwong
import java.sql.Timestamp;
public class Venta {
//Las columnas que tiene la tabla Venta
private int codigoVenta;
private String cliente;
private Timestamp fecha;
//Constructor de la clase sin parametros
public Venta() {
}
//Constructor de la clase con parametros
public Venta(int codigoVenta, String cliente, Timestamp fecha) {
this.codigoVenta = codigoVenta;
this.cliente = cliente;
this.fecha = fecha;
}
//Metodos get y set de la clase
public String getCliente() {
return cliente;
}
public void setCliente(String cliente) {
this.cliente = cliente;
}
public int getCodigoVenta() {
return codigoVenta;
}
public void setCodigoVenta(int codigoVenta) {
this.codigoVenta = codigoVenta;
}
public Timestamp getFecha() {
return fecha;
}
public void setFecha(Timestamp fecha) {
this.fecha = fecha;
}
}
Clase DetalleVenta
La clase DetalleVenta tiene la misma estructura de nuestra tabla DetalleVenta de nuestra
base de datos, a continuacin les comparto el cdigo fuente de la clase.
package Modelo;
// @author hwong
public class DetalleVenta {
//Las columnas que tiene la tabla DetalleVenta
private
private
private
private
private
private
int codigoVenta;
int codigoProducto;
double cantidad;
double descuento;
Producto producto;
Venta venta;
Estructura final
Al finalizar de crear las clases deberiamos tener 3 clases tal como se muestra en el grafico
siguiente
Cargando el Driver
Para poder comunicar nuestro proyecto con MySQL 5.1. primero debemos de adicionar el
driver a nuestro proyecto. Para eso hacemos clic derecho en nuestro proyecto y nos vamos
a la opcin que dice Properties y seleccionamos de ah Libraries y presionamos
el botn que dice Add Library y buscamos el que dice MySQL JDBC Driver
java.sql.CallableStatement;
java.sql.Connection;
java.sql.DriverManager;
java.sql.ResultSet;
}
}
java.sql.CallableStatement;
java.sql.Connection;
java.sql.ResultSet;
java.sql.SQLException;
java.sql.Types;
java.util.ArrayList;
cn.commit();
} else {
//Negamos la transaccion
Conexion.deshacerCambios(cn);
}
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (SQLException e) {
e.printStackTrace();
Conexion.deshacerCambios(cn);
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (Exception e) {
e.printStackTrace();
Conexion.deshacerCambios(cn);
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
}
return rpta;
}
//Metodo utilizado para insertar un Producto a nuestra Base de datos
public static synchronized boolean actualizarProducto(Producto
varproducto) {
Connection cn = null;
CallableStatement cl = null;
boolean rpta = false;
try {
//Nombre del procedimiento almacenado y como espera tres
parametros
//le ponemos 3 interrogantes
String call = "{CALL spU_producto(?,?,?)}";
//Obtenemos la conexion
cn = Conexion.getConexion();
//Decimos que vamos a crear una transaccion
cn.setAutoCommit(false);
//Preparamos la sentecia
cl = cn.prepareCall(call);
//El primer parametro del procedimiento almacenado es el
codigo
cl.setInt(1, varproducto.getCodigoProducto());
//El siguiente parametro del procedimiento almacenado es el
nombre
cl.setString(2, varproducto.getNombre());
//Y por ultimo el precio
cl.setDouble(3, varproducto.getPrecio());
//Ejecutamos la sentencia y si nos devuelve el valor de 1 es
porque
//registro de forma correcta los datos
rpta = cl.executeUpdate() == 1 ? true : false;
if (rpta) {
//Confirmamos la transaccion
cn.commit();
} else {
//Negamos la transaccion
Conexion.deshacerCambios(cn);
}
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (SQLException e) {
e.printStackTrace();
Conexion.deshacerCambios(cn);
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (Exception e) {
e.printStackTrace();
Conexion.deshacerCambios(cn);
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
}
return rpta;
}
//Metodo utilizado para obtener todos los productos de nuestra base
de datos
public static synchronized ArrayList<Producto> obtenerProducto() {
//El array que contendra todos nuestros productos
ArrayList<Producto> lista = new ArrayList<Producto>();
Connection cn = null;
CallableStatement cl = null;
ResultSet rs = null;
try {
//Nombre del procedimiento almacenado
String call = "{CALL spF_producto_all()}";
cn = Conexion.getConexion();
cl = cn.prepareCall(call);
//La sentencia lo almacenamos en un resulset
rs = cl.executeQuery();
//Consultamos si hay datos para recorrerlo
//e insertarlo en nuestro array
while (rs.next()) {
Producto p = new Producto();
//Obtenemos los valores de la consulta y creamos
//nuestro objeto producto
p.setCodigoProducto(rs.getInt("codigoProducto"));
p.setNombre(rs.getString("nombre"));
p.setPrecio(rs.getDouble("precio"));
//Lo adicionamos a nuestra lista
lista.add(p);
}
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (SQLException e) {
e.printStackTrace();
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (Exception e) {
e.printStackTrace();
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
}
return lista;
}
java.sql.CallableStatement;
java.sql.Connection;
java.sql.ResultSet;
java.sql.SQLException;
java.sql.Types;
java.util.ArrayList;
pro.setCodigoProducto(rs.getInt("CodigoProducto"));
pro.setNombre(rs.getString("Nombre"));
pro.setPrecio(rs.getDouble("Precio"));
det.setCantidad(rs.getDouble("Cantidad"));
det.setDescuento(rs.getDouble("Parcial"));
det.setVenta(ven);
det.setProducto(pro);
lista.add(det);
}
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (SQLException e) {
e.printStackTrace();
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
} catch (Exception e) {
e.printStackTrace();
Conexion.cerrarCall(cl);
Conexion.cerrarConexion(cn);
}
return lista;
}
}