JAVA CON BASE DE
DATOS
DEFINICIÓN
En la mayoría de las aplicaciones que nos vamos a encontrar, aparecerá una
base de datos como fuente de información. JDBC nos va a permitir acceder a
bases de datos (BD) desde Java. Con JDBC no es necesario escribir distintos
programas para distintas BD, sino que un único programa sirve para acceder
a BD de distinta naturaleza. Incluso, podemos acceder a más de una BD de
distinta fuente (Oracle, Access, MySql, etc.) en la misma aplicación. Podemos
pensar en JDBC como el puente entre una base de datos y nuestro programa
Java. Un ejemplo sencillo puede ser un applet que muestra dinámicamente
información contenida en una base de datos. El applet utilizará JDBC para
obtener dichos datos.
El esquema a seguir en un programa que use JDBC es el siguiente:
Un programa Java que utilice JDBC primero deberá establecer una conexión con el SGBD.
Para realizar dicha conexión haremos uso de un driver específico para cada SGBD que estemos
utilizando. Una vez establecida la conexión ya podemos interrogar la BD con cualquier
comando SQL (select, update, create, etc.). El resultado de un comando select es un objeto de
la clase ResultSet, que contiene los datos que devuelve la consulta. Disponemos de métodos en
ResultSet para manejar los datos devueltos. También podemos realizar cualquier operación en
SQL (creación de tablas, gestión de usuarios, etc.).
Para realizar estas operaciones necesitaremos contar con un SGBD (sistema
gestor de bases de datos) además de un driver específico para poder acceder a
este SGBD. Vamos a utilizar dos SGBD: MySQL (disponible para Windows y Linux,
de libre distribución) y PostGres (sólo para Linux, también de libre distribución).
Drivers de acceso
Los drivers para poder acceder a cada SGBD no forman parte de la distribución de
Java por lo que deberemos obtenerlos por separado. ¿Por qué hacer uso de un
driver?. El principal problema que se nos puede plantear es que cada SGBD
dispone de su propio API (la mayoría propietario), por lo que un cambio en el
SGBD implica una modificación de nuestro código. Si colocamos una capa
intermedia, podemos abstraer la conectividad, de tal forma que nosotros
utilizamos un objeto para la conexión, y el driver se encarga de traducir la llamada
al API. El driver lo suelen distribuir las propias empresas que fabrican el SGBD.
Tipos de drivers
Existe un estándar establecido que divide los drivers en cuatro grupos:
■ Tipo 1: Puente JDBC-ODBC. ODBC (Open Database Connectivity) fue creado para
proporcionar una conexión a bases de datos en Microsoft Windows. ODBC permite
acceso a bases de datos desde diferentes lenguajes de programación, tales como
C y Cobol. El puente JDBC-ODBC permite enlazar Java con cualquier base de datos
disponible en ODBC. No se aconseja el uso de este tipo de driver cuando tengamos
que acceder a bases de datos de alto rendimiento, pues las funcionalidades están
limitadas a las que marca ODBC. Cada cliente debe tener instalado el driver. J2SE
incluye este driver en su versión Windows y Solaris.
■ Tipo 2: Parte Java, parte driver nativo. Es una combinación de implementación
Java y API nativo para el acceso a la base de datos. Este tipo de driver es más
rápido que el anterior, pues no se realiza el paso por la capa ODBC. Las llamadas
JDBC se traducen en llamadas específicas del API de la base de datos. Cada
cliente debe tener instalado el driver. Tiene menor rendimiento que los dos
siguientes y no se pueden usar en Internet, ya que necesita el API de forma local.
■ Tipo 3: Servidor intermediario de acceso a base de datos. Este tipo de
driver proporciona una abstracción de la conexión. El cliente se conecta a
los SGBD mediante un componente servidor intermedio, que actúa como
una puerta para múltiples servidores. La ventaja de este tipo de driver es
el nivel de abstracción. El servidor de aplicaciones WebLogic incorpora
este tipo de driver.
■ Tipo 4: Drivers Java. Este es el más directo. La llamada JDBC se traduce
directamente en una llamada de red a la base de datos, sin
intermediarios. Proporcionan mejor rendimiento. La mayoría de SGBD
proporcionan drivers de este tipo.
Conexión a la BD
Una vez cargado el driver apropiado para nuestro SGBD deberemos establecer la
conexión con la BD. Para ello utilizaremos el siguiente método:
La conexión a la BD está encapsulada en un objeto Connection. Para su creación
debemos proporcionar la url de la BD y, si la BD está protegida con contraseña, el
login y password para acceder a ella. El formato de la url variará según el driver que
utilicemos. Sin embargo, todas las url tendrán la siguiente forma general:
jdbc:<subprotocolo>:<nombre>, con subprotocolo indicando el tipo de SGBD y con
nombre indicando el nombre de la BD y aportando información adicional para la
conexión.
1
2
Connection con = DriverManager.getConnection(url);
Connection con = DriverManager.getConnection(url, login, password);
Objeto Connection
Es el principal objeto utilizado para proporcionar un vínculo entre las bases de datos y
una aplicación en Java. Connection proporciona métodos para manejar el
procesamiento de transacciones, para crear objetos y ejecutar instrucciones SQL, y
para crear objetos para la ejecución de procedimientos almacenados.
Se puede emplear tanto el objeto Driver como el objeto DriverManager para crear un
objeto Connection. Se utiliza el método connect() para el objeto Driver, y el método
getConnection() para el objeto DriverManager.
El objeto Connection proporciona una conexión estática a la base de datos. Esto
significa que hasta que se llame en forma explícita a su método close() para cerrar la
conexión o se destruya el objeto Connection, la conexión a la base de datos
permanecerá activa.
La manera más usual de establecer una conexión a una base de datos es invocando el
método getConnection() de la clase DriverManager. A menudo, las bases de datos
están protegidas con nombres de usuario (login) y contraseñas (password) para
restringir el acceso a las mismas. El método getConnection() permite que el nombre
de usuario y la contraseña se pasen también como parámetros.
String usuario = "root";
String contraseña = "123456789";
Connection conn = DriverManager.getConnection(url,usuario,contraseña);
En toda aplicación de bases de datos con MySQL es indispensable poder establecer la
conexión al servidor para posteriormente enviarle las consultas. Los programas en
Java no son la excepción. El siguiente código va a servir para verificar que podemos
establecer una conexión a la base de datos agendita.
import java.sql.*;
public class ConexionBD {
static String bd = "sesion";
static String login = "root";
static String password = "123456789";
static String url = "jdbc:mysql://localhost/"+bd;
public static void main(String[] args) throws Exception {
Connection conn = null;
try {
lass.forName("com.mysql.jdbc.Driver").newInstance
conn = DriverManager.getConnection(url,login,password);
if (conn != null) {
System.out.println("Conexiónse de datos "+url+" ... Ok");
conn.close(); } }
catch(SQLException ex) {
System.out.println(ex); }
catch(ClassNotFoundException ex) {
System.out.println(ex); } }
}
Objeto Statement
Se usa para enviar sentencias SQL a la base de datos. Actualmente hay tres tipos
de objetos Statement, todos los cuales actúan como contenedores para la
ejecución de sentencias en una conexión dada: Statement, PreparedStatement
que hereda de Statement y CallableStatement que hereda de
PreparedStatement. Estas estàn especializadas para enviar tipos particulares de
sentencias SQL, Un objeto Statement se usa para ejecutar una sentencia SQL
simple sin parámetros. Un objeto PreparedStatement se usa para ejecutar
sentencias SQL precompiladas con o sin parámetros IN; y un objeto
CallableStatement se usa para ejecutar un procedimieno de base de datos
almacenado.
La interfase Statement suminstra métodos básicos para ejecutar sentencias y
devolver resultados. La interfase PreparedStatement añade métodos para
trabajat con los parámetros IN; y la interfase CallableStatement añade métodos
para trabajar con parameters OUT.
Creación de objetos Statement
Una vez establecida la conexión con una base de datos particular, esta conexión
puede usarse para enviar sentencias SQL. Un objeto Statement se crea
mediante el método de Connection createStatement, como podemos ver en el
siguiente fragmento de código.
Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
La sentencia SQL que será enviada a la base de datos es alimentada como un
argumento a uno de los métodos de ejecución del objeto Statement. Por
ejemplo:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
Ejecución de sentencias usando objetos Statement.
La interfase Statement nos suministra tres métodos diferentes para ejecutar
sentencias SQL, executeQuery, executeUpdate y execute. El método a usar esta
determinado por el producto de la sentencia SQL.
Objeto Resultset
Es la representación en memoria de las tablas de la base de datos en disco, se puede entender
como una tabla virtual, recordar que generalmente todos los procesos que se realizen con la
tabla (insertar registros, eliminar registros, etc) se realizaran realmente contra un resulset y no
provocaran ningun cambio en la tabla fisica en disco, resulset tiene un conjunto de metodos
muy utiles y muy usados para el proceso de los renglones de la tabla virtual.
Ejemplo:
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
// abriendo canal o enlace en su propio try-catch
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};

Java con base de datos

  • 1.
    JAVA CON BASEDE DATOS
  • 2.
    DEFINICIÓN En la mayoríade las aplicaciones que nos vamos a encontrar, aparecerá una base de datos como fuente de información. JDBC nos va a permitir acceder a bases de datos (BD) desde Java. Con JDBC no es necesario escribir distintos programas para distintas BD, sino que un único programa sirve para acceder a BD de distinta naturaleza. Incluso, podemos acceder a más de una BD de distinta fuente (Oracle, Access, MySql, etc.) en la misma aplicación. Podemos pensar en JDBC como el puente entre una base de datos y nuestro programa Java. Un ejemplo sencillo puede ser un applet que muestra dinámicamente información contenida en una base de datos. El applet utilizará JDBC para obtener dichos datos.
  • 3.
    El esquema aseguir en un programa que use JDBC es el siguiente: Un programa Java que utilice JDBC primero deberá establecer una conexión con el SGBD. Para realizar dicha conexión haremos uso de un driver específico para cada SGBD que estemos utilizando. Una vez establecida la conexión ya podemos interrogar la BD con cualquier comando SQL (select, update, create, etc.). El resultado de un comando select es un objeto de la clase ResultSet, que contiene los datos que devuelve la consulta. Disponemos de métodos en ResultSet para manejar los datos devueltos. También podemos realizar cualquier operación en SQL (creación de tablas, gestión de usuarios, etc.).
  • 4.
    Para realizar estasoperaciones necesitaremos contar con un SGBD (sistema gestor de bases de datos) además de un driver específico para poder acceder a este SGBD. Vamos a utilizar dos SGBD: MySQL (disponible para Windows y Linux, de libre distribución) y PostGres (sólo para Linux, también de libre distribución). Drivers de acceso Los drivers para poder acceder a cada SGBD no forman parte de la distribución de Java por lo que deberemos obtenerlos por separado. ¿Por qué hacer uso de un driver?. El principal problema que se nos puede plantear es que cada SGBD dispone de su propio API (la mayoría propietario), por lo que un cambio en el SGBD implica una modificación de nuestro código. Si colocamos una capa intermedia, podemos abstraer la conectividad, de tal forma que nosotros utilizamos un objeto para la conexión, y el driver se encarga de traducir la llamada al API. El driver lo suelen distribuir las propias empresas que fabrican el SGBD.
  • 5.
    Tipos de drivers Existeun estándar establecido que divide los drivers en cuatro grupos: ■ Tipo 1: Puente JDBC-ODBC. ODBC (Open Database Connectivity) fue creado para proporcionar una conexión a bases de datos en Microsoft Windows. ODBC permite acceso a bases de datos desde diferentes lenguajes de programación, tales como C y Cobol. El puente JDBC-ODBC permite enlazar Java con cualquier base de datos disponible en ODBC. No se aconseja el uso de este tipo de driver cuando tengamos que acceder a bases de datos de alto rendimiento, pues las funcionalidades están limitadas a las que marca ODBC. Cada cliente debe tener instalado el driver. J2SE incluye este driver en su versión Windows y Solaris. ■ Tipo 2: Parte Java, parte driver nativo. Es una combinación de implementación Java y API nativo para el acceso a la base de datos. Este tipo de driver es más rápido que el anterior, pues no se realiza el paso por la capa ODBC. Las llamadas JDBC se traducen en llamadas específicas del API de la base de datos. Cada cliente debe tener instalado el driver. Tiene menor rendimiento que los dos siguientes y no se pueden usar en Internet, ya que necesita el API de forma local.
  • 6.
    ■ Tipo 3:Servidor intermediario de acceso a base de datos. Este tipo de driver proporciona una abstracción de la conexión. El cliente se conecta a los SGBD mediante un componente servidor intermedio, que actúa como una puerta para múltiples servidores. La ventaja de este tipo de driver es el nivel de abstracción. El servidor de aplicaciones WebLogic incorpora este tipo de driver. ■ Tipo 4: Drivers Java. Este es el más directo. La llamada JDBC se traduce directamente en una llamada de red a la base de datos, sin intermediarios. Proporcionan mejor rendimiento. La mayoría de SGBD proporcionan drivers de este tipo.
  • 7.
    Conexión a laBD Una vez cargado el driver apropiado para nuestro SGBD deberemos establecer la conexión con la BD. Para ello utilizaremos el siguiente método: La conexión a la BD está encapsulada en un objeto Connection. Para su creación debemos proporcionar la url de la BD y, si la BD está protegida con contraseña, el login y password para acceder a ella. El formato de la url variará según el driver que utilicemos. Sin embargo, todas las url tendrán la siguiente forma general: jdbc:<subprotocolo>:<nombre>, con subprotocolo indicando el tipo de SGBD y con nombre indicando el nombre de la BD y aportando información adicional para la conexión. 1 2 Connection con = DriverManager.getConnection(url); Connection con = DriverManager.getConnection(url, login, password);
  • 8.
    Objeto Connection Es elprincipal objeto utilizado para proporcionar un vínculo entre las bases de datos y una aplicación en Java. Connection proporciona métodos para manejar el procesamiento de transacciones, para crear objetos y ejecutar instrucciones SQL, y para crear objetos para la ejecución de procedimientos almacenados. Se puede emplear tanto el objeto Driver como el objeto DriverManager para crear un objeto Connection. Se utiliza el método connect() para el objeto Driver, y el método getConnection() para el objeto DriverManager. El objeto Connection proporciona una conexión estática a la base de datos. Esto significa que hasta que se llame en forma explícita a su método close() para cerrar la conexión o se destruya el objeto Connection, la conexión a la base de datos permanecerá activa.
  • 9.
    La manera másusual de establecer una conexión a una base de datos es invocando el método getConnection() de la clase DriverManager. A menudo, las bases de datos están protegidas con nombres de usuario (login) y contraseñas (password) para restringir el acceso a las mismas. El método getConnection() permite que el nombre de usuario y la contraseña se pasen también como parámetros. String usuario = "root"; String contraseña = "123456789"; Connection conn = DriverManager.getConnection(url,usuario,contraseña); En toda aplicación de bases de datos con MySQL es indispensable poder establecer la conexión al servidor para posteriormente enviarle las consultas. Los programas en Java no son la excepción. El siguiente código va a servir para verificar que podemos establecer una conexión a la base de datos agendita.
  • 10.
    import java.sql.*; public classConexionBD { static String bd = "sesion"; static String login = "root"; static String password = "123456789"; static String url = "jdbc:mysql://localhost/"+bd; public static void main(String[] args) throws Exception { Connection conn = null; try { lass.forName("com.mysql.jdbc.Driver").newInstance conn = DriverManager.getConnection(url,login,password); if (conn != null) { System.out.println("Conexiónse de datos "+url+" ... Ok"); conn.close(); } } catch(SQLException ex) { System.out.println(ex); } catch(ClassNotFoundException ex) { System.out.println(ex); } } }
  • 11.
    Objeto Statement Se usapara enviar sentencias SQL a la base de datos. Actualmente hay tres tipos de objetos Statement, todos los cuales actúan como contenedores para la ejecución de sentencias en una conexión dada: Statement, PreparedStatement que hereda de Statement y CallableStatement que hereda de PreparedStatement. Estas estàn especializadas para enviar tipos particulares de sentencias SQL, Un objeto Statement se usa para ejecutar una sentencia SQL simple sin parámetros. Un objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas con o sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un procedimieno de base de datos almacenado. La interfase Statement suminstra métodos básicos para ejecutar sentencias y devolver resultados. La interfase PreparedStatement añade métodos para trabajat con los parámetros IN; y la interfase CallableStatement añade métodos para trabajar con parameters OUT.
  • 12.
    Creación de objetosStatement Una vez establecida la conexión con una base de datos particular, esta conexión puede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante el método de Connection createStatement, como podemos ver en el siguiente fragmento de código. Connection con = DriverManager.getConnection(url, "sunny", ""); Statement stmt = con.createStatement(); La sentencia SQL que será enviada a la base de datos es alimentada como un argumento a uno de los métodos de ejecución del objeto Statement. Por ejemplo: ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); Ejecución de sentencias usando objetos Statement. La interfase Statement nos suministra tres métodos diferentes para ejecutar sentencias SQL, executeQuery, executeUpdate y execute. El método a usar esta determinado por el producto de la sentencia SQL.
  • 13.
    Objeto Resultset Es larepresentación en memoria de las tablas de la base de datos en disco, se puede entender como una tabla virtual, recordar que generalmente todos los procesos que se realizen con la tabla (insertar registros, eliminar registros, etc) se realizaran realmente contra un resulset y no provocaran ningun cambio en la tabla fisica en disco, resulset tiene un conjunto de metodos muy utiles y muy usados para el proceso de los renglones de la tabla virtual. Ejemplo: // declarando y creando objetos globales Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto"; // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};