martes, 12 de mayo de 2015

CONECTAR UNA APLICACIÓN A UNA BASE DE DATOS

Instrucciones y Recomendaciones 

1- Primero que todo debemos descargar el archivo .jar conocido como MySQL Connector y añadirlo a las librerías de nuestro proyecto; luego crearemos en nuestro proyecto, un paquete al cual llamaremos "Metodos", y dentro de este, crearemos una clase la cual llamaremos "ConexionMySQL". 

2- Copia y pega el código resaltado en amarillo, después de la línea de código "package Metodos;" y sobre la línea de código "public class ConexionMySQL {", este fragmento de código se utiliza para importar las Clases y/o librerías necesarias para poder trabajar con ciertas funcionalidades y métodos de nuestra Clase:

import java.sql.*;
import javax.swing.JOptionPane;

3- Ahora copia y pega el código resaltado en azul, dentro de la Clase "public class ConexionMySQL {}"; es decir, debe quedar rodeado por las llaves "{}" que limitan dicha Clase.

4- La primera parte de este código resaltado en azul, consiste en crear 4 variables de tipo String y con la propiedad public. En la primera variable llamada "db", guardamos el nombre de la Base de datos a la cual nos queremos conectar; en la segunda variable url, guardaremos la ruta de donde se encuentra ubicada nuestra Base de datos, si nos damos cuenta deberemos emplear la api "jdbc:mysql" lo cual permite indicar que queremos conectar nuestra aplicación Java con una Base de datos en MySQL, además debemos consignar la dirección de la máquina que contiene la Base de datos, en este caso como trabajaremos en una sola máquina colocamos "localhost", en el caso dado que trabajemos de forma remota debemos reemplazar este valor por la dirección IP (ej. 192.168.1.2) de la máquina a la cual necesitamos conectarnos, en esta misma variable concatenamos la variable que instanciamos al principio "+db"; luego la tercera y cuarta variable "user" y "pass", corresponden al usuario y la clave para poder tener acceso a la Base de datos.     

public String db = "bdcontactos";
public String url = "jdbc:mysql://localhost/"+db;
public String user = "root";
public String pass = "123";

5- Lo siguiente es un método, este contiene la propiedad "public", y devolverá un valor de tipo "Connection", que en otras palabras sería la conexión con nuestra Base de datos; y se le ha asignado a este método el nombre de "Conectar":

public Connection Conectar(){}

6- Ahora instanciaremos un objeto de tipo "Connection", al cual asignaremos el valor "null". Esto irá dentro del método del punto anterior:

Connection link = null;  

7-  Proseguiremos a crear un bloque "try-catch", debido a que el código que hemos de emplear podría producir una excepción y/o error. Este bloque irá dentro del método mencionado en el punto 5:

try{   

    }catch(Exception ex){


    }


8- En esta línea de código lo que haremos será cargar la Clase "Driver", que se encuentra ubicada dentro del ".jar" MySQL Connector que agregamos a nuestras librerías. Esta línea irá dentro del "try{}" del punto anterior:

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

9- Ahora utilizando el método DriverManager.getConnection, y empleando las variables que instanciamos al inicio de esta Clase, obtendremos la conexión con nuestra Base de datos, y procederemos administrarla y almacenarla en el objeto tipo Connection instanciado al principio del método "Conectar". Esta línea de código irá dentro del "try{}" del punto 7. 

link = DriverManager.getConnection(this.url, this.user, this.pass);


10- En el caso dado de que ocurra un error al tratar de conectarnos con nuestra Base de datos, procederemos a mostrar dicha excepción a través de una pequeña ventana, usando el componente JOptionPane. Esta parte irá dentro del "catch(){}" del punto 7:

JOptionPane.showMessageDialog(null, ex);

11- Por último retornaremos la conexión obtenida, la cual podría ser exitosa o nula. Esta línea irá por fuera del try-catch, pero dentro del método Conectar:

return link; 
  
12- En cuanto al código para el test de conexión, copia y pega el código resaltado en verde, dentro del evento y/o método del botón de un formulario de tu proyecto.

13- En las dos primeras líneas de código, lo que hacemos es instanciar un objeto de nuestra Clase ConexionMySQL.java y luego en un objeto tipo Connection, administramos y/o capturamos la conexión que se nos devuelve al llamar el método Conectar de nuestra Clase mencionada anteriormente:

ConexionMySQL mysql = new ConexionMySQL();

java.sql.Connection cn= mysql.Conectar();
  
14- En el resto de código, empleamos un condicional "if", en el cual verificamos que no se nos devuelva una conexión nula, si se cumple esta condición, mostraremos una ventana (JOptionPane) en la cual mostraremos el mensaje "Conectado"; luego dentro de un try-catch, procedemos a cerrar la conexión con la Base de datos, y en dado caso de que ocurra una excepción a la hora de realizar la desconexión, mostraremos dicho error por consola:

if(cn!=null){

                JOptionPane.showMessageDialog(null, "Conectado");

                try{

                    cn.close();

                }catch(SQLException ex){

                    System.out.println("Error al desconectar "+ex);

                }

        }
  

15- Ahora sólo basta con ejecutar tu proyecto y hacer las respectivas pruebas.

TRANSACCIONES

Una transacción en un Sistema de Gestión de Bases de Datos (SGBD), es un conjunto de órdenes que se ejecutan formando una unidad de trabajo, es decir, en forma indivisible o atómica.

Un SGBD se dice transaccional, si es capaz de mantener la integridad de los datos, haciendo que estas transacciones no puedan finalizar en un estado intermedio. Cuando por alguna causa el sistema debe cancelar la transacción, empieza a deshacer las órdenes ejecutadas hasta dejar la base de datos en su estado inicial (llamado punto de integridad), como si la orden de la transacción nunca se hubiese realizado. Una transacción debe contar con ACID (un acrónimo inglés) que quiere decir: Atomicidad, Consistencia, Aislamiento y Durabilidad. Entonces para que un Sistema de Gestión de Bases de Datos sea considerado Transaccional, debe cumplir con estos criterios (ACID).

Para esto, el lenguaje de consulta de datos SQL (Structured Query Language), provee los mecanismos para especificar que un conjunto de acciones deben constituir una transacción.

  1. BEGIN TRAN: Especifica que va a empezar una transacción.
  2. COMMIT TRAN: Le indica al motor que puede considerar la transacción completada con éxito.
  3. ROLLBACK TRAN: Indica que se ha alcanzado un fallo y que debe restablecer la base al punto de integridad.

En un sistema ideal, las transacciones deberían garantizar todas las propiedades ACID; en la práctica, a veces alguna de estas propiedades se simplifica o debilita con vistas a obtener un mejor rendimiento.
Un ejemplo habitual de transacción es el traspaso de una cantidad de dinero entre cuentas bancarias. Normalmente se realiza mediante dos operaciones distintas, una en la que se decrementa el saldo de la cuenta origen y otra en la que incrementamos el saldo de la cuenta destino. Para garantizar la atomicidad del sistema (es decir, para que no aparezca o desaparezca dinero), las dos operaciones deben ser atómicas, es decir, el sistema debe garantizar que, bajo cualquier circunstancia (incluso una caída del sistema), el resultado final es que, o bien se han realizado las dos operaciones, o bien no se ha realizado ninguna.


domingo, 10 de mayo de 2015

PROCEDIMIENTO ALMACENADO

Un procedimiento almacenado (stored procedure en inglés) es un programa (o procedimiento) almacenado físicamente en una base de datos. Su implementación varía de un gestor de bases de datos a otro. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una petición de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y sólo necesita enviar sus resultados de regreso al usuario, deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes.

La ventaja de un procedimiento almacenado, en respuesta a una petición de usuario, está directamente bajo el control del motor del gestor de bases de datos, que corre generalmente en un servidor distinto del servidor web, aumentando con ello la rapidez de procesamiento de las peticiones del usuario. El servidor de la base de datos tiene acceso directo a los datos necesarios para manipular y sólo necesita enviar el resultado final al usuario. Los procedimientos almacenados pueden permitir que la lógica del negocio se encuentre como un API en la base de datos, que pueden simplificar la gestión de datos y reducir la necesidad de codificar la lógica en el resto de los programas cliente. Esto puede reducir la probabilidad de que los datos se corrompan por el uso de programas clientes defectuosos o erróneos. De este modo, el motor de base de datos puede asegurar la integridad de los datos y su consistencia con la ayuda de procedimientos almacenados. Algunos afirman que las bases de datos deben ser utilizadas para el almacenamiento de datos solamente, y que la lógica de negocio sólo debería aplicarse en la capa de negocio de código, a través de aplicaciones cliente que deban acceder a los datos. Sin embargo, el uso de procedimientos almacenados no se opone a la utilización de una capa de negocio.

EJEMPLO:


SENTENCIAS PREPARADAS


Muchas de las bases de datos más maduras admiten el concepto de sentencias preparadas. Estas pueden definirse como un tipo de plantillas compiladas para SQL que las aplicaciones quieren ejecutar, pudiendo ser personalizadas utilizando parámetros variables. Las sentencias preparadas ofrecen dos grandes beneficios:

  • La consulta sólo necesita ser analizada (o preparada) una vez, pero puede ser ejecutada muchas veces con los mismos o diferentes parámetros. Cuando la consulta se prepara, la base de datos analizará, compilará y optimizará su plan para ejecutarla. Para consultas complejas, este proceso puede tomar suficiente tiempo como para ralentizar notablemente una aplicación si fuera necesario repetir la misma consulta muchas veces con los mismos parámetros. Mediante el empleo de una sentencia preparada, la aplicación evita repetir el ciclo de análisis/compilación/optimización. Esto significa que las sentencias preparadas utilizan menos recursos y se ejecutan más rápidamente.
  • Los parámetros para las sentencias preparadas no necesitan estar entrecomillados; el controlador automáticamente se encarga de esto. Si una aplicación usa exclusivamente sentencias preparadas, el desarrollador puede estar seguro de que no hay cabida para inyecciones de SQL (sin embargo, si otras partes de la consulta se construyen con datos de entrada sin escapar, aún es posible que ocurran ataques de inyecciones de SQL).

Ejemplo #1 Inserciones repetidas utilizando sentencias preparadas:

Este ejemplo realiza dos consultas INSERT sustituyendo name y value por los marcadores correspondientes.