viernes, 23 de julio de 2010

Java & Conexiones BDs


La mayoría de las aplicaciones que haríamos requerirán de una conexión a alguna base datos. Dependiendo de nuestras necesidades y recursos utilizaremos uno que otro motor de bases de datos para lograrlo.

Quise hacer dos aplicaciones java sencilla pero completas para mostrar más o menos como utilizar las bases de datos con java.

Las conexiones y consultas a bases de datos en java tienen el mismo formato, es decir poseen la misma interfaz de programación (API), que es el JDBC API. Como verán lo único que variaría por base de datos es la configuración del driver del motor de base de datos y la configuración del URL (bd, user, pass) para conectarse a la base de datos. Recordar que para conectarse a cualquier base de datos se debe tener instalado el driver correspondiente a la base de datos en cuestión.

De este código lo único que hay que tener en cuenta es como se carga el driver del motor de la base de datos, que varia (el argumento) según sea a través del método estatico forName() de la clase Class que está en el paquete java.lang y cuando se consigue la conexión a la base de datos con el método getConnection() de la clase DriverManager del paquete java.sql.

Por ejemplo:

// para cargar el driver
try {
    Class.forName ("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

// para conseguir la conexión

try {
    Connection conn = DriverManager.getConnection ("jdbc:mysql://localhost:3306/Nomina",   "nomina_user", "nomina_p@ss");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Aquí hay un cuadro que esta en el libro "java how to program" donde se puede ver como son los formatos de URL para la conexión de algunas bases de datos:




Java & MySql:

DBAccessMySql.java

import java.util.*;
import java.text.*;
import java.sql.*;

/**
*
* @author Edwin Bratini
*/

public class DBAccessMySql {
    NumberFormat nfRD = NumberFormat.getCurrencyInstance(new Locale("es","Do"));
    DateFormat dfRD = DateFormat.getDateInstance(DateFormat.LONG, new Locale("es","Do"));

    public static void main (String args []) throws SQLException {
        try {
            Class.forName ("com.mysql.jdbc.Driver");
            //System.out.println("Driver successful");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
       }

        try {
            Connection conn = DriverManager.getConnection ("jdbc:mysql://localhost:3306/Nomina",    "nomina_user", "nomina_p@ss");

            Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery("SELECT * FROM Empleado");
            System.out.println("\n\nConsulta de Empleados por Lotes");
            new DBAccessMySql().mostrarDatosPorConsola(rset);

            rset.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void mostrarDatosPorConsola(ResultSet rs) {
        String dotLine = "........................................................................................................";
        try {
            //ResultSet datosEmpleados = dbyJavaDB.getData("SELECT * FROM Empleado");
            ResultSetMetaData metaData = rs.getMetaData();
            int colCount = metaData.getColumnCount();
            String tipoCol = "";

            System.out.printf("\n\n%s%s\n", dotLine, dotLine);
            for (int i = 1; i <= colCount; i++) {
                System.out.printf("%-30s", metaData.getColumnLabel(i));
            }

            System.out.printf("\n%s%s\n", dotLine, dotLine);

            while (rs.next()) {
                for (int i = 1; i <= colCount; i++) {
                    tipoCol = metaData.getColumnTypeName(i);

                    if (tipoCol.equalsIgnoreCase("varchar") || tipoCol.equalsIgnoreCase("char")) {
                        System.out.printf("%-30s", rs.getString(i));
                    } else if (tipoCol.equalsIgnoreCase("date") || tipoCol.equalsIgnoreCase("datetime")){
                        System.out.printf("%-30s", dfRD.format(rs.getDate(i)));
                    } else if (tipoCol.equalsIgnoreCase("decimal") || tipoCol.equalsIgnoreCase("number")) {
                        System.out.printf("%-30s", nfRD.format(rs.getDouble(i)));
                    }
                }

            System.out.println();

            /*System.out.printf("%-30s %-30s %-30s %-30s ", rs.getString(1), rs.getString(2), rs.getString (3), rs.getString(4));

            System.out.printf("%-30s %-30s %-30s\n", rs.getString(5), rs.getString(6), nfRD.format(rs.getDouble(7)));*/
            }

            System.out.printf("\n%s%s\n", dotLine, dotLine);

       } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 
 
Cuando se ejecuta la aplicación, la salida es la sigte:
 
% java java_code.itla.DBAccessMySql