sábado, 21 de julio de 2007

Conexiones JDBC

La tecnología parte de Java que se encarga de realizar conexiones a bases de datos se conoce como JDBC (Java Data Base Conection); es un estandar que define las reglas que deben seguir cada uno de los proveedores para poder hacer que sus datos sean accesibles en programas Java.

La idea detras de esto es que un constructor de DB crea un programa de base de datos, y una vez creado este se crea entonces una aplicación java conocida como Driver que se encarga de dar los datos a Java de una manera previamente definida.

Los Dirvers de base de datos vienen en varios estilos pero todos funcionan de manera similar en su superficie.

Para establecer una conexión a BD desde Java se necesita:

  1. La clase Driver que se encargara de gestionar la conexión.
  2. Una URL especial para acceder a la base de datos.
  3. Un consumidor de datos (el programa Java mismo).
El código general para establecer una conexión se muestra a continuación, el ejemplo considera un servidor SQL Server con una base de datos llamada osos accesible a traves de un ODBC con la misma dirección.


try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException) {
System.out.println("El Driver no existe");
}

Connection c = null;
try {
// c = DriverManager.getConnection("jdbc:odbc:osos", "usuario", "password");
// en caso de que el ODBC no incluya estos datos.
c = DriverManager.getConnection("jdbc:odbc:osos");
} catch (Exception e) {
System.out.println("No se puede establecer una conexión");
}


La forma de crear la URL que se pasa a getConnection y la clase que se pasa a forName dependen del tipo de base de datos al que se desee conectar, en general usar ODBC es una buena idea, pero la clase que utiliza Java para gestionar el ODBC es muy poco practica, por lo que deberia sustituirse por un Driver especifico. Puede encontrarse en la página de Java una lista de drivers existentes.

Una vez que se dispone del código que genero el objeto Connection se empieza a interactuar con el de una manera común. Se puede utilizar un objeto de esta naturaleza por medio de sentencias o directamente y con o sin transcciones. Primero vamos a revisar como realizar una consulta a la base de datos para obtener datos. Para esto vamos a utilizar la clase Statement, esta clase almacena la mayoría de la funcionalidad de interacción con SQL.


Statement st = c.createStatement();

try {
st.execute("CREATE TABLE");
st.execute("DELETE FROM tabla WHERE id=" + id);
st.execute("INSERT INTO tabla VALUES('id')");
st.execute("ANY_VALID_SQL_FOR_DB");
} catch(Exception e) {
System.out.println("El SQL charcho");
}


Con esta estrategia puedes ejecutar casi todo el SQL que no regrese datos. Ahora, con datos: se necesita ahora la clase ResultSet, que representa un conjunto de datos que se encuentran almacenados en la base de datos. Vamos entonces a lo nuestro.


try {
ResultSet rs = st.executeQuery("SELECT * FROM M");
//mira, primero hay que moverlo
rs.first();
//podemos usar rs.next(), el resto (rs.previous() y rs.last() causan a veces conflictos)

String s = rs.getString("nombre_campo");
String s2 = rs.getString(1); //El primer campo
int pos_campo = rs.findColumn("campo"); //Devuelve la posicion del campo

int r = rs.getInt(2); //Igual existen getDouble(), getLong(), getObject(), entre otros
} catch(Exception e) {
System.out.println("El SQL charcho");
}


Weno, después completo el tema del SQL, quedan pendientes los procedimientos almacenados, la manera realmente practica de hacer las cosas, porque esta es algo viejita y las transacciones. Empiezen a jugar con esto, como ejercicio creen una aplicación Java que cree toda la estructura de una base de datos de una bilbioteca y le inserte algunos datos.