SlideShare una empresa de Scribd logo
1 de 48
Descargar para leer sin conexión
Bases deBases de DatosDatos usandousando
Java : JDBCJava : JDBC
Ing. César Julio Bustacara Medina
Java permite conectarse a bases de datos usando
SQL-92 (Structured Query Language).
La gran ventaja de esta utilidad es que una BD.
puede migrarse y aún ser vista con el mismo
programa Java.
Usualmente, una aplicación con acceso a BD. se
programa en un lenguaje propietario y sobre un
sistema manejador de BD propietario.
JDBCJDBC
La API Java para el manejo de Bases de Datos es
JDBC (¿Java DataBase Connectivity?).
Este modelo no es una derivación de ODBC (Open
DataBase Connectivity)
JDBC está escrito en Java
ODBC está escrito en C
En esencia, la idea es la misma: un programa
dialoga con el JDBC driver manager quien a su vez
se comunica con un controlador particular.
JDBCJDBC
JDBC es una interface hacia SQL, el lenguaje
común de todas las BD relacionales modernas.
Las BD de escritorio cuentan con GUIs para
manipular directamente los datos pero las BD
servidor se controlan a través de SQL.
Para conectarse a una BD se debe especificar el
nombre de la BD y algunos parámetros adicionales.
JDBCJDBC
Capas JDBCCapas JDBC
• Capa Aplicación (Application Layer)
– Conjunto de clases (API) usadas para
hacer llamados a la base de datos a
través de SQL, obtener y procesar los
resultados.
• Capa Manejador (Driver Layer)
– Conjunto de clases (API) que se encargan
de establecer, manejar y terminar la
comunicación con un RDBMS
(Implementación especifica de un driver)
Capas JDBCCapas JDBC
Driver Layer
Application Layer
Tipo de DriversTipo de Drivers
• JDBC-ODBC Bridge (1)
– Las llamadas JDBC son enviadas a una librería ODBC.
• Librería Nativa (2)
– Usa librerías nativas en C (Propias del RDBMS), para
trasladar instrucciones JDBC al cliente nativo.
• Protocolo de red.(3)
– Las llamadas JDBC son trasladadas a un protocolo
independiente de RDBMS y enviadas a un servidor intermedio
(AppServer) sobre un socket TCP/IP
• Protocolo/Librería Nativa 100% java (4)
– Las llamadas JDBC son convertidas directamente al
protocolo del RDBMS
Tipo de DriversTipo de Drivers
• JDBC-ODBC Bridge (1)
– Las llamadas JDBC son enviadas a una librería ODBC.
Tipo de DriversTipo de Drivers
• Librería Nativa (2)
– Usa librerías nativas en C (Propias del RDBMS), para
trasladar instrucciones JDBC al cliente nativo del
RBDMS.
Tipo de DriversTipo de Drivers
• Protocolo de red.(3)
– Las llamadas JDBC son trasladadas a un protocolo
independiente de RDBMS y enviadas a un servidor
intermedio (AppServer) sobre un socket TCP/IP
Tipo de DriversTipo de Drivers
• Protocolo/Librería Nativa 100% java (4)
– Las llamadas JDBC son convertidas directamente al
protocolo del RDBMS
Modelo Two-TierModelo Two-Tier
Cliente/ServidorCliente/Servidor
B.D.
Aplicación
Cliente
Aplicación
Cliente
Firewall
Drivers JDBCDrivers JDBC
• JDBC/OCI
• Oracle thin
• Servidor de drivers JDBC
Drivers JDBCDrivers JDBC
ocioci :
Intranets y para servidores middle-tier.
Extranets, es necesario tener instalado
el firewall.
Convierte sus llamados directamente en
Net8.
Funciona sobre varios protocolos
Modelo usando OCIModelo usando OCI
B.D.
Aplicación
Java
Aplicación
Java
Net8
Firewall
Driver
JDBC/OCI
Driver
JDBC/OCI
Net8
Drivers JDBCDrivers JDBC
ThinThin :
• Funciona para internet
• No “requiere” driver en el cliente
• Es 100% Java
• Funciona solamente sobre TCP/IP
• No ofrece completa funcionalidad con
Net8
Modelo thinModelo thin
B.D.
Aplicación
Java
Aplicación
Java
Net8
Firewall
Driver
thin
Driver
thin
Net8
Net8
Instalar el DriverInstalar el Driver
• Para nuestro caso bajar la librería
classes12.zipclasses12.zip si se esta usando oracle
8.1.5 o superior, de lo contrario usar
la librería classes111.zipclasses111.zip ubicadas en
la página
http://technet.oracle.com/softwarehttp://technet.oracle.com/software
Instalar el DriverInstalar el Driver
• Coloquela en el directorio que desee y
adicionelo al classpath
pathclasses12.zippathclasses12.zip
• Sugerencia: colocarlo en:
...jdk1.3jrelibextclasses12.zip...jdk1.3jrelibextclasses12.zip
• adicione el directorio al classpath
VerificaciónVerificación
import java.sql.*;
public class DriverLoader{
public static void main (String arg[]){
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
}
catch(Exception e){
e.printStackTrace();
}
}
}
VerificaciónVerificación
• Si hay error se despliega el mensaje
Class oracle.jdbc.driver.OracleDriver not found in type declaration
DriverManager.registerDriver(new oracle.jdbc.driver.oracleDriver());
^
Usando el metodo forName de la clase
(java.lang).
•Cargar y registrar el driver a memoria.
– Class.forName(“ clase java del driver”)
Ejemplos:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”
);//Odbc -tipo 1
Class.forName(“oracle.jdbc.driver.OracleDriv
er”); //Oracle - Tipo 4
OtraOtra forma de registrarforma de registrar elel
driverdriver
Capa AplicaciónCapa Aplicación
• Clases/Interfaces que permiten interactuar con
el RDBMS a través de instrucciones SQL (Select,
DDL, DML):
–– ConnectionConnection
–– StatementStatement
–– PreparedStatementPreparedStatement
–– CallableStatementCallableStatement
–– ResultSetResultSet
–– ResultMetaDataResultMetaData
• Se agrupan bajo el paquete java.sql.*
Capa AplicaciónCapa Aplicación
• Connection
– Representa una sesión con la conexión a la base de datos
– La función principal de connection, es crear objetos tipo
Statement (Statement,PreparedStatement,
CallableStatement)
– Cómo se crea:
• Connection conn=DriverManager.getConnection ( url );
• Connection conn=DriverManager.getConnection ( url,
user,
password );
– Características transaccionales:
• conn.setAutocommit(false/true);
• conn.rollback();
• conn.commit();
Capa AplicaciónCapa Aplicación
• Statement
– Es el canal a través del cual se le envían instrucciones SQL a
la base de datos y se reciben los resultados.
– Las instrucciones SQL puede ser instrucciones DML (Insert,
Update, Delete), DDL (Create, Drop) o instrucciones SELECT.
– Como se crea:
– Statement stmt= conn.createStatement();
– Sobre una conexión se pueden tener n objetos Statement.
– Métodos de ejecución:
• Ejecución de instrucciones SELECT
– ResultSet resultadoSelect =
stmt.executeQuery(sql);
• Ejecución de instrucciones DML/DDL
– int resultadoDML = stmt.executeUpdate(sql);
Capa AplicaciónCapa Aplicación
• PreparedStatement (Hereda de Statement)
– Se usa cuando se llama “n” veces la misma
instrucción.
– Permite el manejo de parámetros dinámicos
– Ventajas técnicas sobre Statement:
• Si se tiene Statement la instrucción SQL es compilada cada
vez que se usa.
• Con PreparedStatement solo compila una vez.
– Como se crea:
• PreparedStatement stmt= conn.prepareStatement(sql);
– Ejemplo:
• sql = “SELECT * FROM productos WHERE id=? And fecha=?”
• PreparedStatement stmt= conn.prepareStatement(sql);
Capa AplicaciónCapa Aplicación (PreparedStatement)(PreparedStatement)
• (continuación ejemplo)
• sql = “SELECT * FROM productos WHERE id=? And fecha=?”
– Parámetro 1 : id
– Parámetro 2 : fecha
• Como se pasan los parámetros
– stmt.setInt(1,“10”); //Si quisiéramos el producto 10
– stmt.setDate(2,“03/09/2001”) //Los productos creados hoy.
• Otros tipo de datos (setXXX)
Metodo Tipo dato SQL
setBoolean Bit
setDate Date
setDouble Double
setFloat Float
setString String,Varchar
Capa AplicaciónCapa Aplicación
• CallableStatemet (Hereda de Statement)
– Es usada para ejecutar StoredProcedure.
– Proporciona métodos para mapear los parámetros
de salida del Stored Procedure
– Como se crea:
• CallableStatement cs = conn.prepareCall("{call
<StoredProc>}");
– Donde <StoredProc>, es el nombre del StoredProcedure
• Métodos para mapear los parámetros
– cs.registerOutParameter (indiceParametro, tipodato);
• Ej.: cs.registerOutParameter( 1, java.sql.Date);
Capa AplicaciónCapa Aplicación
• ResultSet
– Tiene el mismo comportamiento de un cursor
– Define los métodos, que permiten acceder al
cursor generado como resultado de la ejecución de
un SELECT.
– El puntero esta ubicado antes de la primera fila.
– Para moverse entre filas se emplea
ResultSet.next()
– Para obtener una columna especifica de la fila, se
puede hacer invocando el método
ResultSet.getXXX (xxx indica el tipo de datos)
Capa AplicaciónCapa Aplicación
• ResultSet (Continuación)
– Ejemplo:
• String sql=“select * from productos”
• Statement stmt_ = conn.createStatemet();
• ResultSet resultado_ = stmt_.executeQuery(sql);
• while(resultado_.next()){
• System.out.println(“ id producto--> ”+resultado_.getInt(“id”));
• System.out.println(“ producto--> ”+resultado_.getString(“nombre”));
• }
– Tipo de metodos getXXX
Metodo Tipo dato SQL
getBoolean Bit
getDate Date
getDouble Double
getFloat Float
getString String,Varchar
Capa AplicaciónCapa Aplicación
• ResultSetMetaData
– Contiene información acerca de las propiedades de cada una
de las columnas, que conforman el cursor/tabla, que fue
obtenida en la ejecución de una consulta.
– Como se crea:
• ResultSetMetaData rsmd = ResultSet.getMetaData();
• Ejemplo (Tomando como base el slide anterior):
– ResultSet resultado = stmt.executeQuery(sql);
– ResultSetMetaData metaData_ = resultado.getMetaData();
– Numero de Columnas: int cols = metadata.getColumnCount();
– Tipo Columna : String tipo = metadata.getColumnType(“id”);
– Saber si un campo es auto incremento:
• boolean esAutoIncremento = metadata.isAutoIncrement();
El driver manager intentará encontrar un driver
cargado que pueda usar el protocolo especificado en
la URL.
Mediante la instancia de Connection (conexión)
obtenida a través de getConnection se pueden
ejecutar expresiones SQL.
ConexiónConexión a la B.D. con JDBCa la B.D. con JDBC
String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”
String usuario = “miNombre”;
String password = “miClave”;
ConnectionConnection conexión =
DriverManagerDriverManager.getConnectiongetConnection(url,usuario,password);
ConexiónConexión a la Base dea la Base de DatosDatos
import java.sql.*;
public class forNameLoader{
public static void main (String arg[]){
String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”
String usuario = “miNombre”;
String password = “miClave”;
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
try{
Connection con = DriverManager.getConnection(url,usuario,password);
if (con!=null)
System.out.println("Driver cargado");
else
System.out.println("Driver No cargado");
}
catch(Exception e){System.out.println("Error en la conexion a la BD"); }
}
catch(Exception e){e.printStackTrace();}
}
}
ConexiónConexión
• Los tres métodos de conexión son:
public static synchronized Connection getConnectiongetConnection(String url)
throws SQLException
public static synchronized Connection getConnectiongetConnection(String url,
String user, String password) throws SQLException
public static synchronized Connection getConnectiongetConnection(String url,
Properties info) throws SQLException
Operaciones sobre la baseOperaciones sobre la base
de Datosde Datos
Statement declaracion =
conexion.createStatement();
Statement st = con.createStatement();
//
// operaciones con st
//
st.close();
import java.sql.*;
public class forNameLoader{
public static void main (String arg[]){
String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”
String usuario = “miNombre”;
String password = “miClave”;
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
try{
Connection con = DriverManager.getConnection(url,usuario,password);
if (con!=null){
Statement st = con.createStatement();
//
// operaciones con st
//
st.close();
}
else
System.out.println("Driver No cargado");
}
catch(Exception e){System.out.println("Error en la conexion a la BD"); }
}
catch(Exception e){e.printStackTrace();}
}
}
import java.sql.*;
public class forNameLoader{
public static void main (String arg[]){
String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”
String usuario = “miNombre”;
String password = “miClave”;
String query = “CREATE TABLE Paciente “ +
“(id Number(9) NOT NULL PRIMARY KEY, ” +
“nombre VarChar(50), apellido VarChar(50))”;
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
try{
Connection con = DriverManager.getConnection(url,usuario,password);
if (con!=null){
Statement st = con.createStatement();
int x = st.executeUpdate(query);
System.out.println(“Tabla de pacientes creada”)
st.close();
}
else
System.out.println("Driver No cargado");
}
catch(Exception e){System.out.println("Error en la conexion a la BD"); }
}
catch(Exception e){e.printStackTrace();}
}
}
EjemploEjemplo executeUpdateexecuteUpdate
import java.sql.*;
public class forNameLoader{
public static void main (String arg[]){
String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”
String usuario = “miNombre”;
String password = “miClave”;
String query = SELECT * FROM Pacientes”;
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
try{
Connection con = DriverManager.getConnection(url,usuario,password);
if (con!=null){
Statement st = con.createStatement();
ResulSet y = st.executeQuery(query);
while(y.next()){
// Lo que quieran con los datos
}
y.close();
st.close();
}
else
System.out.println("Driver No cargado");
}
catch(Exception e){System.out.println("Error en la conexion a la BD"); }
}
catch(Exception e){e.printStackTrace();}
}
}
EjemploEjemplo executeQueryexecuteQuery
En resumen, suponiendo que queremos revisar los
datos de la tabla ’Temp' usamos:
...
Statement sentencia = con.createStatement();
ResultSet vista = sentencia.executeQuery(“SELECT * FROM Temp”);
while (vista.next()) {
// Revisar el segundo campo de cada registro
String unregistro = vista.getString(2);
int unregistro = vista.getInt(“nombre_de_campo_numerico”);
}
Los métodos que permiten inspeccionar el
‘ResultSet’ aceptan el número del campo, contados
a partir de uno, o el nombre del campo.
JDBCJDBC
Java intentará realizar las conversiones de
tipos SQL a tipos Java de la forma más
“razonable” posible.
La correspondencia entre tipos SQL comunes
y los tipos de Java se ilustran en las siguientes
tablas:
JDBCJDBC
JDBCJDBC
•Tipos de datos numéricos
Java SQL Notas
byte TINYINT 8 bits
int INTEGER o INT 32 bits
short SMALLINT 16 bits
long BIGINT 64 bits
double DOUBLE 15 digitos de precisión
double FLOAT 15 digitos de precisión
float REAL 7 digitos de precisión
java.math.BigDecimal NUMERIC Números de precisión específica
java.math.BigDecimal DECIMAL Números de precisión específica
JDBCJDBC
•Tipos de datos caracter
Java SQL Notas
String CHAR o CHARACTER Cadena rellenada con espacios
String VARCHAR Cadena
String LONGVARCHAR Se puede leer usando un flujo de
entrada
byte[] BINARY La longitud del arreglo es la del campo
byte[] VARBINARY La longitud del arreglo es la del campo
byte[] LONGVARBINARY Se puede leer usando un flujo de
entrada
JDBCJDBC
Otros tipos de datos
Java SQL Notas
boolean BIT true/false
java.sql.Data DATE mm / dd / aa
java.sql.Time TIME hh / mm / ss
java.sql.TimeStamp TIMESTAMP Fecha y hora en
nanosegundos
JDBCJDBC
• Modelo de uso
Connection conexión = null;
Statement declaración = null;
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
conexión = DriverManager.getConnection(“jdbc:odbc:NombreBD”,
“idUsuario”, “contraseña”);
declaración = conexión.createStatement();
ResultSet resultado = declaración.executeQuery(“instrucción SQL”);
while (resultado.next()) {
int campoEntero = resultado.getInt(“NombreCampoEntero”);
int campoReal = resultado.getString(“NombreCampoReal”);
System.out.println(campoEntero + “ “ + campoReal);
}
}
catch (ClassNotFoundException e) {
System.err.println(“Controlador no encontrado”);
}
catch (SQLException e) {
System.err.println(“Falla en la Base de Datos”);
}
JDBCJDBC
• Usando excepciones
// ExcepcionesEnJDBC Parte 1/2
import java.sql.*;
public class ExcepcionesEnJDBC {
public static void main(String argv[]) {
Connection conexión = null;
Statement declaración = null;
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}
catch(ClassNotFoundException e) {
System.err.println(“Error: controlador no encontrado.”);
System.exit(1);
}
try {
conexión = DriverManager.getConnection(“jdbc:odbc:NombreBD”,
“idUsuario”, “contraseña”);
}
catch (SQLException e) {
System.err.println(“Error: falla en conexión a la base de datos.”);
System.exit(2);
}
JDBCJDBC
// ExcepcionesEnJDBC Parte 2/2
try {
declaración = conexión.createStatement();
}
catch (SQLException e) {
System.err.println(“Error: imposible crear la declaración.”);
System.exit(3);
}
try {
ResultSet resultado = declaración.executeQuery(“instrucción SELECT-SQL”);
while (resultado.next()) {
int campoEntero = resultado.getInt(“NombreCampoEntero”);
int campoReal = resultado.getString(“NombreCampoReal”);
System.out.println(campoEntero + “ “ + campoReal);
}
}
catch(SQLException e) {
System.err.println(“Error: en lectura de la Base de Datos”);
}
}
}
JDBCJDBC
Declaraciones preparadas.
Una declaración preparada es una consulta
especial en la que se mantiene la estructura y se
cambia solamente el dato que se requiera.
SELECT * FROM NombreTabla WHERE campo=variable
SELECT * FROM NombreTabla WHERE campo=?
Connection conexión = null;
Statement declaración = null;
...
PreparedStatement declaraciónPreparada = conexión.prepareStatement(
“SELECT * FROM NombreTabla WHERE campo=?”);
declaraciónPreparada.setString(n, “valorCampo”);
...
ResultSet resultado = declaraciónPreparada.executeQuery();
RecursosRecursos
– Sitio oficial JDBC
• java.sun.com/jdbc
– Buscar drivers.
• http://industry.java.sun.com/products/jdbc/drivers
– Tutorial JDBC
• http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/Gettin
gStartedTOC.fm.html
– Otros sitios de interes
• www.theserverside.com
• www.jdance.com
• www.jguru.com

Más contenido relacionado

La actualidad más candente (20)

Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones Java
 
Curso Básico de JDBC
Curso Básico de JDBCCurso Básico de JDBC
Curso Básico de JDBC
 
Jdbc
JdbcJdbc
Jdbc
 
JDBC
JDBCJDBC
JDBC
 
Lpiii tema5 - jdbc
Lpiii tema5 - jdbcLpiii tema5 - jdbc
Lpiii tema5 - jdbc
 
Breve introducción a Apache Ant
Breve introducción a Apache AntBreve introducción a Apache Ant
Breve introducción a Apache Ant
 
Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
Java y Bases Datos
Java y Bases DatosJava y Bases Datos
Java y Bases Datos
 
Java.sql.*
Java.sql.*Java.sql.*
Java.sql.*
 
Hibernate 3.2 short manual
Hibernate 3.2 short manualHibernate 3.2 short manual
Hibernate 3.2 short manual
 
Java persitence api
Java persitence apiJava persitence api
Java persitence api
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Bases de Datos en en www.fiec.espol.edu.ec
Bases de Datos en  en www.fiec.espol.edu.ecBases de Datos en  en www.fiec.espol.edu.ec
Bases de Datos en en www.fiec.espol.edu.ec
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - Serialización
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
 
Hibernate - JPA @luce 5
Hibernate - JPA @luce 5Hibernate - JPA @luce 5
Hibernate - JPA @luce 5
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
POOABD (POO Aplicada a B Datos) - API JDBC - Parte 2
POOABD (POO Aplicada a B Datos) - API JDBC - Parte 2POOABD (POO Aplicada a B Datos) - API JDBC - Parte 2
POOABD (POO Aplicada a B Datos) - API JDBC - Parte 2
 

Similar a Jdbc (20)

Conexion bd en java y api necesaria
Conexion bd en java y api necesariaConexion bd en java y api necesaria
Conexion bd en java y api necesaria
 
Jyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datosJyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datos
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
 
S8-BDD
S8-BDDS8-BDD
S8-BDD
 
Jdbc
JdbcJdbc
Jdbc
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
Aprendiendo SQL 2
Aprendiendo SQL 2 Aprendiendo SQL 2
Aprendiendo SQL 2
 
JDBC(conjunto de clases e interfaces)
JDBC(conjunto de clases e interfaces)JDBC(conjunto de clases e interfaces)
JDBC(conjunto de clases e interfaces)
 
SEMINARIO: ACCESO A BASE DE DATOS CON JDBC
SEMINARIO: ACCESO A BASE DE DATOS CON JDBCSEMINARIO: ACCESO A BASE DE DATOS CON JDBC
SEMINARIO: ACCESO A BASE DE DATOS CON JDBC
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
Ado.net
Ado.netAdo.net
Ado.net
 
Acceso a datos con JAVA
Acceso a datos con JAVAAcceso a datos con JAVA
Acceso a datos con JAVA
 
Statement
StatementStatement
Statement
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
Jdbc Mysql
Jdbc MysqlJdbc Mysql
Jdbc Mysql
 

Jdbc

  • 1. Bases deBases de DatosDatos usandousando Java : JDBCJava : JDBC Ing. César Julio Bustacara Medina
  • 2. Java permite conectarse a bases de datos usando SQL-92 (Structured Query Language). La gran ventaja de esta utilidad es que una BD. puede migrarse y aún ser vista con el mismo programa Java. Usualmente, una aplicación con acceso a BD. se programa en un lenguaje propietario y sobre un sistema manejador de BD propietario. JDBCJDBC
  • 3. La API Java para el manejo de Bases de Datos es JDBC (¿Java DataBase Connectivity?). Este modelo no es una derivación de ODBC (Open DataBase Connectivity) JDBC está escrito en Java ODBC está escrito en C En esencia, la idea es la misma: un programa dialoga con el JDBC driver manager quien a su vez se comunica con un controlador particular. JDBCJDBC
  • 4. JDBC es una interface hacia SQL, el lenguaje común de todas las BD relacionales modernas. Las BD de escritorio cuentan con GUIs para manipular directamente los datos pero las BD servidor se controlan a través de SQL. Para conectarse a una BD se debe especificar el nombre de la BD y algunos parámetros adicionales. JDBCJDBC
  • 5. Capas JDBCCapas JDBC • Capa Aplicación (Application Layer) – Conjunto de clases (API) usadas para hacer llamados a la base de datos a través de SQL, obtener y procesar los resultados. • Capa Manejador (Driver Layer) – Conjunto de clases (API) que se encargan de establecer, manejar y terminar la comunicación con un RDBMS (Implementación especifica de un driver)
  • 6. Capas JDBCCapas JDBC Driver Layer Application Layer
  • 7. Tipo de DriversTipo de Drivers • JDBC-ODBC Bridge (1) – Las llamadas JDBC son enviadas a una librería ODBC. • Librería Nativa (2) – Usa librerías nativas en C (Propias del RDBMS), para trasladar instrucciones JDBC al cliente nativo. • Protocolo de red.(3) – Las llamadas JDBC son trasladadas a un protocolo independiente de RDBMS y enviadas a un servidor intermedio (AppServer) sobre un socket TCP/IP • Protocolo/Librería Nativa 100% java (4) – Las llamadas JDBC son convertidas directamente al protocolo del RDBMS
  • 8. Tipo de DriversTipo de Drivers • JDBC-ODBC Bridge (1) – Las llamadas JDBC son enviadas a una librería ODBC.
  • 9. Tipo de DriversTipo de Drivers • Librería Nativa (2) – Usa librerías nativas en C (Propias del RDBMS), para trasladar instrucciones JDBC al cliente nativo del RBDMS.
  • 10. Tipo de DriversTipo de Drivers • Protocolo de red.(3) – Las llamadas JDBC son trasladadas a un protocolo independiente de RDBMS y enviadas a un servidor intermedio (AppServer) sobre un socket TCP/IP
  • 11. Tipo de DriversTipo de Drivers • Protocolo/Librería Nativa 100% java (4) – Las llamadas JDBC son convertidas directamente al protocolo del RDBMS
  • 13. Drivers JDBCDrivers JDBC • JDBC/OCI • Oracle thin • Servidor de drivers JDBC
  • 14. Drivers JDBCDrivers JDBC ocioci : Intranets y para servidores middle-tier. Extranets, es necesario tener instalado el firewall. Convierte sus llamados directamente en Net8. Funciona sobre varios protocolos
  • 15. Modelo usando OCIModelo usando OCI B.D. Aplicación Java Aplicación Java Net8 Firewall Driver JDBC/OCI Driver JDBC/OCI Net8
  • 16. Drivers JDBCDrivers JDBC ThinThin : • Funciona para internet • No “requiere” driver en el cliente • Es 100% Java • Funciona solamente sobre TCP/IP • No ofrece completa funcionalidad con Net8
  • 18. Instalar el DriverInstalar el Driver • Para nuestro caso bajar la librería classes12.zipclasses12.zip si se esta usando oracle 8.1.5 o superior, de lo contrario usar la librería classes111.zipclasses111.zip ubicadas en la página http://technet.oracle.com/softwarehttp://technet.oracle.com/software
  • 19. Instalar el DriverInstalar el Driver • Coloquela en el directorio que desee y adicionelo al classpath pathclasses12.zippathclasses12.zip • Sugerencia: colocarlo en: ...jdk1.3jrelibextclasses12.zip...jdk1.3jrelibextclasses12.zip • adicione el directorio al classpath
  • 20. VerificaciónVerificación import java.sql.*; public class DriverLoader{ public static void main (String arg[]){ try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); } catch(Exception e){ e.printStackTrace(); } } }
  • 21. VerificaciónVerificación • Si hay error se despliega el mensaje Class oracle.jdbc.driver.OracleDriver not found in type declaration DriverManager.registerDriver(new oracle.jdbc.driver.oracleDriver()); ^
  • 22. Usando el metodo forName de la clase (java.lang). •Cargar y registrar el driver a memoria. – Class.forName(“ clase java del driver”) Ejemplos: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver” );//Odbc -tipo 1 Class.forName(“oracle.jdbc.driver.OracleDriv er”); //Oracle - Tipo 4 OtraOtra forma de registrarforma de registrar elel driverdriver
  • 23. Capa AplicaciónCapa Aplicación • Clases/Interfaces que permiten interactuar con el RDBMS a través de instrucciones SQL (Select, DDL, DML): –– ConnectionConnection –– StatementStatement –– PreparedStatementPreparedStatement –– CallableStatementCallableStatement –– ResultSetResultSet –– ResultMetaDataResultMetaData • Se agrupan bajo el paquete java.sql.*
  • 24. Capa AplicaciónCapa Aplicación • Connection – Representa una sesión con la conexión a la base de datos – La función principal de connection, es crear objetos tipo Statement (Statement,PreparedStatement, CallableStatement) – Cómo se crea: • Connection conn=DriverManager.getConnection ( url ); • Connection conn=DriverManager.getConnection ( url, user, password ); – Características transaccionales: • conn.setAutocommit(false/true); • conn.rollback(); • conn.commit();
  • 25. Capa AplicaciónCapa Aplicación • Statement – Es el canal a través del cual se le envían instrucciones SQL a la base de datos y se reciben los resultados. – Las instrucciones SQL puede ser instrucciones DML (Insert, Update, Delete), DDL (Create, Drop) o instrucciones SELECT. – Como se crea: – Statement stmt= conn.createStatement(); – Sobre una conexión se pueden tener n objetos Statement. – Métodos de ejecución: • Ejecución de instrucciones SELECT – ResultSet resultadoSelect = stmt.executeQuery(sql); • Ejecución de instrucciones DML/DDL – int resultadoDML = stmt.executeUpdate(sql);
  • 26. Capa AplicaciónCapa Aplicación • PreparedStatement (Hereda de Statement) – Se usa cuando se llama “n” veces la misma instrucción. – Permite el manejo de parámetros dinámicos – Ventajas técnicas sobre Statement: • Si se tiene Statement la instrucción SQL es compilada cada vez que se usa. • Con PreparedStatement solo compila una vez. – Como se crea: • PreparedStatement stmt= conn.prepareStatement(sql); – Ejemplo: • sql = “SELECT * FROM productos WHERE id=? And fecha=?” • PreparedStatement stmt= conn.prepareStatement(sql);
  • 27. Capa AplicaciónCapa Aplicación (PreparedStatement)(PreparedStatement) • (continuación ejemplo) • sql = “SELECT * FROM productos WHERE id=? And fecha=?” – Parámetro 1 : id – Parámetro 2 : fecha • Como se pasan los parámetros – stmt.setInt(1,“10”); //Si quisiéramos el producto 10 – stmt.setDate(2,“03/09/2001”) //Los productos creados hoy. • Otros tipo de datos (setXXX) Metodo Tipo dato SQL setBoolean Bit setDate Date setDouble Double setFloat Float setString String,Varchar
  • 28. Capa AplicaciónCapa Aplicación • CallableStatemet (Hereda de Statement) – Es usada para ejecutar StoredProcedure. – Proporciona métodos para mapear los parámetros de salida del Stored Procedure – Como se crea: • CallableStatement cs = conn.prepareCall("{call <StoredProc>}"); – Donde <StoredProc>, es el nombre del StoredProcedure • Métodos para mapear los parámetros – cs.registerOutParameter (indiceParametro, tipodato); • Ej.: cs.registerOutParameter( 1, java.sql.Date);
  • 29. Capa AplicaciónCapa Aplicación • ResultSet – Tiene el mismo comportamiento de un cursor – Define los métodos, que permiten acceder al cursor generado como resultado de la ejecución de un SELECT. – El puntero esta ubicado antes de la primera fila. – Para moverse entre filas se emplea ResultSet.next() – Para obtener una columna especifica de la fila, se puede hacer invocando el método ResultSet.getXXX (xxx indica el tipo de datos)
  • 30. Capa AplicaciónCapa Aplicación • ResultSet (Continuación) – Ejemplo: • String sql=“select * from productos” • Statement stmt_ = conn.createStatemet(); • ResultSet resultado_ = stmt_.executeQuery(sql); • while(resultado_.next()){ • System.out.println(“ id producto--> ”+resultado_.getInt(“id”)); • System.out.println(“ producto--> ”+resultado_.getString(“nombre”)); • } – Tipo de metodos getXXX Metodo Tipo dato SQL getBoolean Bit getDate Date getDouble Double getFloat Float getString String,Varchar
  • 31. Capa AplicaciónCapa Aplicación • ResultSetMetaData – Contiene información acerca de las propiedades de cada una de las columnas, que conforman el cursor/tabla, que fue obtenida en la ejecución de una consulta. – Como se crea: • ResultSetMetaData rsmd = ResultSet.getMetaData(); • Ejemplo (Tomando como base el slide anterior): – ResultSet resultado = stmt.executeQuery(sql); – ResultSetMetaData metaData_ = resultado.getMetaData(); – Numero de Columnas: int cols = metadata.getColumnCount(); – Tipo Columna : String tipo = metadata.getColumnType(“id”); – Saber si un campo es auto incremento: • boolean esAutoIncremento = metadata.isAutoIncrement();
  • 32. El driver manager intentará encontrar un driver cargado que pueda usar el protocolo especificado en la URL. Mediante la instancia de Connection (conexión) obtenida a través de getConnection se pueden ejecutar expresiones SQL. ConexiónConexión a la B.D. con JDBCa la B.D. con JDBC String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO” String usuario = “miNombre”; String password = “miClave”; ConnectionConnection conexión = DriverManagerDriverManager.getConnectiongetConnection(url,usuario,password);
  • 33. ConexiónConexión a la Base dea la Base de DatosDatos import java.sql.*; public class forNameLoader{ public static void main (String arg[]){ String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO” String usuario = “miNombre”; String password = “miClave”; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null) System.out.println("Driver cargado"); else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } }
  • 34. ConexiónConexión • Los tres métodos de conexión son: public static synchronized Connection getConnectiongetConnection(String url) throws SQLException public static synchronized Connection getConnectiongetConnection(String url, String user, String password) throws SQLException public static synchronized Connection getConnectiongetConnection(String url, Properties info) throws SQLException
  • 35. Operaciones sobre la baseOperaciones sobre la base de Datosde Datos Statement declaracion = conexion.createStatement(); Statement st = con.createStatement(); // // operaciones con st // st.close();
  • 36. import java.sql.*; public class forNameLoader{ public static void main (String arg[]){ String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO” String usuario = “miNombre”; String password = “miClave”; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null){ Statement st = con.createStatement(); // // operaciones con st // st.close(); } else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } }
  • 37. import java.sql.*; public class forNameLoader{ public static void main (String arg[]){ String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO” String usuario = “miNombre”; String password = “miClave”; String query = “CREATE TABLE Paciente “ + “(id Number(9) NOT NULL PRIMARY KEY, ” + “nombre VarChar(50), apellido VarChar(50))”; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null){ Statement st = con.createStatement(); int x = st.executeUpdate(query); System.out.println(“Tabla de pacientes creada”) st.close(); } else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } } EjemploEjemplo executeUpdateexecuteUpdate
  • 38. import java.sql.*; public class forNameLoader{ public static void main (String arg[]){ String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO” String usuario = “miNombre”; String password = “miClave”; String query = SELECT * FROM Pacientes”; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null){ Statement st = con.createStatement(); ResulSet y = st.executeQuery(query); while(y.next()){ // Lo que quieran con los datos } y.close(); st.close(); } else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } } EjemploEjemplo executeQueryexecuteQuery
  • 39. En resumen, suponiendo que queremos revisar los datos de la tabla ’Temp' usamos: ... Statement sentencia = con.createStatement(); ResultSet vista = sentencia.executeQuery(“SELECT * FROM Temp”); while (vista.next()) { // Revisar el segundo campo de cada registro String unregistro = vista.getString(2); int unregistro = vista.getInt(“nombre_de_campo_numerico”); } Los métodos que permiten inspeccionar el ‘ResultSet’ aceptan el número del campo, contados a partir de uno, o el nombre del campo. JDBCJDBC
  • 40. Java intentará realizar las conversiones de tipos SQL a tipos Java de la forma más “razonable” posible. La correspondencia entre tipos SQL comunes y los tipos de Java se ilustran en las siguientes tablas: JDBCJDBC
  • 41. JDBCJDBC •Tipos de datos numéricos Java SQL Notas byte TINYINT 8 bits int INTEGER o INT 32 bits short SMALLINT 16 bits long BIGINT 64 bits double DOUBLE 15 digitos de precisión double FLOAT 15 digitos de precisión float REAL 7 digitos de precisión java.math.BigDecimal NUMERIC Números de precisión específica java.math.BigDecimal DECIMAL Números de precisión específica
  • 42. JDBCJDBC •Tipos de datos caracter Java SQL Notas String CHAR o CHARACTER Cadena rellenada con espacios String VARCHAR Cadena String LONGVARCHAR Se puede leer usando un flujo de entrada byte[] BINARY La longitud del arreglo es la del campo byte[] VARBINARY La longitud del arreglo es la del campo byte[] LONGVARBINARY Se puede leer usando un flujo de entrada
  • 43. JDBCJDBC Otros tipos de datos Java SQL Notas boolean BIT true/false java.sql.Data DATE mm / dd / aa java.sql.Time TIME hh / mm / ss java.sql.TimeStamp TIMESTAMP Fecha y hora en nanosegundos
  • 44. JDBCJDBC • Modelo de uso Connection conexión = null; Statement declaración = null; try { Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); conexión = DriverManager.getConnection(“jdbc:odbc:NombreBD”, “idUsuario”, “contraseña”); declaración = conexión.createStatement(); ResultSet resultado = declaración.executeQuery(“instrucción SQL”); while (resultado.next()) { int campoEntero = resultado.getInt(“NombreCampoEntero”); int campoReal = resultado.getString(“NombreCampoReal”); System.out.println(campoEntero + “ “ + campoReal); } } catch (ClassNotFoundException e) { System.err.println(“Controlador no encontrado”); } catch (SQLException e) { System.err.println(“Falla en la Base de Datos”); }
  • 45. JDBCJDBC • Usando excepciones // ExcepcionesEnJDBC Parte 1/2 import java.sql.*; public class ExcepcionesEnJDBC { public static void main(String argv[]) { Connection conexión = null; Statement declaración = null; try { Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); } catch(ClassNotFoundException e) { System.err.println(“Error: controlador no encontrado.”); System.exit(1); } try { conexión = DriverManager.getConnection(“jdbc:odbc:NombreBD”, “idUsuario”, “contraseña”); } catch (SQLException e) { System.err.println(“Error: falla en conexión a la base de datos.”); System.exit(2); }
  • 46. JDBCJDBC // ExcepcionesEnJDBC Parte 2/2 try { declaración = conexión.createStatement(); } catch (SQLException e) { System.err.println(“Error: imposible crear la declaración.”); System.exit(3); } try { ResultSet resultado = declaración.executeQuery(“instrucción SELECT-SQL”); while (resultado.next()) { int campoEntero = resultado.getInt(“NombreCampoEntero”); int campoReal = resultado.getString(“NombreCampoReal”); System.out.println(campoEntero + “ “ + campoReal); } } catch(SQLException e) { System.err.println(“Error: en lectura de la Base de Datos”); } } }
  • 47. JDBCJDBC Declaraciones preparadas. Una declaración preparada es una consulta especial en la que se mantiene la estructura y se cambia solamente el dato que se requiera. SELECT * FROM NombreTabla WHERE campo=variable SELECT * FROM NombreTabla WHERE campo=? Connection conexión = null; Statement declaración = null; ... PreparedStatement declaraciónPreparada = conexión.prepareStatement( “SELECT * FROM NombreTabla WHERE campo=?”); declaraciónPreparada.setString(n, “valorCampo”); ... ResultSet resultado = declaraciónPreparada.executeQuery();
  • 48. RecursosRecursos – Sitio oficial JDBC • java.sun.com/jdbc – Buscar drivers. • http://industry.java.sun.com/products/jdbc/drivers – Tutorial JDBC • http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/Gettin gStartedTOC.fm.html – Otros sitios de interes • www.theserverside.com • www.jdance.com • www.jguru.com