Title: Java DataBase Connectivity JDBC
1Java DataBase Connectivity (JDBC)
2Conceptos Fundamentales JDBC
- API (java.sql)
- Clases y métodos para
- establecer una conexión con una BD
- enviar sentencias SQL a dicha BD
- procesar los resultados
- Los desarrolladores de SGBD proporcionan
drivers JDBC - Código no cambia si cambiamos de SGBD, excepto la
referencia al driver.
3Ejemplo de código JDBC
Connection con DriverManager.getConnection (
jdbcodbcData Base Alpha,
login, password) Statement stmt
con.createStatement() ResultSet rs
stmt.executeQuery(SELECT a,b,c FROM
Table1) while (rs.next()) int x
rs.getInt(a) String s
rs.getString(b) float f
rs.getFloat(c)
4Standard JDBC
- Basado en el X/Open SQLCall Level Interface (CLI)
para interacciones cliente/servidor - Basado en el standard ANSI SQL-92
- Adoptado por la mayoría de los vendedores de SGBD
- Drivers ya escritos para la mayoría de los SGBD
más potentes
5Estructura General JDBC
6Por qué no utilizar ODBC?
- ODBC está escrito en C por lo tanto los programas
escritos en JAVA deberían hacer llamadas a código
en C y esto crea problemas - Traducción directa de ODBC a JDBC es difícil
- Al estar escrito JDBC en JAVA permite su
portabilidad
7Tipos de drivers
- TIPO 1 Puente JDBC-ODBC. El puente se encarga de
traducir las llamadas que se hacen a llamadas
ODBC y de pasarlas al driver ODBC apropiado. - TIPO 2 Native-API. Convierte las llamadas JDBC a
llamadas del API del cliente del SGBD. Requiere
código binario en el cliente.
8Tipos de drivers
- TIPO 3 Network-Protocol. Traduce las funciones
JDBC a un protocolo de comunicaciones
independiente del SGBD, el cual traduce dichas
funciones al API del SGBD específico. - TIPO 4 Native-Protocol. Traducen directamente
las llamadas JDBC al protocolo de red que usa la
BD.
9JDBC-ODBC Bridge
- Puente que permite unir código Java con drivers
ODBC de MsWindows - Necesidad de registrar la BD con ODBC antes de
utilizarla - ODBC utiliza sentencias SQL para manipulación y
consulta
10Clases JDBC
- java.sql.DriverManager permite la carga de
drivers y establecer una conexión - java.sql.Connection representa una conexión con
una BD determinada - java.sql.Statement actua como un contenedor para
una sentencia SQL a ejecutar sobre una conexión - java.sql.ResultSet representa el cursor con el
resultado
11Clases JDBC
- El interface java.sql.Statement tiene dos
sub-tipos importantes - java.sql.PreparedStatement para ejecutar
sentencias SQL precompiladas - java.sql.CallableStatement para ejecutar
procedimientos almacenados
12Clase DriverManager
- Capa de gestión de JDBC
- permite cargar drivers automáticamente (propiedad
del sistema "jdbc.drivers") - Permite establecer una conexión entre un driver y
una BD - Monitoriza una conexión para en aspectos como
timers, mensajes de log, trazas, etc. - Todos sus métodos son (el constructor es private)
13Interface Driver
- Específico para cada DBMS
- acceptsURL(String)
- connect(String url,Properties info)
- getPropertyInfo()
- jdbcCompliant()
- getMajorVersion
- getMinorVersion
14Cargar los Drivers
- Se cargan los drivers que se encuentran
especificados en la propiedad jdbc.drivers) - Explícitamente
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
15Connection Interface
- Establece una conexión entre el programa y la BD
- Se establece invocando al método estático
getConnection(url) de la clase DriverManager - url String jdbcltsubprotocolgtltsubnamegt
- subprotocol normalmente el nombre del driver
- subname puede incluir una conexión de red y un
nombre de archivo
16Establecer una conexión
- Connection con DriverManager.getConnection(url,
"myLogin", "myPassword") - String url "jdbcodbcFred"
- Connection con DriverManager.getConnection(url,
"Fernando", "J8") - URL jdbcltsubprotocolgtltsubnamegt
- subname //hostnameport/subsubname
17Connection Interface
- Usado para crear un nuevo objeto Statement
- con.createStatement()
- Otros métodos de interés
- void close() - libera recursos
- void commit() - commits transacciones
- DataBaseMetaData getMetaData()
- CallableStatement prepareCall(String sql)
- void rollback() - rolls back hasta el anterior
commit o rollback - void setAutoCommit(boolean enable)
18Crear una sentencia
- Statement stmt con.createStatement()
- con.commit()
- con.rollback()
19Statement Class
- Representa un objecto creado con
createStatement() de la clase Connection - Usada para enviar una sentencia SQL simple sin
parametros - PreparedStatement ejecuta sentencias SQL
precompiladas - CallableStatement ejecuta procedimientos
almacenados
20Statement Class Methods
- void close()
- ResultSet executeQuery(String sql)
- int executeUpdate(String sql)
- void setMaxRows(int max)
- void setQueryTimeout(int seconds)
21Crear un ODBC
- Click en Start, Settings, Control Panel
- Click en 32 bit ODBC
- Click en Add y elegir un driver como Microsoft
Access - Escribir un nombre para la fuente de datos (se
usará en el programa Java) y la descripción - Click en Select para seleccionar una BD existente
o bien crear una nueva
22Crear una tabla
import java.net.URL import java.sql. public
class CrearProveedores public static
void main(String args) String
url "jdbcodbcprueba1"
Connection con String
createString Statement stmt
createString "create table PROVEEDORES "
"(PROV_ID int, "
PROV_NAME
varchar(40), "
"STREET varchar(40), "
"CITY varchar(20), "
"STATE char(2), CP char(5))"
23Crear una tabla
//CARGAR EL DRIVER try
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
catch(java.lang.ClassNotFoundException e)
System.err.print("ClassNotFoundException
") System.err.println(e.getMessage())
24Crear una tabla
try con DriverManager.getConnection(ur
l, "myLogin",
"myPassword") stmt con.createStatement
() stmt.executeUpdate(createString)
stmt.close() con.close()
catch(SQLException ex) System.err.println("S
QLException " ex.getMessage())
25Insertar tuplas a una tabla
import java.sql. public class
InsertarProveedores public static void
main(String args) String url
"jdbcodbcprueba1" Connection con
Statement stmt String
query "select PROV_NAME, PROV_ID
from PROVEEDORES"
26Example Populate Table
try Class.forName("sun.jdbc.odbc.JdbcO
dbcDriver") catch(java.lang.ClassNotFoundExce
ption e) System.err.print("ClassNotFoun
dException ") System.err.println(e.getM
essage()) try con
DriverManager.getConnection(url,
"myLogin", "myPassword") stmt
con.createStatement()
27Example Populate Table
stmt.executeUpdate("insert into PROVEEDORES "
"values(49, 'Superior Coffee', '1 Party Place', "
"'Mendocino', 'CA', '95460')") stmt.executeUp
date("insert into PROVEEDORES " "values(101,
'Acme, Inc.', '99 Market Street', "
"'Groundsville', 'CA', '95199')") stmt.executeUp
date("insert into PROVEEDORES " "values(150,
'The High Ground', '100 Coffee Lane', "
"'Meadows', 'CA', '93966')")
28Ejemplo consultar una tabla
ResultSet rs stmt.executeQuery(query) System.
out.println(Proveedores y sus ID") while
(rs.next()) String s
rs.getString(PROV_NAME") int n
rs.getInt(PROV_ID") System.out.println(
s " " n) stmt.close()
con.close() catch(SQLException ex)
System.err.println("SQLException "
ex.getMessage())
29ResultSet Interface
- Preguntas SQL devuelven un cursor
- SELECT a,b,c FROM Table1 gives
12345 Joe Komar 12.50 33333 Tom
Sturm 350.35 55555 Jennifer Page 756.44
30ResultSet Sample Code
ResultSet rs stmt.executeQuery(SELECT a,b,c
FROM Table1) while rs.next() int i
rs.getInt(a) String s rs.getString(2)
//se puede usar numero columna float f
rs.getFloat(c) System.out.println(i
s f)
31ResultSet Interface
- Métodos get para cada tipo de datos primitivo,
y alguno más - Se puede usar Object getObject(int col or String
name) para obtener un tipo desconocido - Object devuelto será un tipo correspondiente a
los tipos de datos Java, según tabla de
conversiones
32JDBC Type Java Type CHAR String VARCHAR Str
ing LONGVARCHAR String NUMERIC java.math.BigDec
imal DECIMAL java.math.BigDecimal BIT boolean
TINYINT byte SMALLINT short INTEGER int BIG
INT long REAL float FLOAT double DOUBLE
double BINARY byte VARBINARY byte LONGVAR
BINARY byte DATE java.sql.Date TIME java.
sql.Time TIMESTAMP java.sql.Timestamp
33ResultSetMetaData Interface
- Objecto creado a partir de un objeto ResultSet
- ResultSet rs stmt.executeQuery()
- ResultSetMetaData rsmd rs.getMetaData()
- Se usa para obtener información sobre los
resultados obtenidos
34ResultSetMetaData Interface
int numCols rsmd.getColumnCount() for (int i
1 i lt numCols i) int jdbcType
rsmdgetColumnType(i) String name
rsmd.getColumnTypeName(i) System.out.println(
Column i is JDBC type jdbcType
, which is JDBC type name)
35ResultSetMetaData Interface
- String getColumnLabel(int col) -- heading
- String getColumnName(int col) -- name
- int getScale(int col) -- decimal places
- String getTableName(int col) -- table name
- boolean isCurrency(int col) -- cash value
- boolean isReadOnly(int col) -- read only
- etc.