JAVA CON BASE DE DATOS







ÍNDICE:


1    JAVA CON BASE DE DATOS

1.1 Definición:

Java Database Connectivity, más conocida por sus siglas JDBC, es una API que permite la ejecución de operaciones sobre bases de datos desde el lenguaje de programación Java, independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se accede, utilizando el dialecto SQL del modelo de base de datos que se utilice.
El API JDBC se presenta como una colección de interfaces Java y métodos de gestión de manejadores de conexión hacia cada modelo específico de base de datos. Un manejador de conexiones hacia un modelo de base de datos en particular es un conjunto de clases que implementan las interfaces Java y que utilizan los métodos de registro para declarar los tipos de localizadores a base de datos (URL) que pueden manejar. Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la biblioteca de conexión apropiada al modelo de su base de datos, y accede a ella estableciendo una conexión; para ello provee el localizador a la base de datos y los parámetros de conexión específicos. A partir de allí puede realizar cualquier tipo de tarea con la base de datos a la que tenga permiso: consulta, actualización, creación, modificación y borrado de tablas, ejecución de procedimientos almacenados en la base de datos, etc.
JDBC o Java Data Base Connectivity fue creado por la empresa Sun, es la API estándar de acceso a bases de datos con Java. Sun optó por crear una nueva API en lugar de utilizar ODBC, porque esta última presentaba algunos problemas desde ciertas aplicaciones Java. ODBC es una interfaz escrita en lenguaje C, que, al no ser un lenguaje portable, hacía que las aplicaciones Java también perdiesen la portabilidad. Además, ODBC ha de instalarse manualmente en cada máquina, mientras que los controladores (drivers) JDBC que están escritos en Java son automáticamente instalables y portables. El nivel de abstracción al que trabaja JDBC es más alto que el de ODBC y, de esta forma, se pueden crear librerías de más alto nivel.
Para trabajar con JDBC es necesario tener controladores que permitan acceder a las distintas bases de datos. Sin embargo, ODBC sigue siendo hoy en día la API más popular para acceso a Bases de Datos, por lo que: Sun se ha visto obligada a diseñar un puente que permite utilizar la API de JDBC en combinación con controladores ODBC.



Fuente: Taller de Base de Datos.

1.2 OBJETOS CONNECTION, STATEMENT Y RESULTSET:

1.2.1    Connection:

Un objeto Connection representa una conexión a una base de datos. Una sesión con una conexión incluye las sentencias SQL que son ejecutadas y los resultados que son devueltos a través de dicha conexión. Una misma aplicación puede tener una o más conexiones con una sola base de datos o puede tener conexiones con varias bases de datos diferentes.
La forma estándar de establecer una conexión con una base de datos es llamando al método DriverManager.getConnection. Este método toma como parámetro una cadena de caracteres que contiene una URL. La clase DriverManage trata de localizar el driver que pueda conectar con la base de datos representada por esa URL.
El siguiente código ejemplifica cómo abrir una conexión a una base de datos localizada en la URL “jdbc:odbc:wombat”:
·       String url = _jdbc:odbc:wombat_;
·       Connection con = DriverManager.getConnection(url);
Una URL de JDBC facilita una forma de identificar una base de datos de forma que el driver apropiado la reconozca y establezca una conexión con ella. La sintaxis estándar para URLs de JDBC es la siguiente:
·       jdbc:<subprotocolo>:<subnombre>
Una URL de JDBC tiene tres partes separadas por dos puntos:
·       jdbc es el protocolo. El protocolo en una URL JDBC es siempre jdbc.
<subprotocolo> es usualmente el driver o el mecanismo de conectividad de la base de datos, el cual debe ser soportado por uno o más drivers. Un ejemplo de un subprotocolo es odbc, que ha sido reservado para URLs que especifican fuentes de datos de ODBC. Por ejemplo, para acceder a una base de datos a través del Puente JDBC-ODBC se usará una URL como la siguiente:
jdbc:odbc:fred
Donde el subprotocolo es odbc y el subnombre es fred, una fuente de datos ODBC.
<subnombre> es una forma de identificar la base de datos. Puede variar dependiendo del subprotocolo y puede tener un subsubnombre con cualquier sintaxis interna que el programador del driver haya elegido.
La función del <subnombre> es dar la suficiente información para localizar la base de datos.

1.2.2    Statement:

Un objeto Statement se usa para enviar sentencias SQL a una base de datos. Una vez que se ha establecido una conexión con una base de datos particular, esa conexión puede ser usada para enviar
sentencias SQL. Un objeto Statement se crea con el método creatStatement de Connection como en el siguiente fragmento de código:
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
La sentencia SQL que será enviada a la base de datos es proporcionada como argumento a uno de los métodos para ejecutar un objeto Statement:
ResultSet rs = stmt.executeQuery(“SELECT a, b, c FROM Table2”);

1.2.3    ResultSet:

Un ResultSet contiene todos los registros (filas) que satisfacen las condiciones impuestas en una sentencia SQL y proporciona acceso a los datos en dichos registros a través de un conjunto de métodos get que permiten acceder a los diferentes campos o atributos (columnas) del registro actual. Un ResultSet mantiene un cursor que apunta al registro actual. El método ResultSet.next() se usa para moverse al siguiente registro del ResultSet, haciendo el siguiente registro el registro actual.
Los métodos getXXX proporcionan los medios para obtener los valores de los campos, atributos o columnas del registro actual. Para cada registro, los valores de las columnas pueden ser obtenidos en cualquier orden, pero para la mayor portabilidad, se debe hacer de izquierda a derecha y leer el valor de la columna sólo una vez. Tanto el nombre de la columna como el número de esta puede ser usado para designar la columna de la cual se quiere obtener el valor. Si en el ejemplo anterior la columna “a” es de tipo entero, la “b” del tipo cadena de caracteres y la “c” de tipo coma flotante, la siguiente porción de código imprimiría los valores de todos los registros:
while(rs.next()){
int i = rs.getInt(“a”);
String s = rs.getString(″b″);
Float f = rs.getFloat(″c″);
System.out.println(″ROW= ″ +i+″″+s+″″+ f);}

JDBC CON BASE DE DATOS:
Las tecnologías que se emplea para la conectividad entre los datos y la aplicación, se ha convertido en un factor muy importante a la hora de desarrollar un proyecto web que cuente con funcionalidad de acceso a datos. A continuación, se muestra un cuadro comparativo de las dos tecnologías más importantes en este sentido: ActiveX Data Objects (ADO) y Java Data Base Connectivity (JDBC).
ADO
JDBC
  •  Tecnología elaborada por Microsoft
  •  Tiene la principal función de realizar la solicitud de los datos a la base de datos.
  •  Esta solicitud la realizará mediante la tecnología OLE DB, la cual estará en contacto de manera directa con la base de datos.
  •  La tecnología OLE DB sólo se empleará cuando el DBMS pertenece de igual manera a Microsoft, como es SQL Server.
  •  ADO encapsulará a ciertos objetos de OLE DB, para que de ésta manera se realice la conexión con la base de datos.
  •  Para realizar la gestión de acceso a bases de datos heterogéneas por parte de ADO, éste hará uso de ciertos objetos de la tecnología RDO (Remote Data Objects).
  •  RDO dependerá de los ODBC’s para poder efectuar la conexión a la base de datos y con esto el acceso a la información.
  •  ADO podrá encontrarse trabajando en una página web en conjunto con código HTML; esto será posible mediante un mecanismo de introducción de instrucciones como es el VBscript.
  •  Los objetos que conforman al ADO, no son compatibles con otros lenguajes, solo por aquellos que pertenecen a la empresa Microsoft como son: Visual C++, Visual Basic, Visual Java, etc.
  • Tecnología hecha por Sun Microsistems.
  •  Tiene la función de ser un gestor para la aplicación con respecto a la base de datos.
  •  Por primera vez el JDBC fue empleado, tomando como intermediario entre él y la base de datos al ODBC.
  •  Como modelo cliente/servidor, el JDBC se encontrará trabajando en el equipo cliente, conectándose directamente con la base de datos.
  •  Como modelo de tres capas, el JDBC se encontrará en una capa intermedia, donde todos los usuarios pasarán por él para poder accesar a la base de datos.
  •  Existen módulos JDBC que son propios de los fabricantes de DBMS, que son utilizados para el rápido acceso a la información de las bases de datos de los mismos.
  •  JDBC no se encontrará ligado a trabajar con alguna tecnología en específica, ya que se elaboró con la finalidad de ser portable.
  •  En aplicaciones Web, JDBC se encontrará laborando en conjunto con código HTML, mediante el mecanismo del Java script.
  •  JDBC se elaboró con la finalidad de poder ser compatible y portable para poder ser empleado en aplicaciones y para la conexión con bases de datos.
Las API's que se describen a continuación, son un claro ejemplo del proceso correspondiente a la conectividad de datos.
Ø   ODBC (Open Data Base Connectivity): Esta tecnología proporciona una interfaz común para tener acceso a bases de datos SQL heterogéneas. ODBC está basado en SQL (Structured Query Language) como un estándar para tener acceso a datos. ODBC permite la conexión fácil desde varios lenguajes de programación y se utiliza mucho en el entorno Windows. Sobre ODBD Microsoft ha construido sus extensiones OLE DB y ADO. Los OCBD se pueden clasificar en 3 categorías:
o    Los ODBC's que permitan la realización de consultas y actualizaciones.
o    Los ODBC's que mediante ellos se pueda llegar a la creación de tablas en la base de datos.
o    Los ODBC's propios de los DBMS, los cuales se pueden llegar a manipular ciertas herramientas de administración.
Ø    CGI (Common Gateway Interface): es una de las soluciones que se está utilizando más para la creación de interfaces Web/DBMS. Entre las ventajas de la programación CGI, destaca la sencillez, ya que es muy fácil de entender, además de ser un lenguaje de programación independiente, ya que los escritos CGI pueden elaborarse en varios lenguajes. También es un estándar para usarse en todos los servidores Web, y funcionar bajo una arquitectura independiente, ya que ha sido creado para trabajar con cualquier arquitectura de servidor Web. Como la aplicación CGI se encuentra funcionando de forma independiente, no pone en peligro al servidor, en cuanto al cumplimiento de todas las tareas que éste se encuentre realizando, o al acceso del estado interno del mismo. Pero el CGI presenta cierta desventaja en su eficiencia, debido al que el servidor Web tiene que cargar el programa CGI y conectar y desconectar con la base de datos cada vez que se recibe una requisición. Además, no existe un registro del estado del servidor, sino que todo hay que hacerlo manualmente.
Ø   ISAPI (Internet Server Application Programming Interface): Es la interfaz propuesta por Microsoft como una alternativa más rápida que el CGI, y está incluida en el Servidor Microsoft Internet Information (IIS). Así como los escritos CGI, los programas escritos usando ISAPI habilitan un usuario remoto para ejecutar un programa, busca información dentro de una base de datos, o intercambia información como otro software localizado en el servidor. Los programas escritos usando la interfaz ISAPI son compilados como bibliotecas de enlace dinámico (DLL - Dinamic Link Library), ya que son cargados por el servidor Web cuando éste se inicia. Dichos programas se vuelven residentes en memoria, por lo que se ejecutan mucho más rápido que las aplicaciones CGI, debido a que requieren menos tiempo de uso de CPU al no iniciar procesos separados. Uno de los programas ISAPI más usados es el HTTPODBC.DLL que se usa para enviar y/o devolver información hacia y desde las bases de datos, a través de ODBC. Además, ISAPI permite realizar un procesamiento previo de la solicitud y uno posterior de la respuesta, con lo cual manipula la solicitud/respuesta HTTP. Los filtros ISAPI pueden utilizarse para aplicaciones tales como autenticación, acceso o apertura de sesión.
Ø   NSPAI. es la API propuesta por Netscape para extender la funcionalidad de sus servidores.
Ø   DBI (PERL): Perl es uno de los lenguajes más utilizados para programación en la Web y proporciona su propia interfaz de acceso a datos, llamada DBI (DataBase Interface). Es especialmente utilizado bajo plataformas Linux/Unix, solucionando las complejidades de ODBC en estos sistemas. DBI actúa como una abstracción para un conjunto de módulos DBD (DataBase Driver). Cada módulo DBD actúa como manejador de un sistema gestor de base de datos distinto. Existen módulos para prácticamente cualquier SGBD (OracleInformixMySQL, etc.) y puentes hacia otras tecnologías como ADO, JDBC ...
Ø   JDBC (Java Data Base Connectivity): se trata del estándar para la conectividad entre el lenguaje Java y un amplio rango de sistemas gestores de bases de datos. Los JDBC pueden desenvolverse tanto en un nivel cliente, esto es, trabajando del lado de la aplicación, o en el servidor directamente relacionado con la base de datos. Cuando se encuentre a nivel cliente, trabajará con la tecnología ODBC para acceso a los datos. Hay diversos tipos de controladores JDBC:
o   El puente JDBC-OBDC: fue uno de los primeros controladores disponibles, implementa un enlace para utilizar un controlador ODBC desde Java. Con el tiempo han surgido controladores JDBC específicos para cada base de datos que mejoran el rendimiento del puente JDBC-ODBC.
o   Controladores Java parcialmente nativos: usan tanto código Java como binario específico de cada plataforma.
o   Controladores JDBC-Net de Java puro: son controladores escritos completamente en Java que entienden un protocolo de red estándar (HTTP, etc.) y permiten comunicarse con un servidor de acceso a bases de datos, que es el que finalmente provee el acceso al SGBD específico (posiblemente con ODBC).
o   Controladores de protocolo nativo en Java puro: escritos en Java puro, utilizan el protocolo específico de la marca del SGBD.
Ø   SQL LINKS: se trata de controladores que se encargan de realizar la comunicación remota entre la aplicación y los servidores remotos de bases de datos, permitiendo una comunicación casi directa y muy rápida. Los ha desarrollado la empresa Inprise y permiten conexiones con otros servidores de bases de datos como Interase, OracleSybaseInformixMicrosoft SQL Server, etc.
JDBC (Java DataBase Connectivity) es la API que permite la conexión de un programa Java y una base de datos relacional.
Se encuentra dentro del paquete java.sql.
Incluye clases e interfaces que permiten el acceso a la base de datos para ejecutar consultas, actualizaciones, ejecutar procedimientos, etc.
Algunas de las clases e interfaces de JDBC son:
Clase / Interface
Función
Clase DriverManager
Establece la conexión con la base de datos
Interface Connection
Representa una conexión con la BD
Interface Statement
Ejecución de consultas SQL
Interface PreparedStatement
Ejecución de consultas preparadas y procedimientos almacenados
Interface ResultSet
Manipulación de registros en consultas de tipo Select
Interface ResultSetMetadata
Proporciona información sobre la estructura de los datos.
El objetivo de las interfaces de JDBC es definir como trabajar con la base de datos: como establecer la conexión, como ejecutar una consulta, etc.
Para poder ejecutar nuestro programa necesitamos las clases que implementen estas interfaces.
Driver JDBC:
Llamamos DRIVER al conjunto de clases que implementan las interfaces JDBC.  
El driver proporciona la comunicación entre la aplicación Java y la base de datos
Cada tipo de bases de datos (Oracle, MySQL, PostGreSQL, etc) tienen su propio driver.
Los drivers los proporcionan los fabricantes de las bases de datos. Normalmente se descarga desde la página web del fabricante.
Por lo tanto, el primer paso para trabajar con bases de datos desde Java es conseguir el driver adecuado.
ACCESO A BASES DE DATOS CON JDBC:
Una vez incorporado el driver como librería de la aplicación, se deben seguir los siguientes pasos para acceder a una base de datos:
1. Importar los paquetes: Normalmente es suficiente con la sentencia import java.sql.*;
2. Cargar el driver: El driver se debe cargar para poder utilizarlo. Esto lo realiza el método estático forName() de la clase Class.
Class.forName(String driver);
Driver JDBC para MySQL:
Class.forName("com.mysql.jdbc.Driver");
Lanza una excepción ClassNotFoundException
3. Crear la conexión: Esto lo realiza el método estático getConnection() de la clase DriveManager.
DriverManager.getConnection(String url);
url es un String que nos permite localizar la base de datos.
Normalmente se compone de tres campos:
jdbc:tipoBD:datos_de_conexion
Una sobrecarga del método getConnection acepta, además de la url, el usuario y contraseña de la base de datos.
Este método devuelve un objeto que implementa la interfaz Connection.
4. Ejecutar una consulta: Las consultas se manejan mediante un objeto que implementa la interface Statement.
Antes de poder ejecutar una consulta debemos crear el objeto.
El objeto se crea utilizando el método createStatement() de Connection.
Statement s = conexion.createStatement();
Una vez creado podemos utilizar algunos de los métodos de Statement para enviar la consulta a la BD.
Algunos de estos métodos son:
boolean execute(String sentenciaSQL);
Si es una consulta de acción (Insert, Delete, Update) devuelve false indicando que no se generan resultados. Si es una consulta de selección (Select) devuelve true.
int executeUpdate(String sentenciaSQL);
Envía una consulta de acción. Devuelve el número de registros afectados por dicha acción.
ResultSet executeQuery(String sentenciaSQL);
Envía una consulta de selección. Devuelve un objeto ResultSet con los datos obtenidos de la consulta.






Por ejemplo, si en la base de datos tenemos una tabla llamada persona, una consulta de todos los registros de la tabla sería:
ResultSet rs = s.executeQuery("select * from persona");
5. Manipular el resultado de la consulta: El objeto de tipo ResultSet devuelto por la consulta de selección dispone de un cursor para desplazarse por los registros y de métodos para acceder al valor de cada campo.
Desplazarse por los registros de un ResultSet.
Una vez obtenido, su cursor se sitúa justo antes del primer registro obtenido.
Por defecto, un ResultSet es un objeto de sólo avance y solo lectura. El recorrido se hará siempre desde el principio hacia delante y los campos no podrán ser modificados. Se pueden crear también ResultSets desplazables de lectura/escritura.
El método next() permite desplazarnos por los registros. Una llamada a este método desplaza el cursor al siguiente registro. Devuelve false si se ha llegado al final y true en caso contrario.
Acceder a los campos del resultado de una consulta.
Los campos del registro apuntado por el cursor se pueden acceder mediante dos grupos de métodos. xxx es cualquier tipo de dato básico Java más String, Date y Object. Se deberá utilizar el método adecuado al tipo de dato que contiene el campo. Si no conocemos el tipo de dato podemos utilizar getObject().
xxx getXxx(int posición);
Obtiene el valor del campo que ocupa la posición indicada. La primera posición es la 1.
xxx getXxx(String nombreCampo);
Obtiene el valor del campo que coincide con el nombre indicado.




Por ejemplo, si la tabla persona contiene 3 campos en este orden: id de tipo int,  nombre de tipo String y fecha de tipo Date:
while (rs.next()) {
         System.out.println(rs.getInt("Id") + " " + rs.getString(2) + " " + rs.getDate(3));
}
Además de estos métodos, la interfaz ResultSet proporciona una gran cantidad de métodos para acceder y manejar los resultados de la consulta entre ellos:
ü  boolean isFirst() que devuelve true si el cursor apunta al primer registro.
ü  boolean isLast() que devuelve true si el cursor apunta al último.
ü  int getRow() que devuelve la posición del registro actual, siendo 1 la posición del primer registro, etc.
6. Desconexión de la base de datos: Permite liberar recursos de memoria y CPU. El cierre de una conexión se realiza mediante el métodoclose() de la interfaz Connection.
conexion.close();
La interfaz Statement también dispone de un método close() para liberar los recursos utilizados por el objeto. Esto debe hacerse antes de cerrar la conexión.
Cuando se cierra una conexión todos los objetos Statement se cierran automáticamente.
La mayoría de métodos usados, el API JDBC lanzan una excepción de tipo SQLException que se debe capturar.
Ejemplos de acceso a bases de datos MySQL con Java y JDBC
Para realizar los siguientes ejemplos de acceso a una base de datos supondremos lo siguiente:
El servidor de base de da.tos debe estar arrancado y suponemos que utiliza el puerto por defecto (3306)
La base de datos que vamos a utilizar se llama prueba con un usuario root y contraseña 1daw.
La base de datos tiene una tabla persona con tres campos:
ü  id: smallint auto_increment primary key
nombre: varchar(60)
nacimiento: date.

1.3 EJEMPLOS:

Ejemplo 1: Conexión a una base de datos MySQL y consulta de una tabla.
import java.sql.*;
public class EjemploAccesoBD1 {
    public static void main(String[] args) {
        Connection conexion = null;
        try {
// Cargar el driver
            Class.forName("com.mysql.jdbc.Driver");

            // Se obtiene una conexión con la base de datos.
            // En este caso nos conectamos a la base de datos prueba
            // con el usuario root y contraseña 1daw
  conexion = DriverManager.getConnection("jdbc:mysql://localhost/prueba", "root", "1daw");

            // Se crea un Statement, para realizar la consulta
            Statement s = conexion.createStatement();

            // Se realiza la consulta. Los resultados se guardan en el ResultSet rs
            ResultSet rs = s.executeQuery("select * from persona");

            // Se recorre el ResultSet, mostrando por pantalla los resultados.
            while (rs.next()) {
                System.out.println(rs.getInt("Id") + " " + rs.getString(2) + " " + rs.getDate(3));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } finally { // Se cierra la conexión con la base de datos.
            try {
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
}

Ejemplo 2: Crear una tabla e insertar datos.
Crearemos la tabla contactos dentro de la base de datos prueba.
import java.sql.*;
public class EjemploAccesoBD2 {
    public static void main(String[] args) {
        Connection conexion = null;
        try {
            // Cargar el driver
            Class.forName("com.mysql.jdbc.Driver");

            // Se obtiene una conexión con la base de datos.
    conexion = DriverManager.getConnection("jdbc:mysql://localhost/prueba", "root", "1daw");

            // Se crea un Statement, para realizar el query
            Statement s = conexion.createStatement();

            //se crea una tabla nueva
            s.executeUpdate("CREATE TABLE contacto (id INT AUTO_INCREMENT,
                                      PRIMARY KEY(id), nombre VARCHAR(20),
                                      apellidos VARCHAR(20), telefono VARCHAR(20))");

            //Los datos que vamos a insertar los tenemos en 3 arrays
            String nombres[] = {"Juan", "Pedro", "Antonio"};
            String apellidos[] = {"Gomez", "Lopez", "Alvarez"};
            String telefonos[] = {"987452154", "989654125", "985321478"};

            //se insertan datos en la tabla
            for (int i = 0; i < nombres.length; i++) {
                s.executeUpdate("INSERT INTO contacto (nombre, apellidos, telefono)
                     VALUES ('" + nombres[i] + "','" + apellidos[i] + "','" + telefonos[i] + "' )");
            }

// Se realiza una consulta sobre la tabla contacto.
ResultSet rs = s.executeQuery("select * from contacto");

// Se recorre el ResultSet, mostrando por pantalla los resultados.
while (rs.next()) {
System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " +
rs.getString(3) + " " + rs.getString(4));
}
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} finally { // Se cierra la conexión con la base de datos.
try {
if (conexion != null) {
conexion.close();
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
}
}

1.3.1    ResultSet desplazables y modificables:

Se pueden crear ResultSet con más prestaciones que las que tienen los que hemos creado hasta ahora. Recuerda que los creados por defecto solo se pueden recorrer desde el principio hasta el final y no permiten modificar los datos.
Para ello tenemos que modificar la forma de crear el Statement.
En lugar de crear un Statement así:     Statement s = conexion.createStatement();
Utilizaremos esta versión del método createStatement():
Statement createStatement(int tipoResultSet, int concurrenciaResultSet);
tipoResulSet puede ser uno de estos valores:
ResultSet.TYPE_FORWARD_ONLY
ResultSet de solo avance. Es el valor por defecto
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet desplazable en ambas direcciones. No refleja los cambios en los datos que se puedan producir en la base de datos.
ResultSet.TYPE_SCROLL_SENSITIVE
ResultSet desplazable en ambas direcciones. Refleja los cambios en los datos que se puedan producir en la base de datos.
ConcurrenciaResultSet puede ser uno de estos valores:
ResultSet.CONCUR_READ_ONLY
Campos de solo lectura. Es el valor por defecto
ResultSet.CONCUR_UPDATABLE
Campos modificables.
Además de los métodos utilizados por los ResultSet por defecto, algunos de los métodos que se pueden usar son los siguientes:
Método
Descripcióm
boolean first()
Desplaza el cursor al primer registro. Devuelve true si estamos ante una fila válida y false en caso contrario.
void beforeFirst()
Desplaza el cursor a la posición situada antes del primer registro.
boolean last()
Desplaza el cursor al último registro. Devuelve true si estamos ante una fila válida y false en caso contrario.
void afterLast()
Desplaza el cursor a la posición situada después del último registro.
boolean absolute(int pos)
Desplaza el cursor a la posición indicada por pos. Devuelve true si estamos ante una fila válida y false en caso contrario.
Para modificar un campo del ResultSet, utilizamos métodos updateXxx donde Xxx es el tipo de dato del campo que vamos a actualizar.
Por ejemplo: modificamos el campo 2 (de tipo String) del registro 2 de la tabla persona.
ü  rs.absolute(2);  //nos situamos en el registro a modificar
ü  rs.updateString(2, "Ana Lozano");  // Modificamos el campo 2. Nuevo valor: "Ana Lozano"
ü  rs.updateRow(); // se actualiza el registro.

Ejemplo de ResultSet desplazable y modificable:
En este ejemplo se crea un ResultSet que se va recorrer de forma inversa, desde el final al principio. Además, se va a utilizar para modificar un registro de la tabla persona.
import java.sql.*;
public class EjemploAccesoBD6 {
    public static void main(String[] args) {
        Connection conexion = null;
        try {          
            Class.forName("com.mysql.jdbc.Driver");
            conexion =
               DriverManager.getConnection("jdbc:mysql://localhost/prueba", "root", "1daw");
              
            //Indicamos que el ResultSet será desplazable y modificable
            Statement
            s=  conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                                                      ResultSet.CONCUR_UPDATABLE);

            ResultSet rs = s.executeQuery("select * from persona");
           
            //Recorrer el ResultSet desde el final hasta el principio
            rs.afterLast();
            while (rs.previous()) {
                System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getDate(3));
            }
           
            // modificar el campo nombre (2) del registro 2 del ResultSet
            // el cambio también se produce en la base de datos
            rs.absolute(2);
            rs.updateString(2, "Ana Lozano");
            rs.updateRow();

            //Recorrer el ResultSet para comprobar la modificación.
            //Para recorrer el ResultSet desde el principio hasta el final nos debemos situar
            //de nuevo al principio
            rs.beforeFirst();
            while (rs.next()) {
                System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getDate(3));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
}

Para insertar filas el ResultSet tiene el método moveToInsertRow() que nos lleva a una fila vacía para que llenemos sus campos mediante métodos updateXxx y finalmente la insertemos en la tabla mediante el método insertRow().
Construccion de un Administrador de Conexiones:
Para poder obtener una conexión, una forma simple y comoda de trabajar es armar una clase llamada, por ejemplo, AdministradorDeConexiones, que contenga dentro de un método (obtenerConexion()) el código necesario para obtenerla.
 A continuación se presenta un ejemplo de la clase con su correspondiente método:
package ar.com.et3.lab8.ejercicio1.administrador;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* @author Martin
 */
public abstract class AdministradorDeConexiones {   
    public AdministradorDeConexiones() {
    }
    public static Connection getConnection() throws Exception
    {
        // Establece el nombre del driver a utilizar
        String dbDriver = "com.mysql.jdbc.Driver";       
        // Establece la conexion a utilizar contra la base de datos
        String dbConnString = "jdbc:mysql://localhost/6to_ET3";       
        // Establece el usuario de la base de datos
        String dbUser = "root";       
        // Establece la contraseña de la base de datos
        String dbPassword = "";       
        // Establece el driver de conexión
        Class.forName(dbDriver).newInstance();       
        // Retorna la conexión
        return DriverManager.getConnection(dbConnString, dbUser, dbPassword);
    }        
}

Como consultar datos:
El metodo createStatement(): El método createStatement() se utiliza para crear un objeto que modela a una sentencia SQL. Es un objeto del tipo de una clase que implementa la interfaz Statement, y provee la infraestructura para ejecutar sentencias SQL sobre una conexión con una base de datos.
La forma de construir un objeto de este tipo es: 
Statement stmtConsulta = laconexion.createStatement();

El método executeQuery(): El método executeQuery() se utiliza para ejecutar una sentencia SQL y obtener el resultado correspondiente dentro de un objeto del tipo ResulSet. Este objeto representa un conjunto de resultados que se obtienen como consecuencia de ejecutar la sentencia SQL del tipo SELECT a través de la conexión.
La forma de generar un objeto de este tipo es:

ResulSet rs = stmConsulta.executeQuery(laConsulta);

Como realizar una consulta:
        // Define la conexión
        Connection laConexion = AdministradorDeConexiones.getConnection();       
        // Arma la consulta y la ejecuta
        String laConsulta = "SELECT * FROM alumnos";
        Statement stmtConsulta = laConexion.createStatement();
        ResultSet rs = stmtConsulta.executeQuery(laConsulta);       
        // Muestra los datos
        while( rs.next() )
        System.out.println( "ID: " + rs.getInt("alu_id") + " -- " + "Nombre: " +              rs.getString("alu_nombre") + " -- " + "Apellido: " + rs.getString("alu_apellido") );       
        // Cierra el Statement y la Connection
        stmtConsulta.close();
        laConexion.close();
Como insertar datos:
El método createStatement(): El método createStatement() es el mismo presentado en la sección Consulta.
El método execute(): El método execute() se utiliza para ejecutar sentencias SQL del tipo INSERT, UPDATE o DELETE, y a diferencia del método executeQuery() no retorna un conjunto de resultados.
La forma de utilizar el método execute() es:
String laInsercion = "INSERT INTO alumnos (alu_id, alu_nombre, alu_apellido) VALUES (101, 'Manuel', 'Santos')"
Como realizar una inserción:
      // Define la conexión
        Connection laConexion = AdministradorDeConexiones.getConnection();   
        // Arma la sentencia de inserción y la ejecuta
        String laInsercion = "INSERT INTO alumnos (alu_id, alu_nombre, alu_apellido) VALUES (101, 'Manuel', 'Santos')";
        Statement stmtInsercion = laConexion.createStatement();
        stmtInsercion.execute(laInsercion);       
        // Cierra el Statement y la Connection
        stmtInsercion.close();
        laConexion.close();       
        // Informa que la inserción ha sido realizada con éxito
        System.out.println("La inserción ha sido realizada con éxito...");

Como actualizar datos:

El método createStatement(): El método createStatement() es el mismo presentado en la sección Consulta.

El método execute(): El método execute() es el mismo presentado en la sección Inserción.

Como realizar una actualización:
     
      // Define la conexión
        Connection laConexion = AdministradorDeConexiones.getConnection();       
        // Arma la sentencia de actualización y la ejecuta
        String laActualizacion = "UPDATE alumnos SET alu_apellido = 'Trobbiani' WHERE alu_id  = 101";
        Statement stmtActualizacion = laConexion.createStatement();
        stmtActualizacion.execute(laActualizacion);       
        // Cierra el Statement y la Connection
        stmtActualizacion.close();
        laConexion.close();       
        // Informa que la actualización ha sido realizada con éxito
        System.out.println("La actualización ha sido realizada con éxito...");



Como eliminar datos:

El método createStatement(): El método createStatement() es el mismo presentado en la sección Consulta.

El método execute(): El método execute() es el mismo presentado en la sección Insercion.


Como realizar una eliminación:
      // Define la conexión
        Connection laConexion = AdministradorDeConexiones.getConnection();       
        // Arma la sentencia de eliminación y la ejecuta
        String laEliminacion = "DELETE FROM alumnos WHERE alu_id = 101";
        Statement stmtEliminacion = laConexion.createStatement();
        stmtEliminacion.execute(laEliminacion);       
        // Cierra el Statement y la Connection
        stmtEliminacion.close();
        laConexion.close();       
        // Informa que la eliminación ha sido realizada con éxito
        System.out.println("La eliminación ha sido realizada con éxito...");

Como tratar excepciones con el manejo de base de datos:
public static void main(String[] args) {   
        // Declara el objeto de conexión
        Connection laConexion = null;       
        try
        {
            // Obtiene la conexión
            laConexion = AdministradorDeConexiones.getConnection();
            // Muestra los alumnos en pantalla
            mostrarAlumnos(laConexion);
        } catch(Exception e) {
            System.out.println( e.getMessage() );
        } finally {
            // Cierra la conexión
            try
            {
                if(laConexion != null)
                    laConexion.close();
            } catch(Exception e){}
        }
    }  

    public static void mostrarAlumnos(Connection conn) throws SQLException
    {
        Statement stmtAlumnos = null;     
        // Arma la sentencia SQL en forma de text
        String consulta = "SELECT * FROM alumnos";
        // Arma la sentencia SQL y la ejecuta
        stmtAlumnos = conn.createStatement();
        ResultSet rs = stmtAlumnos.executeQuery( consulta );
        // Muestra los alumnos en pantalla
        while(rs.next())
            System.out.println( rs.getString("alu_nombre") + " -- " + rs.getString("alu_apellido") );
    }


2    RESUMEN:

Java Data Base Connectivity o JDBC fue creado por la empresa Sun, es la API estándar de acceso a bases de datos con Java. El API JDBC se presenta como una colección de interfaces Java y métodos de gestión de manejadores de conexión hacia cada modelo específico de base de datos. Sun optó por crear una nueva API en lugar de utilizar ODBC, porque esta última presentaba algunos problemas desde ciertas aplicaciones Java. ODBC es una interfaz escrita en lenguaje C, que se instala manualmente en cada máquina, mientras que los controladores (drivers) JDBC que están escritos en Java son automáticamente instalables y portables. El nivel de abstracción al que trabaja JDBC es más alto que el de ODBC y, de esta forma, se pueden crear librerías de más alto nivel.
Los objetos de Java con Base de Datos son:
ü  Connection: Representa una conexión a una base de datos. Una sesión con una conexión incluye las sentencias SQL que son ejecutadas y los resultados que son devueltos a través de dicha conexión. La forma estándar de establecer una conexión con una base de datos es llamando al método DriverManager.getConnection.
ü  Statement: Se usa para enviar sentencias SQL a una base de datos. Una vez que se ha establecido una conexión con una base de datos particular, esa conexión puede ser usada para enviar sentencias SQL. Un objeto Statement se crea con el método creatStatement de Connection como en el siguiente fragmento de código:
·       Connection con = DriverManager.getConnection(url);
·       Statement stmt = con.createStatement();
ü  ResultSet: Contiene todos los registros que satisfacen las condiciones impuestas en una sentencia SQL y proporciona acceso a los datos a través de un conjunto de métodos get que permiten acceder a los diferentes campos o atributos. Un ResultSet mantiene un cursor que apunta al registro actual. El método ResultSet.next() se usa para moverse al siguiente registro del ResultSet. Los métodos getXXX proporcionan los medios para obtener los valores de los campos, atributos o columnas del registro actual.

3    SUMMARY:

Java Data Base Connectivity or JDBC was created by Sun, is the standard API for accessing databases with Java. The JDBC API is presented as a collection of Java management methods handlers connection to each specific database model and interfaces. Sun chose to create a new API instead of using ODBC, because the latter had some problems from certain Java applications. ODBC is a C language interface, which is manually installed on each machine, while the drivers (drivers) JDBC that are written in Java are automatically installable and portable. The level of abstraction to working JDBC is higher than the ODBC and, in this way, you can create libraries highest level.
Java objects with Database are:
ü  Connection: Represents a connection to a database. A session with a connection includes the SQL statements that are executed and results are returned through that connection. The standard way to establish a connection to a database is calling DriverManager.getConnection method.
ü  Statement: Used to send SQL statements to a database. Once you have established a connection to a particular database, that connection can be used to send SQL statements. A Statement object is created with the Connection creatStatement method as in the following code fragment:
Connection con = DriverManager.getConnection (url);
• Statement stmt = con.createStatement ();
ü  ResultSet: Contains all records that meet the conditions imposed in an SQL statement and provides access to data through a set of get methods that allow access to different fields or attributes. A ResultSet maintains a cursor that points to the current record. The ResultSet.next () method is used to move to the next record in the ResultSet. The getXXX methods provide the means to obtain the values ​​of the fields, attributes or columns of the current record.

4    RECOMENDACIONES:

Éstos conceptos y ejemplos son muy útiles e importantes para todos aquellos que quieran dedicarse al desarrollo y hayan dedicado unos cuantos años a formarse para ello. No hace falta ser un experto en nada (eso requiere mucho más tiempo), pero sí tener una idea más o menos clara de los conceptos básicos y una base lo bastante sólida como para poder seguir profundizando en aquello que necesites.
*     Connection: Dentro de este punto, considero especialmente útil que un objeto Connection representa una conexión a una base de datos. Además, la forma estándar de establecer una conexión con una base de datos es el método DriverManager.getConnection. La clase DriverManage trata de localizar el driver que pueda conectar con la base de datos.
*     Statement: En este punto hay que tener claro que Statement se usa para enviar sentencias SQL a una base de datos. Una vez que se ha establecido una conexión con una base de datos particular, esa conexión puede ser usada para enviar sentencias SQL. Además, un objeto Statement se crea con el método creatStatement de Connection como en el siguiente fragmento de código:
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
*     ResultSet: En este punto hay que tener en cuenta que ResutSet contiene todos los registros que satisfacen las condiciones impuestas en una sentencia SQL y proporciona acceso a los datos en dichos registros a través de un conjunto de métodos “get” que permiten acceder a los diferentes campos o atributos del registro actual. Un ResultSet mantiene un cursor que apunta al registro actual. El método ResultSet.next() se usa para moverse al siguiente registro del ResultSet. Además, los métodos getXXX proporcionan los medios para obtener los valores de los campos, atributos o columnas del registro actual.

5    CONCLUCIONES:

El acceso mediante Java con Base de Datyos conviene utilizarlo cuando tenemos pocas clases, escasos conocimientos, escaso tiempo para formación, modelo de datos muy desnormalizado.
En realidad, Java con Base de Datos, más conocida como JDBC, es una API que permite la ejecución de operaciones sobre bases de datos desde el lenguaje de programación Java, independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se accede, utilizando el dialecto SQL del modelo de base de datos que se utilice. Este API JDBC se presenta como una colección de interfaces Java y métodos de gestión de manejadores de conexión hacia cada modelo específico de base de datos. Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la biblioteca de conexión apropiada al modelo de su base de datos, y accede a ella estableciendo una conexión; para ello provee el localizador a la base de datos y los parámetros de conexión específicos. A partir de allí puede realizar cualquier tipo de tarea con la base de datos a la que tenga permiso: consulta, actualización, creación, modificación y borrado de tablas, ejecución de procedimientos almacenados en la base de datos, etc.
Java con Base de Datos presenta 3 objetos muy importantes los cuales son:
ü  Connection.
ü  Statement.
ü  ResutSet.

6    APRECIACIÓN DEL EQUIPO:

Java con Base de Datos es un tema muy importante para todo estudiante de Sistemas o Computación y para todos aquellos que quieran aprender acerca de estos lenguajes de programación ya que nos enseñan a crear tablas, insertar datos, conectar nuestra base de datos, ya sea con NetBeans, MySQL, etc.
Además, nos presenta tres objetos muy importantes para realizar la conexión, enviar sentencias a nuestra base de datos y nos explica detalladamente con cada ejemplo todo el proceso que debemos seguir.

7    GLOSARIO:

v Interfaz: Dispositivo capaz de transformar las señales generadas por un aparato en señales comprensibles por otro.
v Portable: Es una aplicación informática que puede ser utilizada en cualquier ordenador que posea el sistema operativo para el que fue programada; esto significa que no es necesaria la instalación de bibliotecas adicionales en el sistema para su funcionamiento.
v Subprotocolo:  Es un caso especial que sido reservado para URL’s que especifican el estilo ODBC de nombres de fuentes de datos y que tiene la característica de permitir especificar cualquier número de valores de atributos después del subnombre (el nombre de la fuente de datos).
v Boolean: Es un tipo de variable que sólo tiene dos valores posibles: "true" (verdadero, 1) y "false" (falso, 0).
v Cursor: Señal, normalmente parpadeante, que indica en una pantalla de computadora la posición en la que se puede realizar una acción.
v Statement: Declaración.
v DriveManager: Gerente de la unidad.
v ResultSet: Conjunto resultante.
v Sintaxis: Disciplina lingüística que estudia el orden y la relación de las palabras o sintagmas en la oración, así como las funciones que cumplen.
v Relacional: Perteneciente o relativo a la relación o correspondencia entre cosas.
          

8    LINKOGRAFÍA:

ü  http://www.ibm.com/support/knowledgecenter/es/ssw_ibm_i_72/rzaha/statemnt.htm


Comentarios

Entradas más populares de este blog

TRANSACCIONES EN SQL SERVER

APLICACIONES N-CAPAS EN VISUAL.NET

PROCEDIMIENTOS ALMACENADOS