No es un bug, es una característica no documentada

Mostrando entradas con la etiqueta Acceso a datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Acceso a datos. Mostrar todas las entradas

6/3/16

Acceso a datos. Neodatis

2:37 Posted by Inazio Claver , 16 comments
Neodatis ODB es una base de datos orientada a objetos con licencia GNU muy simple que actualmente corre en los lenguajes Java, .Net, Google Android, Groovy y Scala.

Con Neodatis podemos evitar la falta de impedancia entre los mundos orientados a objetos y los relacionales, ya que actúa como una capa de persistencia transparente para Java, .Net y Mono.

Neodatis ODB soporta consultas nativas, es decir, podemos lanzar una consulta directamente desde Java, por ejemplo.
Además es bastante simple e intuitivo. Los objetos pueden ser añadidos fácilmente a la base de datos, lo que requiere clases no repetitivas y que las clases ya existentes no puedan modificarse.


También cuenta con un explorador ODB, una herramienta gráfica para navegar, consultar, actualizar y borrar objetos, así como la importación / exportación de bases de datos desde y hacía archivos XML.

3/3/16

Acceso a datos. Bases de datos orientadas a objetos

2:37 Posted by Inazio Claver , No comments
(Fragmento obtenido de la Universidad de Los Andes, Venezuela)

Condiciones en las que nacen los SGBDR (años 60 – 70)

Uniformidad. Muchos datos estructurados de forma similar.
Orientación a Registros. Datos básicos organizados en registros de longitud fija.
Datos pequeños. Registros cortos, de 80 bytes o menos.
Campos atómicos. Cortos, indivisibles y de longitud fija.
Transacciones cortas. Tiempo de ejecución medido en fracciones de segundos / sin interacción del usuario.
Esquemas Conceptuales Estáticos. El esquema de la BD se cambia con muy poca frecuencia.
Procesamiento por Lotes. Poca interacción con el usuario.
Aplicaciones Casi Inexistentes. O a muy bajo nivel, embebidas e implementadas en el SGBD.

Con el tiempo, debido a la mayor capacidad de cómputo de los procesadores, mayor cantidad de memoria principal y secundaria y a la reducción generalizada de los costos del hardware fue posible desarrollar nuevos tipos de aplicaciones.
  • Diseño Asistido por Computador (CAD)
  • Ingeniería de Software Asistida por Computador (CASE)
  • Bases de datos de Multimedios
  • Sistemas de Información de Oficina
  • Sistemas de Información / Aplicaciones Empresariales
  • Sistemas Expertos de Bases de Datos (el cielo es el límite)

Nuevos tipos de aplicaciones, más capacidad de cómputo, más memoria principal y secundaria, implica que se producen cambios en la forma en que se ven y usan los SGBD.


Nuevas necesidades

Nuevas capas de aplicación
  • Reglas más complejas asociadas mucho más a nivel de aplicación (general) que a nivel de tuplas.
  • Mayor interacción (y más compleja) entre el usuario y la aplicación.
  • Transacciones de larga duración (en parte por el punto anterior).

Información más compleja à Objetos
Comportamiento asociado a la información à Objetos
Reducir la impedancia entre las nuevas capas de aplicación (Objetos) y el almacenamiento persistente de los datos (Relacional).

Sistemas de Gestión de BD Orientados a Objetos

Un Sistema de Gestión de Base de Datos Orientado a Objetos (SGBDOO) es un SGBD que integra de forma transparente características de las bases de datos (almacenamiento y acceso a la información, entre otros) con características de los lenguajes de programación de aplicación orientados a objetos.

Es decir, el SGBDOO se puede ver como una extensión que le da características de persistencia a algunos objetos de un lenguaje orientado a objetos, o como una extensión que añade características orientación a objetos a un Sistema de Gestión de Bases de Datos.

¿Cuál es la idea?

25/2/16

Acceso a datos. Oracle Database. Ejercicios

15:34 Posted by Inazio Claver , No comments
1. Definir un tipo profesor con la siguiente estructura


-- Tipo Direccion
create or replace type T_DIRECCION as object(
  calle varchar2(15),
  numero varchar2(20),
  ciudad varchar2(10),
  codigo_postal varchar2(5)
);

-- Tipo Telefono
create or replace type T_TELEFONO as varray(5) of varchar2(9);

-- Tipo Profesor
create or replace type T_PROFESOR as object(
  nombre varchar2(20),
  direccion T_DIRECCION,
  salario number,
  telefono T_TELEFONO
) not final;

2. Definir dos extensiones para el tipo profesor que cumplan las siguientes restricciones:

23/2/16

Acceso a datos. Oracle Database. Sintaxis y ejemplos

19:03 Posted by Inazio Claver , No comments
La sintaxis de Oracle está basada en lenguaje SQL, con la puntualización de que permite declarar objetos y almacenarlos como tal, arrays de objetos, etc.


A continuación veremos unos cuantos ejemplos de la sintaxis que emplearemos en esta tecnología:

Tipos de objetos




Métodos



¿Qué sucede? Que hasta ahora, solo hemos estado especificando el esqueleto de estos métodos. Para proramar el código que hará las operaciones deberemos agregar un cuerpo al método, con la sentencia CREATE OR REPLACE TYPE BODY.

12/2/16

Acceso a datos. Oracle Database. Instalación de Oracle Database Express Edition y SQL Developer

1:36 Posted by Inazio Claver , No comments
Oracle Database es un sistema de gestión de base de datos de tipo objeto-relacional desarrollado por Oracla (el nombre ya daba una pista, ¿verdad?).

Se considera como uno de los sistemas de bases de datos más completos, destacando su soporte de transacciones, estabilidad, escalabilidad y soporte multiplataforma, por no hablar de un precio absurda y escandalosamente caro según que herramientas contrates, pero bueno.

En esta sección trabajaremos con Oracle Database Express Edition y su entorno de desarrollo gráfico Oracle SQL Developer.

Instalación y primer arranque

Lo primero será descargar la versión que deseemos de Oracle Database Express Edition desde la web oficial (http://www.oracle.com/technetwork/database/database-technologies/express-edition/overview/index.html), y Oracle SQL Developer desde http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index-097090.html.

Hecho esto, lanzaremos la instalación de Database, siendo una muy sencilla y donde configuraremos exclusivamente la contraseña para el usuario por defecto (system).


26/1/16

Instalación y configuración de Hibernate en Eclipse

21:10 Posted by Inazio Claver , 29 comments
Hibernate es una herramienta de mapeo objeto – relacional de software libre para la plataforma Java (y para .Net también pero llamándose NHibernate).

Hibernate nos facilita el mapeo de atributos entre una base de datos relacional tradicional, como puede ser una basada en MySQL por ejemplo, y el modelo de objetos de una aplicación, mediante archivos XML o anotaciones en los beans de las entidades que permiten establecer estas relaciones.

Es decir, busca solucionar el problema de la diferencia entre los dos modelos de datos que coexisten en una aplicación: El que usa la memoria del ordenador, que estará orientado a objetos, y el usado en las bases de datos, modelo relacional.
Se “monta” una capa intermedia que permite manipular la información de la base de datos operando sobre objetos, con todas las características que tiene la programación orientada a objetos.

Convertirá los datos en tipos utilizados por Java y definidos por SQL, generará las sentencias SQL liberando al desarrollador de su manejo manual y mantendrá la portabilidad entre todos los motores de bases de datos, eso sí, con el coste de incrementar (ligeramente) el tiempo de ejecución.

11/1/16

Acceso a datos. Aplicaciones web servidor. PHP (Ejercicio)

1:11 Posted by Inazio , 1 comment
En la sección de PHP hemos visto poquísimo. Básicamente, un ejercicio para realizar consultar basadas en la interfaz PDO para conexión con bases de datos.

Os lo pongo a continuación:

Sobre un proyecto nuevo PHP (PracticaPDO), realiza las siguientes tareas:

  • Lanza el script practicaPDO.sql
  • Crea el siguiente script conexion.php:

<?php
$servidor = 'localhost';
$bd = 'practicapdo';
$usuario = 'root';
$contrasenia = '';
?>
  • Agrega el siguiente script index.php que permita crear el siguiente menú que lanzará los scripts de los siguientes apartados:

9/12/15

Acceso a datos. Aplicaciones web servidor. JSP. Ejercicios

16:56 Posted by Inazio , No comments
Para realizar los siguientes ejercicios he cargado los siguientes archivos para los JSP:
Bien, empecemos.

1. Realiza una página JSP que permita imprimir por pantalla el navegador que está utilizando el cliente, la dirección IP y nombre del servidor donde se ejecuta el script, el servidor Web instalado así como la dirección IP del cliente. Ejemplo:


Acceso a datos. Aplicaciones web servidor. JSP. Ejemplos (II)

16:42 Posted by Inazio , No comments

Includes

Archivo ejemplo18.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
       <head>
             <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
             <title>Insert title here</title>
       </head>
       <body>
             <table border="0" width="400" cellspacing="0" cellpadding="0">
                    <tr>
                           <td height="150" width="150"> &nbsp; </td> <td width="250"> &nbsp; </td>
                    </tr>
                    <tr>
                           <td width="250"> &nbsp; </td>
                           <td align="right" width="350">
                                  <img src="merlin.gif">
                           </td>
                    </tr>
             </table> <br>
       </body>
</html>

22/11/15

Acceso a datos. Aplicaciones web servidor. JSP. Ejemplos

20:48 Posted by Inazio , No comments

Hola mundo

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
       <head>
             <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
             <title>Insert title here</title>
       </head>
       <body>
             <% out.println("Hola Mundo"); %>
       </body>
</html>

Acceso a datos. Configurando Eclipse para JSP

2:42 Posted by Inazio , No comments
Antes de realizar cualquier configuración deberemos tener instalado (o es recomendable tenerlo, para poder probar nuestros programas) un servidor Tomcat de Apache. Podemos descargarlo desde http://tomcat.apache.org/. Yo he bajado la versión 7, pese a que actualmente van por la 9, por motivos de compatibilidad.

A la hora de descargar deberemos elegir el paquete que mejor se adapte a nuestro equipo, en mi caso el de la imagen siguiente:



Acceso a datos. Aplicaciones web servidor. JSP

1:51 Posted by Inazio , No comments

¿Qué es una JSP?

Las JavaServer Pages (JSP) nos permiten separar la parte dinámica de nuestras páginas web del código estático.

Para ello simplemente escribimos el HTML (o XML) regular de la forma normal, usando cualquier herramienta de construcción de págnas Web y encerramos el código de las partes dinámicas en unas etiquetas especiales, la mayoría de las cuales empiezan con “<%” y terminan con “%>”.

Funcionamiento

<html>
       <head>
             <title>Ejemplo Hola Mundo JSP</title>
       </head>
       <body>
             <% out.println("Hola mundo"); %>
       </body>
</html>

Funcionamiento

3/11/15

Acceso a datos. Introducción a los JavaBeans

19:42 Posted by Inazio , 1 comment
En la industria electrónica como en otras industrias se está acostumbrando a utilizar componentes para construir placas, tarjetas, etc. En el campo del software la idea es la misma. Se puede crear un interfaz de usuario en un programa Java en base a componentes: paneles, botones, etiquetas, caja de listas, barras de desplazamiento, diálogos, menús, etc.

Si se ha utilizado Delphi o Visual Basic, ya estamos familizarizados con la idea de componente, aunque el lenguaje de programación sea diferente.
Existen componentes que van desde los más simples como un botón hasta otros mucho más complejos como un calendario, una hoja de cálculo, etc.

Los primeros componentes que tuvieron gran éxito fueron los VBX (Visual Basic Extension), seguidos a continuación por los componentes OCX (OLE Custom Controls). Ahora bien, la principal ventaja de los JavaBeans es que son independientes de la plataforma.

Muchos componentes son visibles cuando se corre la aplicación, pero no tienen porqué serlo, solamente tienen que ser visibles en el momento de diseño, para que puedan ser manipulados por el Entorno de Desarrollo de Aplicaciones (IDE).

Podemos crear una aplicación en un IDE, seleccionando los componentes visibles e invisibles en una paleta de herramientas y situarlas sobre un panel o una ventana. Con el ratón unimos los sucesos (events) que genera un objeto (fuente), con los objetos (listeners) interesados en responder a las acciones sobre dicho objeto. Por ejemplo, al mover el dedo en una barra de desplazamiento (fuente de sucesos) con el ratón, se cambia el texto (el número que indica la posición del dedo) en un control de edición (objeto interesado en los sucesos generados por la barra de desplazamiento).

Definición de JavaBean

Un JavaBean o vean es un componente hecho en software que se puede reutilizar y que puede ser manipulado visualmente por una herramienta de programación en lenguaje Java. Ejemplos de JavaBeans son, por ejemplo, las librerías gráficas AWT.

Para ello, se define un interfaz para el momento de diseño (design time) que permite a la herramienta de programación o IDE, interrogar (query) al componente y conocer las propiedades (properties) que define y los tipos de sucesos (events) que puede generar en respuesta a diversas acciones.

Aunque los beans individuales pueden variar ampliamenete en funcionalidad desde los más simples a los mas complejos, todos ellos comparten las siguientes características:
  • Introspection. Permite analizar a la herramienta de programación o IDE como trabaja el bean.
  • Customization. El programador puede alterar la apariencia y la conducta del bean.
  • Events. Los beans se comunican con otros beans utilizando los eventos.
  • Properties. Permite cambiar los valres de las propiedades del bean para personalizarlo (customization).
  • Persistence. Se puede guardar el estado de los beans que han sido personalizados por el programador, cambiando los valores de sus propiedades.

En general, un bean es una clase que obedece ciertas reglas:
  • Un bean tiene que tener un constructor por defecto (sin argumentos).
  • Un bean tiene que tener persistencia, es decir, implementar el interface Serializable.
  • Un bean tiene que tener instrospección (introspection). Los IDE reconocen ciertas pautas de diseño, nombres de las funciones miembros o métodos y definiciones de las clases, que permiten a la herramienta de programación mirar dentro del bean y conocer sus propiedades y su conducta.

Propiedades

Una propiedad es un atributo del JavaBean que afecta a su apariencia o a su conducta. Por ejemplo, un boton puede tener las siguientes propiedades: el tamaño, la posición, el título, el color de fondo, el color del texto, si está o no habilitado, etc.

Las propiedades de un bean pueden examinarse y modificarse mediante métodos o funciones miembro, que acceden a dicha propiedad, y pueden ser de dos tipos:
  • getter method: Lee el valor de la propiedad
  • setter methon: Cambia el valor de la propiedad

Un IDE que cumpla con las especificaciones de los JavaBeans sabe como analizar un bean y conocer sus propiedades. Además, crea una representación visual para cada uno de los tipos de propiedades, denominadas editor de propiedades, para que el programador pueda modificarlas fácilmente en el momento del diseño.

Cuando un programador coge un bean de la paleta de componentes y lo deposita en un panel, el IDE muestra el bean sobre el panel. Cuando seleccionamos el bean aparece una hoja de propiedades, que es una lista de las propiedades del bean, con sus editores asociados para cada una de ellas.

El IDE llama a los métodos o funciones miembro que empiezan por get, para mostrar en los editores los valores de las propiedades. Si el programador cambia el valor de una propiedad se llama a un método cuyo nombre empieza por set, para actualizar el valor de dicha propiedad y que puede o no afectar al aspecto visual del bean en el momento del diseño.

Las especificaciones JavaBeans definen un conjunto de convenciones (design patterns) que el IDE usa para inferir qué métodos corresponden a propiedades.

public void setNombrePropiedad(TipoPropiedad valor)
public TipoPropiedad getNombrePropiedad()

Cuando el IDE carga un bean, usa el mecanismo denominado reflection para examinar todos los métodos, fijándose en aquellos que empiezan por set y get. El IDE añade las propiedades que encuentra a la hoja de propiedades para que el programador personalice el bean.

Propiedades simples

Una propiedad simple representa un único valor.

// miembro de la clase que se usa para guardar el valor de la propiedad
private String nombre;
// métodos set y get de la propiedad denominada Nombre
public void setNombre(String nuevoNombre){
       nombre = nuevoNombre;
}
public String getNombre(){
       return nombre;
}

En el caso de que dicha propiedad sea booleana se escribe

// miembro de la clase que se usa para guardar el valor de la propiedad
private boolean conectado = false;
// métodos set y get de la propiedad denominada Conectado
public void setNombre(Boolean nuevoValor){
       conectado = nuevoValor;
}
public String isConectado(){
       return conectado;
}

Propiedades indexadas

Una propiedad indexada representa un array de valores.

// miembro de la calse que se usa para guardar el valor de la propiedad
private int[] numeros = {1, 2, 3, 4};
// métodos set y get de la propiedad denominada Numeros, para el array completo
public void setNumeros(int[] nuevoValor){
       numeros = nuevoValor;
}
public int[] getNumeros(){
       return numeros;
}
// métodos get y set para un elemento de array
public void setNumeros(int indice, int nuevoValor){
       numeros[indice] = nuevoValor;
}
public int getNumeros(int indice){
       return numeros[indice];
}

Propiedades ligadas (bound)

Los objetos de una clase que tiene una propiedad ligada notifican a otros objetos (listeners) interesados, cuando el valor de dicha propiedad cambia, permitiendo a estos objetos realizar alguna acción. Cuando la propiedad cambia, se crea un objeto (event) que contiene información acerca de la propiedad (su nombre, el valor previo y el nuevo valor), y lo pasa a los otros objetos (listeners) interesados en el cambio.

Propiedades restringidas (constrained)

Una propiedad restringida es similar a un propiedad ligada salvo que los objetos (listeners) a los que se les notifica el cambio de valor de la propiedad tienen la opción de vetar (veto) cualquier cambio en el valor de dicha propiedad. (Este tipo de propiedad no se estudiará en este tema).

Ventajas

  • Reutilización de software
  • Disminución de la complejidad del software
  • Mejoras en el mantenimiento
  • Incremento de la calidad del software

Eventos


1/11/15

24/10/15

Acceso a datos. JDBC (V). Uso del ResultSet

20:03 Posted by Inazio , , No comments
El ResultSet es el objeto que representa el resultado de una consulta.
No carga toda la información en memoria, y se pueden usar para actualizar, borrar e insertar nuevas filas.

Características

Al crear un Statement, un PreparedStatement o un CallableStatement, se pueden configurar aspectos del ResultSet que devolverá al ejecutar la consulta.

createStatement(int resultSetType, int resultSetConcurrency);

prepareStatement(String SQL, int resultSetType, int resultSetConcurrency);

prepareCall(String sql, int resultSetType, int resultSetConcurrency);

resultSetType
  • ResultSet.TYPE_FORWARD_ONLY. Sólo movimiento hacia delante (por defecto).
  • ResultSet.TYPE_SCROLL_INSENSITIVE. Puede hacer cualquier movimiento pero no refleja los cambios en la base de datos.
  • ResultSet.TYPE_SCROLL_SENSITIVE. Puede hacer cualquier movimiento y además refleja los cambios en la base de datos.


resultSetConcurrency
  • ResultSet.CONCUR_READ_ONLY. Sólo lectura (por defecto).
  •  ResultSet.CONCUR_UPDATABLE. Actualizable.


Actualización de datos

rs.updateString("campo", "valor");
rs.updateInt(1, 3);
rs.updateRow();

Inserción de datos

rs.moveToInsertRow();
rs.updateString(1, "AINSWORTH");
rs.updateInt(2, 35);
rs.updateBoolean(3, true);
rs.insertRow();
rs.moveToCurrentRow();

La última línea, por cierto, mueve el cursor a la posición anterior al movimiento de inserción.

Posicionamiento del cursor

El cursor puede estar en una fila concreta, pero también puede estar en dos filas especiales.
  • Antes de la primera fila (Before the First Row, BFR)
  • Después de la última fila (After the Last Row, ALR)

Inicialmente el ResultSet está en BFR, y next() mueve el cursor hacía delante, devolviendo true si se encuentra en una fila concreta y false si alcanza el ALR.

while (rs.next()){
     String name = rs.getString("titulo");
     float price = rs.getFloat("precio");
     System.out.println(name + "\t" + price);
}


Acceso a datos. JDBC (III). Conexiones y sentencias SQL

15:46 Posted by Inazio , , No comments

Conexiones a una base de datos


Cada objeto Connection representa una conexión física con la base de datos.
Se pueden especificar más propiedades además del usuario y la contraseña al crear una conexión.
Estas propiedades se pueden especificar:
  • Codificadas en la URL (ver detalles de la base de datos)
  •  Usando métodos getConnection(…) sobrecargardos de la clase DriverManager.

Ejemplo 1
String url = "jdbc:mysql://localhost:3306/sample";
String name = "root";
String password = "pass";
Connection c = DriverManager.getConnection(url, user, password);

Ejemplo 2
String url = "jdbc:mysql://localhost:3306/sample?user=root&password=pass";
Connection c = DriverManager.getConnection(url);

Ejemplo 3
String url = "jdbc:mysql://localhot:3306/sample";
Properties prop = new Properties();
prop.setProperty("user", "root");
prop.setProperty("password", "pass");
Connection c = DriverManager.getConnection(url, prop);

Sentencias SQL

Con JDBC se pueden usar diferentes tipos de Statement.

Statement.
SQL estático en tiempo de ejecución, no acepta parámetros
Statement stmt = conn.createStatement();

PreparedStatement
Para ejecutar la misma sentencia muchas veces la “prepara”. Acepta parámetros
PreparedStatement ps = conn.prepareStatement(...);

CallableStatement
Llamadas a procedimientos almacenados.

CallableStatement s = conn.prepareCall(...);

Uso de Statement

Tiene diferentes métodos para ejecutar una sentencia.
  •  executeQuery(…). Seusa para sentencias SELECT. Devuelve un ResultSet
  • executeUpdate(…). Se usa para sentencias INSERT, UPDATE, DELETE o sentencias DDL. Devuelve el número de filas afectadas por la sentencia.
  • execute(…). Método genérico de ejecución de consultas. Puede devolver uno o más ResultSet y uno o más contadores de filas afectadas.

Uso de PreparedStatement

Los PreparedStatement se utilizan:
  • Cuando se requieren parámetros.
  • Cuando se ejecuta muchas veces la misma sentencia.
    •  La sentencia se prepara al crear el objeto.
    • Puede llamarse varias veces a los métodos execute.

PreparedStatement ps = conn.preparedStatement("INSERT INTO Libros VALUES (?, ?, ?)");
ps.setInt(1, 23);
ps.setString(2, "Bambi");
ps.setInt(3, 45);
ps.executeUpdate();

Uso de CallableStatement

Permite hacer llamadas a los procedimientos almacenados de la base de datos.
Permite parámetros de entrada IN (como el PreparedStatement), parámetros de entrada – salida INOUT y parámetros de salida OUT.

CallableStatement cstmt = conn.prepareCall("{call getEmpName (?, ?)}");
cstmt.setInt(1, 111111111);
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
cstmt.execute();

String empName = cstmt.getString(2);

Acceso a datos .JDBC (II). Diseño de una aplicación con BD

0:19 Posted by Inazio , , No comments
Se sigue el patrón DAO (Data Access Object).

Cuando se desarrolla una aplicación con BD los detalles de la comunicación con la base de datos se implementan en una clase o módulo.

La información se gestiona como objetos definidos en una clase de Java (clase Libro, Autor…), y el sistema de persistencia (BD, XML, fichero de texto, servicio web…) se puede cambiar fácilmente.

Se pueden distribuir responsabilidades entre los integrantes del equipo de desarrollo.

Por ejemplo, vamos a implementar una sencilla aplicación Java que permita gestionar libros y autores en una base de datos.

Solo soportará listado de libros, siendo estos de todos los libros, por título o por su precio. Además, al listar los libros deberán mostrarse los autores.


Las clases a implementar deberían ser las siguientes:

Acceso a datos. JDBC (I). Introducción

0:01 Posted by Inazio , , No comments
JDBC es un interfaz orientado a objetos de Java para SQL.
Se utiliza para enviar sentencias SQL a un sistema gestor de bases de datos (DBMS).
Con JDBC tenemos que continuar escribiendo las sentencias SQL, y ni le añade ni quita potencia al SQL.

Arquitectura JDBC

La filosofía de JDBC es proporcionar transparencia al desarrollador frente al gestor de bases de datos.

JDBC utiliza un Gestor de Controladores que hace de interfaz con el controlador específico de la BD.


JDBC en MySQL

Hay que añadir la librería mysql-connector-java-x.x.x-bin.jar a nuestro proyecto.
Por ejemplo, si compilamos desde línea de comandos, añadimos el fichero a la variable del sistema CLASSPATH, y si usamos Eclipse, vamos a Project à Properties à Java Build Path à Libraries à Add External JARs…

El driver es com.mysql.jdbc.Driver y la URL para conectar a la BD es jdbc:mysql://localhost:3306/simple

Introducción a JDBC

JDBC (Java DataBase Connectivity) es la API estándar de acceso a base de datos desde Java.
Está incluida en Java SE (Standard Edition). En Java SE 6 se incluye JDBC 4.0, pero actualmente la mayoría de bases de datos soportan JDBC 3.0.

Si se desa más información se puede visitar los siguientes enlaces

Para conectarse a una base de datos concreta, es necesario su driver JDBC.
El driver es un fichero JAR que se añade a la aplicación como cualquier otra librería (no necesita instalación adicional), y la mayoría de las bases de datos incorporan un driver JDBC.

ODBC (Open DataBase Connectivity) es un estándar de acceso a base de datos desarrollado por Microsoft. Sun ha desarrollado un driver que hace de puente entre JDBC y ODBC aunque no suele usarse.

Los pasos para que una aplicación se comunique con una base de datos son:
  • Cargar el driver necesario para comprender el protocolo que usa la base de datos concreta.
  • Establecer una conexión con la base de datos, normalmente a través de red.
  • Enviar consultas SQL y procesar el resultado
  • Liberar los recursos al terminar
  • Manejar los errores que se puedan producir

Veamos el siguiente código

import java.sql.*;

public class HolaMundoBaseDatos {

     public static void main(String[] args) throws ClassNotFoundException, SQLException {
         
          Class.forName("com.mysql.jdbc.Driver");
          Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample", "root", "password");
         
          Statement stmt = conn.createStatement();
          ResultSet rs = stmt.executeQuery("SELECT titulo, precio FROM Libros WHERE precio > 2");
         
          while(rs.next()){
                String name = rs.getString("titulo");
                float price = rs.getFloat("precio");
                System.out.println(name + "\t" + price);
          }
         
          rs.close();
          stmt.close();
          conn.close();
     }
}

Veamos que hace este código línea por línea:

Carga del driver

Class.forName("com.mysql.jdbc.Driver");

Antes de poder conectarse a la base de datos es necesario cargar el driver JDBC, y solo hay que hacerlo una única vez al comienzo de la aplicación.
El nombre del driver debe venir especificado en la documentación de la base de datos.

Se puede elevar la excepción ClassNotFoundException si hay un error en el nombre del driver o si el fichero .jar no está correcamente en el CLASSPATH o en el proyecto.

Establecer una conexión

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample", "root", "password");

Las bases de datos actúan como servidores y las aplicaciones como clientes que se comunican a través de la red.

Un objeto Connection representa una conexión física entre el cliente y el servidor. Para crear una conexión se usa la clase DriverManager, especificando la URL, el nombre y la contraseña de nuestra base de datos.

El formato de la URL debe especificarse en el manual de la base de datos. En el ejemplo es una muestra de como conectar a MySQL. Por supuesto, el nombre de usuario y la contraseña también dependen de la base de datos.

Ejecutar una sentencia SQL

Statement stmt = conn.createStatement();
          ResultSet rs = stmt.executeQuery("SELECT titulo, precio FROM Libros WHERE precio > 2");

Una vez que tienes una conexión puedes ejecutar sentencias SQL.
Primero se crea el objeto Statement desde la conexión, y posteriormente se ejecuta la consulta y su resultado se devuelve como un ResultSet.

Acceso al conjunto de resultados

while(rs.next()){
String name = rs.getString("titulo");
float price = rs.getFloat("precio");
     System.out.println(name + "\t" + price);
}

El ResultSet es el objeto que representa el resultado.
No carga toda la información en memoria, internamente tiene un cursor en memoria que apunta a una fila concreta del resultado en la base de datos, por lo que hay que posicionar el cursor en cada fila y obtener toda la información de la misma.

El cursor puede estar en una fila concreta, y también puede estar en dos filas especiales:
  • Antes de la primera fila (Before de First Row, BFR)
  • Después de la última fila (After the Last Row, ALR)

Inicialmente el ResultSet está en BFR. next() mueve el cursor hacía delante, devolviendo true si se encuentra en una fila concreta y false si alcanza el ALR.


Cuando el ResultSet se encuentra en una fila concreta se pueden usar los métodos de acceso a las columnas
  •  String getString(String columnLabel)
  • String getString(int columnIndex)
  • int getInt(String columnLabel)
  • int getInt(int columnIndex)
  •  … (existen dos métodos por cada tipo)

Teniendo en cuenta que los índices empiezan en 1 y no en 0.

Liberar recursos

rs.close();
stmt.close();
conn.close();

Cuando se termina de usar una Connection, un Statement o un ResultSet es necesario liberar los recursos que necesitan.

Puesto que la información de un ResultSet no se carga en memoria, existen conexiones de red abiertas.

Métodos close():
  • ResultSet.close() – Libera los recursos del ResultSet. Se cierran automáticamente al cerrar el Statement que lo creó o al reejecutar el Statement.
  • Statement.close() – Libera los recursos del Statement.
  • Connection.close() – Finaliza la conexión con la base de datos.


Manejar los errores

throws ClassNotFoundException, SQLException

Hay que gestionar los errores apropiadamente, ya que se pueden producir excepciones ClassNotFoundException si no se encuentra el driver, o excepciones SQLException al interactuar con la base de datos. Por ejemplo:
  • SQL mal formado
  • Conexión de red rota
  • Problemas de integridad al insertar datos (claves duplicadas)

Lo que hacemos con la sintaxis anterior es dejar que el error lo gestionen en un nivel superior, pero si lo queremos controlar nosotros mismos, la sentencia del código quedaría tal que así:

import java.sql.*;

public class HolaMundoBaseDatos {

     public static void main(String[] args) {
         
          try{
                Class.forName("com.mysql.jdbc.Driver");
          }
          catch(ClassNotFoundException e){
                System.err.println("El driver no se encuentra");
                System.exit(-1);
          }
         
          Connection conn = null;
         
          try{
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample", "root", "password");
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT titulo, precio FROM Libros WHERE precio > 2");
               
                while(rs.next()){
                     String name = rs.getString("titulo");
                     float price = rs.getFloat("precio");
                     System.out.println(name + "\t" + price);
                }
               
                rs.close();
                stmt.close();
          }
          catch(SQLException e){
                System.err.println("Error en la base de datos" + e.getMessage());
                e.printStackTrace();
          }
          finally{
                if (conn != null){
                     try{
                          conn.close();
                     }
                     catch(SQLException e){
                          System.err.println("Error al cerrar la conexión" + e.getMessage());
                     }
                }
          }
     }
}