SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
Bases de Datos usando
    Java : JDBC

 Ing. César Julio Bustacara Medina
JDBC

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.
JDBC
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.
JDBC

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.
Capas 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 JDBC
Driver Layer




                 Application Layer
Tipo 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 Drivers
• JDBC-ODBC Bridge (1)
  – Las llamadas JDBC son enviadas a una librería ODBC.
Tipo 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 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 Drivers
• Protocolo/Librería Nativa 100% java (4)
  – Las llamadas JDBC son convertidas directamente al
    protocolo del RDBMS
Modelo Two-Tier
         Cliente/Servidor
                        Aplicación
                         Cliente




Aplicación                  B.D.
 Cliente

             Firewall
Drivers JDBC
• JDBC/OCI

• Oracle thin

• Servidor de drivers JDBC
Drivers JDBC
oci :

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 OCI
                               Aplicación
                                 Java
                               Driver
                               JDBC/OCI
Aplicación
  Java
                        Net8
Driver                             B.D.
JDBC/OCI

             Net8
             Firewall
Drivers JDBC
Thin :

•   Funciona para internet
•   No “requiere” driver en el cliente
•   Es 100% Java
•   Funciona solamente sobre TCP/IP
•   No ofrece completa funcionalidad con
    Net8
Modelo thin
                                Aplicación
                                  Java
                                Driver
                                thin

Aplicación                               Net8
  Java
                         Net8
Driver                             B.D.
thin

              Net8
              Firewall
Instalar el Driver
• Para nuestro caso bajar la librería
  classes12.zip si se esta usando oracle
  8.1.5 o superior, de lo contrario usar
  la librería classes111.zip ubicadas en
  la página
http://technet.oracle.com/software
Instalar el Driver
• Coloquela en el directorio que desee y
  adicionelo al classpath
     pathclasses12.zip

• Sugerencia: colocarlo en:
...jdk1.3jrelibextclasses12.zip
• adicione el directorio al classpath
Verificació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ó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());
                                                    ^
Otra forma de registrar el
           driver
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
Capa Aplicación

• Clases/Interfaces que permiten interactuar con
  el RDBMS a través de instrucciones SQL (Select,
  DDL, DML):
   – Connection
   – Statement
   – PreparedStatement
   – CallableStatement
   – ResultSet
   – ResultMetaData
• Se agrupan bajo el paquete java.sql.*
Capa 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ó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ó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ón                   (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.

                                    Metodo       Tipo dato SQL

                                    setBoolean   Bit

• Otros tipo de datos (setXXX)      setDate      Date

                                    setDouble    Double

                                    setFloat     Float

                                    setString    String,Varchar
Capa 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ó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ó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”));
      •   }


                                                        Metodo          Tipo dato SQL

                                                        getBoolean      Bit
   – Tipo de metodos getXXX
                                                        getDate         Date

                                                        getDouble       Double

                                                        getFloat        Float

                                                        getString       String,Varchar
Capa 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();
Conexión a la B.D. con JDBC
String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”
String usuario = “miNombre”;
String password = “miClave”;

Connection conexión =
      DriverManager.getConnection(url,usuario,password);
      DriverManager getConnection

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ón a la Base de Datos
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ón
• Los tres métodos de conexión son:

public static synchronized Connection getConnection(String url)
  throws SQLException

public static synchronized Connection getConnection(String url,
  String user, String password) throws SQLException



public static synchronized Connection getConnection(String url,
  Properties info) throws SQLException
Operaciones sobre la base
         de 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.*;
                                           Ejemplo           executeUpdate
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();}
    }
}
import java.sql.*;
                                    Ejemplo             executeQuery
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();}
    }
}
JDBC
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.
JDBC

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:
JDBC
•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
JDBC
•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
JDBC
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
JDBC
• 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”);
  }
JDBC
• 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);
    }
JDBC
// 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”);
        }
    }
}
JDBC
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();
Recursos

– 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

Weitere ähnliche Inhalte

Was ist angesagt? (18)

Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Java y Base de Datos
Java y Base de DatosJava y Base de Datos
Java y Base de Datos
 
Breve introducción a Apache Ant
Breve introducción a Apache AntBreve introducción a Apache Ant
Breve introducción a Apache Ant
 
Jdbc
JdbcJdbc
Jdbc
 
JDBC
JDBCJDBC
JDBC
 
Mecanismos de Persistencia en Android
Mecanismos de Persistencia en AndroidMecanismos de Persistencia en Android
Mecanismos de Persistencia en Android
 
JDBC MONOGRAFIA
JDBC MONOGRAFIAJDBC MONOGRAFIA
JDBC MONOGRAFIA
 
Java.sql.*
Java.sql.*Java.sql.*
Java.sql.*
 
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
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
Java y Bases Datos
Java y Bases DatosJava y Bases Datos
Java y Bases Datos
 
Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
5 a bd_servidor
5 a bd_servidor5 a bd_servidor
5 a bd_servidor
 
6/9 Curso JEE5, Soa, Web Services, ESB y XML
6/9 Curso JEE5, Soa, Web Services, ESB y XML6/9 Curso JEE5, Soa, Web Services, ESB y XML
6/9 Curso JEE5, Soa, Web Services, ESB y XML
 
Vistas y Base de Datos - Analisis de Sistemas
Vistas y Base de Datos - Analisis de SistemasVistas y Base de Datos - Analisis de Sistemas
Vistas y Base de Datos - Analisis de Sistemas
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
4/9 Curso JEE5, Soa, Web Services, ESB y XML
4/9 Curso JEE5, Soa, Web Services, ESB y XML4/9 Curso JEE5, Soa, Web Services, ESB y XML
4/9 Curso JEE5, Soa, Web Services, ESB y XML
 

Ähnlich wie Jdbc (20)

Jdbc
JdbcJdbc
Jdbc
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
 
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
 
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
 
JDBC(conjunto de clases e interfaces)
JDBC(conjunto de clases e interfaces)JDBC(conjunto de clases e interfaces)
JDBC(conjunto de clases e interfaces)
 
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
 
S8-BDD
S8-BDDS8-BDD
S8-BDD
 
Charla
CharlaCharla
Charla
 
[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)
 
Arquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EEArquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EE
 
Ado.net
Ado.netAdo.net
Ado.net
 
introduccion-a-las-aplicaciones-web-y-tecnologia-java.ppt
introduccion-a-las-aplicaciones-web-y-tecnologia-java.pptintroduccion-a-las-aplicaciones-web-y-tecnologia-java.ppt
introduccion-a-las-aplicaciones-web-y-tecnologia-java.ppt
 
Jdbc
JdbcJdbc
Jdbc
 
Lpiii tema5 - jdbc
Lpiii tema5 - jdbcLpiii tema5 - jdbc
Lpiii tema5 - jdbc
 
Aprendiendo SQL 2
Aprendiendo SQL 2 Aprendiendo SQL 2
Aprendiendo SQL 2
 
11.android bases de datos
11.android   bases de datos11.android   bases de datos
11.android bases de datos
 
Introducción a Tomcat
Introducción a TomcatIntroducción a Tomcat
Introducción a Tomcat
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 
Jdbc Mysql
Jdbc MysqlJdbc Mysql
Jdbc Mysql
 

Jdbc

  • 1. Bases de Datos usando Java : JDBC Ing. César Julio Bustacara Medina
  • 2. JDBC 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.
  • 3. JDBC 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.
  • 4. JDBC 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.
  • 5. Capas 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 JDBC Driver Layer Application Layer
  • 7. Tipo 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 Drivers • JDBC-ODBC Bridge (1) – Las llamadas JDBC son enviadas a una librería ODBC.
  • 9. Tipo 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 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 Drivers • Protocolo/Librería Nativa 100% java (4) – Las llamadas JDBC son convertidas directamente al protocolo del RDBMS
  • 12. Modelo Two-Tier Cliente/Servidor Aplicación Cliente Aplicación B.D. Cliente Firewall
  • 13. Drivers JDBC • JDBC/OCI • Oracle thin • Servidor de drivers JDBC
  • 14. Drivers JDBC oci : 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 OCI Aplicación Java Driver JDBC/OCI Aplicación Java Net8 Driver B.D. JDBC/OCI Net8 Firewall
  • 16. Drivers JDBC Thin : • Funciona para internet • No “requiere” driver en el cliente • Es 100% Java • Funciona solamente sobre TCP/IP • No ofrece completa funcionalidad con Net8
  • 17. Modelo thin Aplicación Java Driver thin Aplicación Net8 Java Net8 Driver B.D. thin Net8 Firewall
  • 18. Instalar el Driver • Para nuestro caso bajar la librería classes12.zip si se esta usando oracle 8.1.5 o superior, de lo contrario usar la librería classes111.zip ubicadas en la página http://technet.oracle.com/software
  • 19. Instalar el Driver • Coloquela en el directorio que desee y adicionelo al classpath pathclasses12.zip • Sugerencia: colocarlo en: ...jdk1.3jrelibextclasses12.zip • adicione el directorio al classpath
  • 20. Verificació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ó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. Otra forma de registrar el driver 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
  • 23. Capa Aplicación • Clases/Interfaces que permiten interactuar con el RDBMS a través de instrucciones SQL (Select, DDL, DML): – Connection – Statement – PreparedStatement – CallableStatement – ResultSet – ResultMetaData • Se agrupan bajo el paquete java.sql.*
  • 24. Capa 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ó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ó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ón (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. Metodo Tipo dato SQL setBoolean Bit • Otros tipo de datos (setXXX) setDate Date setDouble Double setFloat Float setString String,Varchar
  • 28. Capa 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ó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ó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”)); • } Metodo Tipo dato SQL getBoolean Bit – Tipo de metodos getXXX getDate Date getDouble Double getFloat Float getString String,Varchar
  • 31. Capa 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. Conexión a la B.D. con JDBC String url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO” String usuario = “miNombre”; String password = “miClave”; Connection conexión = DriverManager.getConnection(url,usuario,password); DriverManager getConnection 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.
  • 33. Conexión a la Base de Datos 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ón • Los tres métodos de conexión son: public static synchronized Connection getConnection(String url) throws SQLException public static synchronized Connection getConnection(String url, String user, String password) throws SQLException public static synchronized Connection getConnection(String url, Properties info) throws SQLException
  • 35. Operaciones sobre la base de 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.*; Ejemplo executeUpdate 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();} } }
  • 38. import java.sql.*; Ejemplo executeQuery 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();} } }
  • 39. JDBC 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.
  • 40. JDBC 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:
  • 41. JDBC •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. JDBC •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. JDBC 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. JDBC • 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. JDBC • 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. JDBC // 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. JDBC 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. Recursos – 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