Las transacciones en bases de datos deben completarse totalmente o fallar totalmente para mantener la integridad de los datos. JDBC es una API estándar que permite el acceso a bases de datos desde Java. JDBC usa controladores específicos de cada base de datos para realizar las conexiones. Una vez conectado, JDBC devuelve objetos como Statement y ResultSet que permiten ejecutar consultas y procesar los resultados.
1. Transacciones
• Transacción = conjunto de comandos que deben
completarse satisfactoriamente o fallar
conjuntamente
• Si un comando falla, el sistema debe volver atrás
todas las acciones anteriores
• No permite dejar la B.D. en un estado intermedio de
la transacción. O se completa todo, o falla todo.
2. Visión general de JDBC
• API estándar para el acceso a bases de datos
• Similar a ODBC
• API definida desde JDK 1.1
• Controladores disponibles para el acceso a la
mayoría de bases de datos
3. Arquitectura de JDBC
Aplicación JDBC Driver
• El código Java llama a las clases JDBC
• JDBC carga un controlador (driver)
• El controlador conecta con una determinada
base de datos
• Se puede tener mas de un controlador ->
más de una base de datos
• Ideal: se puede acceder a distintas bases de
datos sin cambiar el código de la aplicación
4. Controladores JDBC (Fig.)
Tipo I Driver
ODBC
“Bridge” ODBC
Tipo II
JDBC CLI (.lib)
“Native”
Tipo III Middleware
“Middleware” Server
Tipo IV
“Pure”
6. JDBC URLs
jdbc:subprotocol:source
• Cada controlador tiene su propio
subprotocolo
• Cada subprotocolo tiene su propia sintaxis
para acceder al origen de datos
jdbc:odbc:DataSource
– P.e.. jdbc:odbc:Northwind
jdbc:informix-sqli://host[:port]/database
– P.e. jdbc:informix-sqli://dbserver:2650/dbconta
MYSQL
url= "jdbc:mysql://localhost:3306/cumpleanos";
7. DriverManager
Connection getConnection
(String url, String user,
String password)
• Conecta a una URL JDBC determinada
mediante el usuario y password suministrados
• Lanza java.sql.SQLException
• Devuelve un objeto del tipo Connection
8. import java.sql.*;
import java.sql.Connection;
Obtener una conexión
import java.sql.DriverManager;
public class Conexion
{
private String driver= "com.mysql.jdbc.Driver";
// ojo aqui colocar el path del jdbc correspondiente a la conexion dependiendo de la configuracion del puerto donde corra el JDBC
private String url= "jdbc:mysql://localhost:3306/db_session";
// ojo el login y pass son para entrar al motor de Base de Datos
private String login= "root";
private String password= "admin";
// creamos un metodo de tipo Connection
public Connection getConnection() {
Connection cn= null;
try{
Class.forName(driver).newInstance();//Obtenmos el driver de mysql
cn= DriverManager.getConnection(url, login, password);//Conectamos a nuestra BD
// preparamos a la aplicacion en caso de algun error en la consulta
} catch(SQLException e)
{
System.out.println(e.toString());
cn= null;
// preparamos a la aplicacion en caso de algun error
} catch(Exception e) {
System.out.println(e.toString());
cn= null;
}
return cn;
}
9. Métodos de la clase Conection
Statement createStatement()
– Devuelve un nuevo objeto Statement
PreparedStatement
prepareStatement(String sql)
– Devuelve un nuevo objeto PreparedStatement
CallableStatement prepareCall(String
sql)
– Devuelve un nuevo objeto CallableStatement
• ¿Por qué existen todos estos tipos distintos de
“statements”? Optimización.
10. Statement
• Un objeto “Statement” es utilizado para
ejecutar una sentencia SQL estática y obtener
los resultados producidos por la misma
11. Statement Methods
ResultSet executeQuery(String)
– Ejecuta una sentencia SQL y devuelve un único ResultSet
int executeUpdate(String)
– Ejecuta una sentencia SQL del tipo INSERT, UPDATE o
DELETE. Devuelve el número de registros modificados.
boolean execute(String)
– Ejecuta una sentencia SQL que puede devolver múltiples
resultados
• ¿Por qué todos estos tipos distintos de métodos?
Optimización.
12. ResultSet
• Un ResultSet ofrece acceso a una tabla de datos
generada por la ejecución de un Statement.
• Solamente se puede abrir a la vez un ResultSet por
Statement.
• Los registros de la tabla se obtienen en secuencia
• Un ResultSet mantiene un cursor que apunta al
registro de datos actual.
• El método 'next' mueve el cursor al siguiente
registro.
– No se puede volver hacia atrás
13. Métodos de ResultSet
• boolean next()
– Mueve el cursor al siguiente registro
– La primera llamada a next() selecciona el primer registro
– Devuelve false si no hay más registros
• void close()
– Cierra el objeto ResultSet
– Permite reutilizar el objeto Statement que creó el
ResultSet
– Se llama de forma automática por la mayoría de métodos
de la clase Statement
14. Métodos de ResultSet
• Type getType(int columnIndex)
– Devuelve el campo del tipo especificado (Type)
– Los campos se indexan comenzando por 1 (no por 0)
• Type getType(String columnName)
– Igual que el anterior pero usando el nombre de la columna
como parámetro
– Menos eficiente
• int findColumn(String columnName)
– Devuelve el índice de la columna que se pasa como
parámetro
15. Métodos ResultSet
• String getString(int columnIndex)
• boolean getBoolean(int columnIndex)
• byte getByte(int columnIndex)
• short getShort(int columnIndex)
• int getInt(int columnIndex)
• long getLong(int columnIndex)
• float getFloat(int columnIndex)
• double getDouble(int columnIndex)
• Date getDate(int columnIndex)
• Time getTime(int columnIndex)
• Timestamp getTimestamp(int columnIndex)
16. Métodos ResultSet
• String getString(String columnName)
• boolean getBoolean(String columnName)
• byte getByte(String columnName)
• short getShort(String columnName)
• int getInt(String columnName)
• long getLong(String columnName)
• float getFloat(String columnName)
• double getDouble(String columnName)
• Date getDate(String columnName)
• Time getTime(String columnName)
• Timestamp getTimestamp(String columnName)