SlideShare uma empresa Scribd logo
1 de 79
Acceso a base de datos con Java
 desde aplicaciones web con la
       tecnología JDBC
Bases de Datos en aplicaciones
• Aplicación que procese información 
  base de datos.
• Normalmente se utilizan bases de datos
  relacionales.
• SQL: Lenguaje estándar para acceder a una
  base datos.


                                              2
Acceder a una base de datos
       desde una aplicación
• Cómo puede enviar una aplicación sentencias SQL
  a una BD.
• Interfaz procedural para ejecutar sentencias SQL.
• X/Open CLI (ISO 9075-3 “Call level interface”).
• ODBC es variante de Microsoft del X/Open CLI
  (implementada en lenguaje C).
• La filosofía de estas APIs es que permitan acceder
  de la misma forma a distintas BD.

                                                   3
JDBC
• Es un interfaz orientado a objetos de Java
  para SQL.
• Se utiliza para enviar sentencias SQL a un
  sistema gestor de BD (DBMS).
• Con JDBC tenemos que continuar
  escribiendo las sentencias SQL.
• No añade ni quita potencia al SQL.

                                               4
Arquitectura JDBC
• La filosofía de JDBC es proporcionar transparencia al
  desarrollador frente al gestor de BD.
• JDBC utiliza un Gestor de Controladores que hace de
  interfaz con el controlador específico de la BD.

                   Aplicación Java
               Driver Manager de JDBC
     Controlador      Controlador    Controlador
       Oracle        JDBC-ODBC          DB2

  SGBD                                             SGBD
  Oracle BD         Access BD              BD      DB2    5
Clases e interfaces JDBC
• La especificación JDBC incluye 8 interfaces y 10
  clases, en el paquete estándar java.sql.
• Podemos dividirlos en los siguientes grupos:
   – Nucleo de JDBC, interfaces y clases que todos los
     controladores deben implementar.
   – Extensiones al paquete java.lang, extensiones para
     SQL.
   – Extensiones al paquete java.util, son extensiones a
     java.util.Date.
   – Metadatos para SQL, permiten examinar
     dinámicamente las propiedades de BD y controladores.
                                                            6
Núcleo de JDBC
•   Estos interfaces se utilizarán el 90% de las veces que trabajemos con
    una BD.


      <<Interface>>       <<Interface>>     <<Interface>>       <<Interface>>
          Driver           Connection        Statement            Result Set




                                            <<Interface>>       <<Int erface>>
     DriverManager
                                          PreparedStatement   Res ult SetMet aData




                                           <<Interface>>
    DriverPropertyInfo
                                          CallableStatement

                                                                                     7
Invocar una consulta SQL
• Vamos a estudiar un escenario en el que
  realizaremos una consulta sobre una BD con
  JDBC.
• Mediante el seguimiento de un diagrama de
  secuencia veremos las clases en funcionamiento.
• Cliente, representa a la aplicación Java donde
  implementamos la consulta.
• Un buen ejercicio sería ir escribiendo el programa
  a la vez que vamos viendo cada una de las fases.

                                                       8
Configuración de la conexión
     con base de datos
• Antes de conectar con la base de datos
  y trabajar con ella debemos tener en
  cuenta dos cuestiones:
  – Registrar un controlador.
  – Convenciones de nombres para la base de
    datos.



                                              9
Carga de un controlador (I)
• Determinados controladores requerirán la
  instalación y configuración de software
  específico en el cliente. Ejemplo: el origen
  ODBC o la fuente de datos nativa.
• Otros controladores son simplemente una
  clase Java y bastará que la máquina virtual
  de Java las pueda localizar mediante el
  classpath.
                                                 10
Carga de un controlador (y II)
• Dos alternativas:
  – Utilizar una propiedad del sistema
    (jdbc.drivers).
  – Cargar la clase de forma explícita con la
    llamada Class.forName().
     • La propia clase llamará al método registerDriver()
       de la clase DriverManager, que dejará registrado el
       controlador para utilizarlo posteriormente.
     • Consultar que los controladores registrados con
       DriverManager.getDrivers().
                                                             11
Código fuente de carga del
     controlador de la BD
try
  {
 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  }
  catch (ClassNotFoundException e)
  {
    System.out.println("Error en la carga del
driver JDBC");
    return;
  }


                                              12
C lie n te                                       :
                                     D r iv e r M a n a g e r            :
                                                                C o n n e c tio n

             g e tC o n n e c tio n ( )




                Conexión a la BD




                                                                                                 13
                                                                                    Obtener conexión BD
Abrir una conexión
• Previamente habremos registrado el controlador.
• DriverManager.getConnection(url).
• El parámetro imprescindible es la url de la base de
  datos; para especificar la base de datos que
  queremos utilizar.
• También se puede especificar el usuario y la clave
  con los que nos queremos conectar a la base de
  datos.

                                                   14
Nombres para las BD en JDBC
• En JDBC las bases de datos se designan mediante
  una URL.
• La forma de la url es la siguiente:
      jdbc:<subprotocolo>:<dominio>
• Subprotocolo: identifica el mecanismo de
  conexión o el controlador JDBC concreto.
• Dominio: Depende del subprotocolo, puede ser
  simplemente un nombre simple para la base de
  datos o una serie de parámetros que permiten
  encontrar la BD.
                                                 15
Código fuente de conexión
try
{                                        url de la BD
  Connection con=
  DriverManager.getConnection("jdbc:odbc:Biblio",
      "","");
      "","");
}
                           Usuario, clase de la BD
catch (SQLException e)
{
  System.out.println(e);
}


                                                    16
El objeto Connection
• Si no se producen excepciones el método
  getConnection nos devuelve un objeto que
  implementa la interfaz Connection.
• Podemos crear varias conexiones con distintas
  bases de datos o incluso con la misma.
• Cada conexión representa una sesión con la BD.
• El objeto Connection nos permitirá acceder a la
  base de datos para realizar operaciones sobre ella
  y obtener resultados.

                                                       17
C lie n te                                       :
                                     D r iv e r M a n a g e r            :          : S ta te m e n t
                                                                C o n n e c tio n

             g e tC o n n e c tio n ( )


             c re a te S ta te m e n t( )




                                                       Obtener el objeto
                                                       Statement




                                                                                                        18
                                                                                    Crear sentencia de BD
Acceso a los datos
• Utilizamos la conexión con la base de datos creada
  anteriormente para enviar comandos y sentencias
  SQL.
• El objeto conexión funciona como un enlace
  directo con el controlador de la BD.
• Creamos un objeto de la clase Statement que
  servirá de envoltorio para las sentencias SQL.
• Cuando pasamos la SQL a la conexión este lo
  envía al controlador que a su vez lo redirecciona a
  la BD, que nos devolverá los resultados.
                                                   19
Objetos involucrados en el
  acceso a datos (diagrama de colaboración)

               Objeto
              ResultSet   Objeto Driver   Resultados
  Programa                 JDBC BD
    Java
                                                       Base de
                                                        datos

 Objeto        Objeto                     SQL
Statement    Connection



                                                             20
Código fuente de creación de una
     sentencia de consulta
try
{
  // Creamos el objeto sentencia
  Statement stmt= con.createStatement();

  [...]
}
catch (Exception e)
{
  System.out.prinln(e);
}

                                           21
Creación del objeto Statement
• La clase Connection tiene varios métodos que
  permiten crear un objeto Statement o una de sus
  variantes.
• createStatement, para crear sentencias simples.
• prepareStatement, para sentencias que pueden
  contener parámetros, optimiza la utilización
  repetida de estas sentencias.
• prepareCall.

                                                    22
C lie n te                                       :
                                     D r iv e r M a n a g e r                      :          : S ta te m e n t   : R e s u lt S e t
                                                                          C o n n e c tio n

             g e tC o n n e c tio n ( )


             c re a te S ta te m e n t( )



                                                       e x e c u te Q u e r y ( )



                                                        Ejecutar la consulta




                                                                                                                             23
                                                                                                          Ejecutar consulta
Ejecución de la sentencia
• executeQuery(), ejecución de consultas, sentencia
  SELECT.
• executeUpdate(), actualizaciones de valores en al
  base de datos. INSERT, UPDATE, DELETE. Sólo
  devuelve la cuenta de las columnas afectadas.
• execute(), se usa para ejecutar sentencias que no se
  conocen a priori o que devuelven resultados no
  homogéneos.

                                                    24
Código fuente de ejecución de
          una sentencia
try
{
  [...]

  // Ejecutamos una sentencia SQL
  ResultSet rs=
      stmt.executeQuery("SELECT Titulo, ISBN," +
       " Fecha_edicion, Paginas, Precio" +
       " FROM LIBROS" +
       " WHERE Titulo LIKE '%jdbc%'");
}
catch (SQLException e)
...
                                                   25
C lie n te                                       :
                                     D r iv e r M a n a g e r                           :            : S ta te m e n t   : R e s u lt S e t
                                                                               C o n n e c tio n

             g e tC o n n e c tio n ( )


             c re a te S ta te m e n t( )



                                                       e x e c u te Q u e r y ( )             Posicionar el cursor
                                                                                              en la siguiente fila
                                                                 n e x t( )

                                                                g e tIn t( )

                                                          g e tS tr in g ( )

                                                     g e t B ig D e c im a l( )


                                                                                                   Recuperar valores
                                              Repetir mientras                                     de las columnas.
                                              haya filas que
                                              procesar.                              26
                                                              Recuperación valores resultado
Recuperación de datos
• Cuando ejecutamos una consulta debemos
  emplear el método executeQuery(), que devuelve
  un objeto ResultSet, que nos permitirá acceder a
  los resultados.
• El ResultSet utiliza el concepto de cursor de base
  de datos para ir moviéndose por las filas de datos
  recuperadas.
• Las columnas pueden accederse en cualquier
  orden, utilizando su posición o su nombre.
• El objeto ResultSet incluye métodos getXXX que
  permiten recuperar valores de distintos tipos.     27
Código fuente de recuperación de
             datos
...
while (rs.next())
{
   // Se recupera cada columna por separado
  String titulo= rs.getString("Titulo");
   Date fechaEdicion= rs.getDate("Fecha_edicion");
   int pags= rs.getInt("Paginas");
  double precio= rs.getDouble("Precio");

    // Operación que realizamos con cada fila
    System.out.println("Titulo: " + titulo + ", edición:
    " + fechaEdicion);
}

                                                       28
C lie n te                                         :
                                     D r iv e r M a n a g e r                           :            : S ta te m e n t   : R e s u lt S e t
                                                                               C o n n e c tio n

             g e tC o n n e c tio n ( )


             c re a te S ta te m e n t( )



                                                        e x e c u te Q u e r y ( )


                                                                 n e x t( )

                                                                g e tIn t( )

                                                           g e tS tr in g ( )

                                                       g e t B ig D e c im a l( )

                                                        c lo s e ( )

                                    c lo s e ( )
                                                                                              Liberar el objeto
                     Liberar el objeto                                                        Statement               29
                     Connection                                                                             Librerar objetos
Código fuente de liberación de
         recursos de BD
try
{
  [...]

  // Liberamos objeto sentencia
  stmt.close();

  // Liberamos objeto conexión BD
  con.close();
}
catch (SQLException e)
...

                                    30
Resumen proceso consulta
            simple
• Registrar controlador  Class.forName.
• Abrir conexión 
  DriverManager.getConnection.
• Crea sentencia  con.createStatement.
• Ejecuta la sentencia  stmt.executeQuery.
• Procesar resultados  while(rs.next()) ...
• Cerrar sentencia y conexión  close.
Ver Acceso a BD desde servlets                 31
Profundizando en la utilización
              de JDBC
•   Manejo de las excepciones de SQL
•   Utilización de diferentes BD.
•   Ejecución de distintas sentencias SQL.
•   Sentencias preparadas.
•   Conjuntos de resultados.
    – Desplazamiento y actualización por programa.
    – Metadatos.
                                                     32
Manejo de las excepciones de
              SQL
• SQLException
  – Es la principal forma que tiene JDBC de informar de
    errores.
  – Hereda de la clase Exception de java.lang.
  – Proporciona la siguiente información sobre el error:
     • Una cadena describiendo el error a la que se puede acceder
       con el método getMessage().
     • La cadena de error SQLstate de acuerdo con el estándar
       X/Open a la que se puede acceder con el método
       getSQLState().
     • Un código de error entero específico de la BD que se puede
       acceder con getErrorCode().
     • Permite acceder a más errores con getNextException().
                                                                    33
Manejo de los avisos de SQL
• SQLWarning
  – Permite informar de errores leves en distintos objetos
    de la BD: ResultSet, Statement, Connection.
  – Al contrario que SQLException no es obligatorio
    capturar los SQLWarning.
  – Para obtener un SQLWarning se llama al método
    getWarning() sobre el objeto.
  – Para obtener SQLWarning adicionales se llama a
    getNextWarning().
• DataTruncation
  – Informa de avisos de truncado de datos en las lecturas y
    al escribir datos.                                     34
Extensiones JDBC al paquete
              java.lang
•   Amplían envoltorio Number para permitir albergar grandes números.
•   Crean clases Exception especializadas.

                     Number                 Exception




                    BigDecimal            SQLException




                                           SQLWarning




                                          Dat aTruncation

                                                                        35
Utilización de diferentes BD
• JDBC permite utilizar distintas bases de
  datos sin cambiar el código o haciendo
  retoques mínimos.
• Cambios que implica la utilización de una
  BD diferente:
  – controlador,
  – url de la BD.
• Otros posibles cambios.
                                              36
Tipos de controladores
• JDBC es una especificación que establece dos
  tipos de interfaces:
   – Interfaz de aplicación, que permite acceder a una base
     de datos independientemente de su fabricante.
   – Interfaz del controlador, al cual se deben adaptar los
     desarrolladores de controladores.
• Actualmente en el mercado existen gran cantidad
  de controladores que varían en su arquitectura.
  Sun ha clasificado estos controladores en cuatro
  tipos.
   – http://industry.java.sun.com/products/jdbc/drivers
                                                              37
Controlador Tipo 1
• Puente JDBC-ODBC

                                     Servidor

      Cliente
                             DBC Serv.          BD
                     oco lo O   ODBC
                  Prot
 Cliente
         JDBC ODBC
 BD Java
                 Protoc            Serv.        BD
                          olo OD
                                BC ODBC

                                                     38
Controlador Tipo 2
• Controlador utilizando APIs nativas

                                            Servidor

       Cliente
                                   a tivo Serv.        BD
                          oco lo n        nativo
                   Prot
 Cliente       API
         JDBC
 BD Java      nativa



                                                            39
Controlador Tipo 3
• Controlador JDBC-NET Java puro

                                           Servidor

        Cliente                   Serv. Serv.         BD
                                r
                       o estánda JDBC nativo
              Protocol
 Cliente
         JDBC
 BD Java
            Protoc                  Serv. Serv.       BD
                   olo es
                          tá   ndar JDBC nativo

                                                           40
Controlador Tipo 4
• Controlador Java puro y protocolo nativo

                                           Servidor

      Cliente                           Serv.         BD
                          o   n ativo   nativo
                     ocol
 Cliente        Prot
         JDBC
 BD Java



                                                           41
Ejecución de distintas sentencias
             SQL
• Tipos de sentencias SQL:
   – Sentencias de definición de datos: CREATE TABLE,
     CREATE INDEX.
   – Sentencias de manipulación de datos: INSERT,
     UPDATE, DELETE.
   – Sentencias de consulta: SELECT.
• Cada tipo devuelve resultados distintos y
  empleamos distintos métodos stmt.execute().


                                                        42
Sentencias preparadas
• Optimiza rendimiento en las sentencias que
  se ejecutan repetidamente.
• Características:
  – Sentencias en las que no se ponen
    explícitamente determinados valores.
  – La base de datos sólo tiene que interpretar la
    sentencia la primera vez.
  – Optimizan la ejecución.
                                                     43
Código fuente de sentencias
             preparadas
PreparedStatement pstmt= con.prepareStatement(
     "INSERT INTO Autores VALUES (?,?,?,?)");

// Establece valores para cada uno de los parametros
pstmt.setString(1,"Mario");               // Nombre
pstmt.setString(2,"Vargas Llosa");        // Apellidos
pstmt.setString(3,"Peru");                // Lugar nacimiento
pstmt.setInt(4,1953);                     // Anio nacimiento
int insCount= pstmt.executeUpdate();

// Establece valores para cada uno de los parametros
pstmt.setString(1,"Nicholas");            // Nombre
pstmt.setString(2,"Negroponte");          // Apellidos
pstmt.setString(3,"New York");            // Lugar nacimiento
pstmt.setInt(4,1953);                     // Anio nacimiento
int insCount= pstmt.executeUpdate();
                                                            44
Conjunto de resultados
            desplazable
• Recorrido básico del ResultSet: cursor
  hacia delante, de fila en fila y desde la
  primera fila  next().
• Podemos acceder a las filas del ResultSet de
  más formas (JDBC 2.0), como un índice de
  un array.


                                            45
Creación de la sentencia para
      Resultset desplazable
• Cambio en la creación del objeto sentencia:
   – createStatement(int tipoResultSet,
     int concurrenciaResultSet)
   – tipoResultSet es el que permite flexibilidad en el
     desplazamiento.
   – Valores:
      • TYPE_FORWARD_ONLY, sólo hacia delante
      • TYPE_SCROLL_INSENSITIVE,
        TYPE_SCROLL_SENSITIVE, métodos de posicionamiento
        habilitados

                                                          46
Métodos de desplazamiento del
            cursor
• Métodos
  – Movimiento hacia atrás: afterLast(), previous().
  – Posicionamiento absoluto: first(), last(),
    absolute(numFila).
  – Posicionamiento relativo: relative(num).
  – Recupera fila actual: getRow().



                                                   47
Conjunto de resultados
            actualizable
• Para actualizar datos en la BD teníamos que
  recurrir a sentencias SQL: INSERT,
  UPDATE, DELETE.
• Podemos realizar actualizaciones por
  programa (JDBC 2.0).



                                            48
Creación de la sentencia para
      Resultset actualizable
• Cambio en la creación del objeto sentencia:
   – createStatement(int tipoResultSet,
     int concurrenciaResultSet)
   – concurrenciaResultSet es el que permite actualizar
     ResultSet por programa.
   – Valores:
      • CONCUR_READ_ONLY, no se puede actualizar.
      • CONCUR_UPDATABLE, permite la utilización de métodos
        para modificar filas.


                                                          49
Métodos para actualizar filas
• Posicionarse en la fila para actualizar.
• Llamar a los métodos de actualización de
  campos:
  – updateXXX(<campo>,<valor>)
• Para confirmar las actualizaciones sobre la
  tabla llamamos a: updateRow().


                                                50
Insertando y borrando por
             programa
• Métodos para insertar filas sin utilizar SQL:
  – moveToInsertRow(), mueve a fila vacía.
  – updateXXX(<campo>,<valor>) sobre cada
    campo de la nueva fila.
  – insertRow(), confirma inserción.
• Método para borrar filas sin utilizar SQL:
  – Posicionarnos sobre la fila a borrar.
  – deleteRow().

                                               51
Información acerca de la base de
      datos (Metadatos)
• Cuando a priori no tenemos información sobre la
  estructura de la base de datos podemos acceder a
  ella mediante los metadatos.
• Esto permite adaptar el acceso que está realizando
  nuestra aplicación a una BD concreta en tiempo de
  ejecución.
• Objeto Connection al que aplicamos el método
  getMetaData(), que devuelve un objeto que
  implementa la interfaz DatabaseMetaData.
                                                  52
Metadatos para SQL
•   Types simplemente contiene constantes con los tipos de datos.
•   DatabaseMetadata, proporciona información sobre la BD.



                                   Object




                        <<Interface>>
                                                     Types
                      Dat abaseMetaData




                                                                    53
Información sobre el resultado de
          una consulta
• Muchas veces no conocemos lo que va a devolver
  una consulta: SELECT * FROM Usuarios.
• JDBC permite obtener un objeto que implementa
  ResultSetMetaData al aplicar el método
  getMetada() a un objeto ResultSet.
• De esta forma podemos obtener datos como
  número de columnas devueltas y el nombre de una
  determinada columna.
• Esto permite la ejecución y recuperación de
  resultados de forma dinámica.
                                                54
Código fuente de recuperación de
           metadatos
ResultSet rs = stmt.executeQuery(sqlStr);

ResultSetMetaData rsmd= rs.getMetaData();
int columnCount= rsmd.getColumnCount();

// Vamos imprimiendo los nombres de cada columna
for(int x =1;x<=columnCount;x++)
{
  String columnName= rsmd.getColumnName(x);
  System.out.print(columnName +"t");
}
...

                                                   55
Código fuente de recuperación de
       metadatos (cont.)
// Recorremos filas e imprimimos los valores de cada
   columna
while(rs.next())
{
  for(int x =1;x<=columnCount;x++)
  {
     if (rsmd.getColumnTypeName(x).compareTo("CURRENCY")
   == 0)
        System.out.print("$");
     String resultStr = rs.getString(x);
     System.out.print(resultStr +"t");
  }
}
...
                                                       56
Utilización de transacciones
• Tratamiento conjunto de sentencias SQL.
• COMMIT y ROLLBACK
• Métodos para el tratamiento de
  transacciones:
  – commit(), roollback() y setAutoCommit().




                                               57
Ampliaciones al tratamiento
         básico de BD
• Versiones JDBC
  – JDBC 1.0
  – JDBC 2.0
     • JDBC Optional Package (inicialmente se le llamó
       standard extension API): paquete javax.sql. Es
       necesario si queremos utilizar objetos DataSource o
       Rowset. Está incluido en la J2EE. Si tenemos la
       J2SE podemos bajarlo por separado.
  – JDBC 3.0: paquetes java.sql y javax.sql está
    integrado en la plataforma J2SE 1.4.
                                                         58
Características incluye JDBC 2.0
                (I)
• El recorrido del ResultSet no se limita al avance.
• Actualización de los datos de la base de datos
  mediante métodos.
• Envío de múltiples sentencias SQL de
  actualización a la BD para que las trate como una
  unidad (Batch updates).
• Utilización de tipos de datos SQL3.
• Creación y utilización de nuevos tipos SQL
  definidos por el usuario (UDTs).
                                                       59
Características incluye JDBC 2.0
              (y II)
• Fuentes de datos como alternativa a
  getConnection.
• Creación de conexiones como pools de
  conexiones.
• RowSets.



                                         60
Acceso a base de datos desde
      Servlets y JSP
Acceso a base de datos desde
             Servlets
• La mayoría de las aplicaciones comerciales
  basadas en servlets utilizan bases de datos.
• El acceso a base de datos desde un servlet
  es igual al que se puede realizar desde
  cualquier aplicación java.
• Se utiliza la tecnología JDBC de Java.


                                             62
JDBC en un Servlet
• Para emplear JDBC en un Servlet simplemente
  hay que incluir los paquetes de java adecuados.
• Debemos tener en cuenta los distintos tipos de
  controladores JDBC y cual nos interesa emplear,
  como en otros entornos.
• Se utilizan exactamente las mismas interfaces y las
  mismas clases para conectarnos y extraer
  información de la base de datos que en cualquier
  otra aplicación Java.
                                                   63
Escenario común servlets y BD
• Vamos a representar un escenario común en
  cualquier aplicación que utiliza servlets y BD.
• Tenemos un formulario HTML en el que el
  usuario introduce datos.
• Con los datos del formulario construimos una
  consulta que realizamos sobre la BD.
• Los resultados se los devolvemos al usuario en
  otra página HTML.
• Ejercicio: ir escribiendo el programa a la vez que
  vamos viendo cada una de las fases.
                                                       64
Conexión a la base de datos
• Respecto al rendimiento, el mayor cuello de
  botella se produce al crea un objeto
  Connection para conectarnos a la BD.
• Debemos evitar tener que hacerlo
  repetidamente.
• Código de creación de la conexión con la
  BD en la inicialización del servlet que se
  produce sólo una vez  método init().

                                            65
Recuperar datos del formulario
          de consulta
• Una vez conectados, el resto del código de
  acceso a BD estará en los métodos doGet()
  o doPost().
• Recuperamos los valores de los campos que
  ha introducido en el formulario que lanza la
  consulta.


                                             66
Construcción de la consulta
• Construiremos la cadena que constituye la
  sentencia SQL que posteriormente
  ejecutaremos contra la base de datos.
• Normalmente habrá una parte fija que no
  varía y unos parámetros que crearemos a
  partir de la información del formulario.


                                              67
Ejecución de la consulta y
     devolución de resultados
• Una vez construida la consulta, la enviamos
  a la BD para su ejecución.
• Si existe algún problema debemos devolver
  un error al usuario.
• Si la ejecución fue correcta debemos
  devolver los resultados de la ejecución.


                                            68
Cierre de la conexión
• Debemos asegurarnos que en el método
  destroy() del servlet se cierren todas las
  conexiones.
• El recolector de basura podrá liberar todos
  los recursos.



                                                69
BD desde un servlet
• Conexión con la BD.
• Recuperar parámetros del formulario de
  consulta.
• Construir la sentencia.
• Ejecución de la consulta y devolución de
  resultados.
• Cierre de la conexión.
  Ver acceso a BD desde JSP                  70
Sentencias preparadas en la
    construcción de sentencias
• Principal uso de las sentencias preparadas: mejorar
  rendimiento.
• También permiten evitar errores sintácticos en la
  construcción de la sentencia SQL en el servlet.
• El usuario podría meter caracteres reservados (ej.:
  ’) en el parámetro.
• El uso de setString() evita la confusión del
  analizador de sentencias de la BD.

                                                   71
Acceso a base de datos desde JSP
• JSP utiliza JDBC para acceder a base de
  datos.
• No necesita etiquetas especiales para
  acceder a base de datos.




                                            72
JSP con el código de acceso a
          BD incrustado
• Uso de scritplets que utilizan JDBC para acceder a
  la BD.
• No es necesaria la captura de excepciones JSP
  hace el trabajo automáticamente.
• Cuando recuperamos resultados de una consulta
  aparecerá código HTML dentro del bucle para ir
  mostrando cada fila.
• Realizar ejemplo de acceso a BD con scritplets.

                                                   73
Acceso a través de Beans
• Una forma habitual de utilizar BD con JSP
  es utilizar componentes JavaBean de apoyo.
• De esta forma mantenemos independiente la
  presentación y el acceso a datos, esto es
  fundamental para facilitar el mantenimiento
  de la aplicación.


                                            74
Proceso para recuperar datos a
      través de un JavaBean
• El Bean se encarga de conectar con la BD y
  ejecutar la sentencia deseada.
• El bean proporciona métodos para posicionarse en
  cada fila de la consulta.
• A través de las propiedades del JavaBean
  podemos acceder a los valores de cada uno de los
  campos.
• Las propiedades de un JavaBean se representan
  muy fácil en una página JSP.

                                                 75
Estructura del JavaBean para
           acceso a BD
• Constructor del JavaBean:
      •   conexión con la base de datos.
      •   realización de la consulta.
      •   Guardar resultados en una estructura local al Bean.
      •   establecer los valores de las propiedades.
      •   cerrar la conexión.
• Método para recorrer los resultados.
      • Recargando las propiedades cada vez que cambie.
• Propiedades se corresponden con los campos de la
  tabla.

                                                                76
Ejemplo JavaBean BD
• Ejemplo sencillo de un JavaBean que
  permite recuperar resultados de una BD.
• Métodos básicos:
  – obtenerFilas(), hace la consulta sobre la BD y
    guarda resultados en un vector interno.
  – seleccionarFila(int f), se posiciona en el
    elemento f del vector y carga en cada uno de los
    atributos los valores de los campos.
                                                  77
JSP muestra resultados (I)
• Realizamos una página JSP que utilizando
  el Bean anterior muestre todas las filas de la
  consulta en una tabla.
• Pide al JavaBean que realice la consulta.
     <% BeanBd.obtenerFilas(); %>




                                               78
JSP muestra resultados (y II)
• Recupera cada una de las filas.
      <% for (int i= 0; i<BeanBd.numEle(); i++)
          { BeanBd.seleccionarFila(i); %>
      <tr>
      <td><jsp:getProperty name=”BeanBd”
        property=“campo1”/></td>
      <td><jsp:getProperty name=”BeanBd”
        property=“campo2”/></td>
      <td><jsp:getProperty name=”BeanBd”
        property=“campo3”/></td>
      </tr>
      <% } %>

                                                  79

Mais conteúdo relacionado

Mais procurados

Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
jent46
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
1 2d
 
Notas clase
Notas claseNotas clase
Notas clase
1 2d
 
Sistema Ado.Net
Sistema Ado.NetSistema Ado.Net
Sistema Ado.Net
Personal
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
zaka3000
 

Mais procurados (20)

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
 
ODBC en C
ODBC en CODBC en C
ODBC en C
 
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
 
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
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
Curso Básico de JDBC
Curso Básico de JDBCCurso Básico de JDBC
Curso Básico de JDBC
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Guia7 java
Guia7 javaGuia7 java
Guia7 java
 
Hibernate 3.2 short manual
Hibernate 3.2 short manualHibernate 3.2 short manual
Hibernate 3.2 short manual
 
Jdbc
JdbcJdbc
Jdbc
 
Java persitence api
Java persitence apiJava persitence api
Java persitence api
 
MyBatis como alternativa a Hibernate
MyBatis como alternativa a HibernateMyBatis como alternativa a Hibernate
MyBatis como alternativa a Hibernate
 
Sistema Ado.Net
Sistema Ado.NetSistema Ado.Net
Sistema Ado.Net
 
Introducción práctica a JPA2
Introducción práctica a JPA2Introducción práctica a JPA2
Introducción práctica a JPA2
 
Tema 6
Tema 6Tema 6
Tema 6
 
Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
 
Bases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a HibernateBases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a Hibernate
 

Destaque (8)

Bucarasica
BucarasicaBucarasica
Bucarasica
 
Bucarasica
BucarasicaBucarasica
Bucarasica
 
Complejidad
ComplejidadComplejidad
Complejidad
 
Listasenlazadas 100517143015-phpapp02
Listasenlazadas 100517143015-phpapp02Listasenlazadas 100517143015-phpapp02
Listasenlazadas 100517143015-phpapp02
 
Gestion de Entrada y Salida
Gestion de Entrada y SalidaGestion de Entrada y Salida
Gestion de Entrada y Salida
 
Introducion uml
Introducion umlIntroducion uml
Introducion uml
 
Is
IsIs
Is
 
Gestion E/S Sistemas Operativos I
Gestion E/S Sistemas Operativos IGestion E/S Sistemas Operativos I
Gestion E/S Sistemas Operativos I
 

Semelhante a 5 a bd_servidor

Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
1 2d
 

Semelhante a 5 a bd_servidor (20)

Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
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
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc(desarrollo de software i yanina y yenny)
Jdbc(desarrollo de software i yanina y yenny)Jdbc(desarrollo de software i yanina y yenny)
Jdbc(desarrollo de software i yanina y yenny)
 
Jdbc diapositivva
Jdbc diapositivvaJdbc diapositivva
Jdbc diapositivva
 
Odbc
OdbcOdbc
Odbc
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
Jdbc Mysql
Jdbc MysqlJdbc Mysql
Jdbc Mysql
 
[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)
 
Jdbc
JdbcJdbc
Jdbc
 
Estudiante
EstudianteEstudiante
Estudiante
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
Ser vlet conectar con base de datos
Ser vlet conectar con base de datosSer vlet conectar con base de datos
Ser vlet conectar con base de datos
 
Jdbc
JdbcJdbc
Jdbc
 
Acceso a datos con JDBC.pdf
Acceso a datos con JDBC.pdfAcceso a datos con JDBC.pdf
Acceso a datos con JDBC.pdf
 
JDBC
JDBCJDBC
JDBC
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 

Mais de Henrry Eliseo Navarro Chinchilla

Mais de Henrry Eliseo Navarro Chinchilla (20)

Apuntes2
Apuntes2Apuntes2
Apuntes2
 
Apuntes2
Apuntes2Apuntes2
Apuntes2
 
Ingenieria de software
Ingenieria de softwareIngenieria de software
Ingenieria de software
 
Gestionde fichero
Gestionde ficheroGestionde fichero
Gestionde fichero
 
Metodos en php
Metodos en phpMetodos en php
Metodos en php
 
Grafos
GrafosGrafos
Grafos
 
Exploration network chapter7
Exploration network chapter7Exploration network chapter7
Exploration network chapter7
 
Exploration network chapter11
Exploration network chapter11Exploration network chapter11
Exploration network chapter11
 
Exploration network chapter10
Exploration network chapter10Exploration network chapter10
Exploration network chapter10
 
Exploration network chapter9
Exploration network chapter9Exploration network chapter9
Exploration network chapter9
 
Exploration network chapter8
Exploration network chapter8Exploration network chapter8
Exploration network chapter8
 
Exploration network chapter7
Exploration network chapter7Exploration network chapter7
Exploration network chapter7
 
Fichero
FicheroFichero
Fichero
 
Entrada salida
Entrada salidaEntrada salida
Entrada salida
 
Gestión de Almacenamiento
Gestión de AlmacenamientoGestión de Almacenamiento
Gestión de Almacenamiento
 
Gestion de Entradas y Salidas
Gestion de Entradas y SalidasGestion de Entradas y Salidas
Gestion de Entradas y Salidas
 
Exploration network chapter6
Exploration network chapter6Exploration network chapter6
Exploration network chapter6
 
Exploration network chapter5
Exploration network chapter5Exploration network chapter5
Exploration network chapter5
 
Exploration network chapter4
Exploration network chapter4Exploration network chapter4
Exploration network chapter4
 
Paradigma de la_ingenieria_de_sistemas_def
Paradigma de la_ingenieria_de_sistemas_defParadigma de la_ingenieria_de_sistemas_def
Paradigma de la_ingenieria_de_sistemas_def
 

5 a bd_servidor

  • 1. Acceso a base de datos con Java desde aplicaciones web con la tecnología JDBC
  • 2. Bases de Datos en aplicaciones • Aplicación que procese información  base de datos. • Normalmente se utilizan bases de datos relacionales. • SQL: Lenguaje estándar para acceder a una base datos. 2
  • 3. Acceder a una base de datos desde una aplicación • Cómo puede enviar una aplicación sentencias SQL a una BD. • Interfaz procedural para ejecutar sentencias SQL. • X/Open CLI (ISO 9075-3 “Call level interface”). • ODBC es variante de Microsoft del X/Open CLI (implementada en lenguaje C). • La filosofía de estas APIs es que permitan acceder de la misma forma a distintas BD. 3
  • 4. JDBC • Es un interfaz orientado a objetos de Java para SQL. • Se utiliza para enviar sentencias SQL a un sistema gestor de BD (DBMS). • Con JDBC tenemos que continuar escribiendo las sentencias SQL. • No añade ni quita potencia al SQL. 4
  • 5. Arquitectura JDBC • La filosofía de JDBC es proporcionar transparencia al desarrollador frente al gestor de BD. • JDBC utiliza un Gestor de Controladores que hace de interfaz con el controlador específico de la BD. Aplicación Java Driver Manager de JDBC Controlador Controlador Controlador Oracle JDBC-ODBC DB2 SGBD SGBD Oracle BD Access BD BD DB2 5
  • 6. Clases e interfaces JDBC • La especificación JDBC incluye 8 interfaces y 10 clases, en el paquete estándar java.sql. • Podemos dividirlos en los siguientes grupos: – Nucleo de JDBC, interfaces y clases que todos los controladores deben implementar. – Extensiones al paquete java.lang, extensiones para SQL. – Extensiones al paquete java.util, son extensiones a java.util.Date. – Metadatos para SQL, permiten examinar dinámicamente las propiedades de BD y controladores. 6
  • 7. Núcleo de JDBC • Estos interfaces se utilizarán el 90% de las veces que trabajemos con una BD. <<Interface>> <<Interface>> <<Interface>> <<Interface>> Driver Connection Statement Result Set <<Interface>> <<Int erface>> DriverManager PreparedStatement Res ult SetMet aData <<Interface>> DriverPropertyInfo CallableStatement 7
  • 8. Invocar una consulta SQL • Vamos a estudiar un escenario en el que realizaremos una consulta sobre una BD con JDBC. • Mediante el seguimiento de un diagrama de secuencia veremos las clases en funcionamiento. • Cliente, representa a la aplicación Java donde implementamos la consulta. • Un buen ejercicio sería ir escribiendo el programa a la vez que vamos viendo cada una de las fases. 8
  • 9. Configuración de la conexión con base de datos • Antes de conectar con la base de datos y trabajar con ella debemos tener en cuenta dos cuestiones: – Registrar un controlador. – Convenciones de nombres para la base de datos. 9
  • 10. Carga de un controlador (I) • Determinados controladores requerirán la instalación y configuración de software específico en el cliente. Ejemplo: el origen ODBC o la fuente de datos nativa. • Otros controladores son simplemente una clase Java y bastará que la máquina virtual de Java las pueda localizar mediante el classpath. 10
  • 11. Carga de un controlador (y II) • Dos alternativas: – Utilizar una propiedad del sistema (jdbc.drivers). – Cargar la clase de forma explícita con la llamada Class.forName(). • La propia clase llamará al método registerDriver() de la clase DriverManager, que dejará registrado el controlador para utilizarlo posteriormente. • Consultar que los controladores registrados con DriverManager.getDrivers(). 11
  • 12. Código fuente de carga del controlador de la BD try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException e) { System.out.println("Error en la carga del driver JDBC"); return; } 12
  • 13. C lie n te : D r iv e r M a n a g e r : C o n n e c tio n g e tC o n n e c tio n ( ) Conexión a la BD 13 Obtener conexión BD
  • 14. Abrir una conexión • Previamente habremos registrado el controlador. • DriverManager.getConnection(url). • El parámetro imprescindible es la url de la base de datos; para especificar la base de datos que queremos utilizar. • También se puede especificar el usuario y la clave con los que nos queremos conectar a la base de datos. 14
  • 15. Nombres para las BD en JDBC • En JDBC las bases de datos se designan mediante una URL. • La forma de la url es la siguiente: jdbc:<subprotocolo>:<dominio> • Subprotocolo: identifica el mecanismo de conexión o el controlador JDBC concreto. • Dominio: Depende del subprotocolo, puede ser simplemente un nombre simple para la base de datos o una serie de parámetros que permiten encontrar la BD. 15
  • 16. Código fuente de conexión try { url de la BD Connection con= DriverManager.getConnection("jdbc:odbc:Biblio", "",""); "",""); } Usuario, clase de la BD catch (SQLException e) { System.out.println(e); } 16
  • 17. El objeto Connection • Si no se producen excepciones el método getConnection nos devuelve un objeto que implementa la interfaz Connection. • Podemos crear varias conexiones con distintas bases de datos o incluso con la misma. • Cada conexión representa una sesión con la BD. • El objeto Connection nos permitirá acceder a la base de datos para realizar operaciones sobre ella y obtener resultados. 17
  • 18. C lie n te : D r iv e r M a n a g e r : : S ta te m e n t C o n n e c tio n g e tC o n n e c tio n ( ) c re a te S ta te m e n t( ) Obtener el objeto Statement 18 Crear sentencia de BD
  • 19. Acceso a los datos • Utilizamos la conexión con la base de datos creada anteriormente para enviar comandos y sentencias SQL. • El objeto conexión funciona como un enlace directo con el controlador de la BD. • Creamos un objeto de la clase Statement que servirá de envoltorio para las sentencias SQL. • Cuando pasamos la SQL a la conexión este lo envía al controlador que a su vez lo redirecciona a la BD, que nos devolverá los resultados. 19
  • 20. Objetos involucrados en el acceso a datos (diagrama de colaboración) Objeto ResultSet Objeto Driver Resultados Programa JDBC BD Java Base de datos Objeto Objeto SQL Statement Connection 20
  • 21. Código fuente de creación de una sentencia de consulta try { // Creamos el objeto sentencia Statement stmt= con.createStatement(); [...] } catch (Exception e) { System.out.prinln(e); } 21
  • 22. Creación del objeto Statement • La clase Connection tiene varios métodos que permiten crear un objeto Statement o una de sus variantes. • createStatement, para crear sentencias simples. • prepareStatement, para sentencias que pueden contener parámetros, optimiza la utilización repetida de estas sentencias. • prepareCall. 22
  • 23. C lie n te : D r iv e r M a n a g e r : : S ta te m e n t : R e s u lt S e t C o n n e c tio n g e tC o n n e c tio n ( ) c re a te S ta te m e n t( ) e x e c u te Q u e r y ( ) Ejecutar la consulta 23 Ejecutar consulta
  • 24. Ejecución de la sentencia • executeQuery(), ejecución de consultas, sentencia SELECT. • executeUpdate(), actualizaciones de valores en al base de datos. INSERT, UPDATE, DELETE. Sólo devuelve la cuenta de las columnas afectadas. • execute(), se usa para ejecutar sentencias que no se conocen a priori o que devuelven resultados no homogéneos. 24
  • 25. Código fuente de ejecución de una sentencia try { [...] // Ejecutamos una sentencia SQL ResultSet rs= stmt.executeQuery("SELECT Titulo, ISBN," + " Fecha_edicion, Paginas, Precio" + " FROM LIBROS" + " WHERE Titulo LIKE '%jdbc%'"); } catch (SQLException e) ... 25
  • 26. C lie n te : D r iv e r M a n a g e r : : S ta te m e n t : R e s u lt S e t C o n n e c tio n g e tC o n n e c tio n ( ) c re a te S ta te m e n t( ) e x e c u te Q u e r y ( ) Posicionar el cursor en la siguiente fila n e x t( ) g e tIn t( ) g e tS tr in g ( ) g e t B ig D e c im a l( ) Recuperar valores Repetir mientras de las columnas. haya filas que procesar. 26 Recuperación valores resultado
  • 27. Recuperación de datos • Cuando ejecutamos una consulta debemos emplear el método executeQuery(), que devuelve un objeto ResultSet, que nos permitirá acceder a los resultados. • El ResultSet utiliza el concepto de cursor de base de datos para ir moviéndose por las filas de datos recuperadas. • Las columnas pueden accederse en cualquier orden, utilizando su posición o su nombre. • El objeto ResultSet incluye métodos getXXX que permiten recuperar valores de distintos tipos. 27
  • 28. Código fuente de recuperación de datos ... while (rs.next()) { // Se recupera cada columna por separado String titulo= rs.getString("Titulo"); Date fechaEdicion= rs.getDate("Fecha_edicion"); int pags= rs.getInt("Paginas"); double precio= rs.getDouble("Precio"); // Operación que realizamos con cada fila System.out.println("Titulo: " + titulo + ", edición: " + fechaEdicion); } 28
  • 29. C lie n te : D r iv e r M a n a g e r : : S ta te m e n t : R e s u lt S e t C o n n e c tio n g e tC o n n e c tio n ( ) c re a te S ta te m e n t( ) e x e c u te Q u e r y ( ) n e x t( ) g e tIn t( ) g e tS tr in g ( ) g e t B ig D e c im a l( ) c lo s e ( ) c lo s e ( ) Liberar el objeto Liberar el objeto Statement 29 Connection Librerar objetos
  • 30. Código fuente de liberación de recursos de BD try { [...] // Liberamos objeto sentencia stmt.close(); // Liberamos objeto conexión BD con.close(); } catch (SQLException e) ... 30
  • 31. Resumen proceso consulta simple • Registrar controlador  Class.forName. • Abrir conexión  DriverManager.getConnection. • Crea sentencia  con.createStatement. • Ejecuta la sentencia  stmt.executeQuery. • Procesar resultados  while(rs.next()) ... • Cerrar sentencia y conexión  close. Ver Acceso a BD desde servlets 31
  • 32. Profundizando en la utilización de JDBC • Manejo de las excepciones de SQL • Utilización de diferentes BD. • Ejecución de distintas sentencias SQL. • Sentencias preparadas. • Conjuntos de resultados. – Desplazamiento y actualización por programa. – Metadatos. 32
  • 33. Manejo de las excepciones de SQL • SQLException – Es la principal forma que tiene JDBC de informar de errores. – Hereda de la clase Exception de java.lang. – Proporciona la siguiente información sobre el error: • Una cadena describiendo el error a la que se puede acceder con el método getMessage(). • La cadena de error SQLstate de acuerdo con el estándar X/Open a la que se puede acceder con el método getSQLState(). • Un código de error entero específico de la BD que se puede acceder con getErrorCode(). • Permite acceder a más errores con getNextException(). 33
  • 34. Manejo de los avisos de SQL • SQLWarning – Permite informar de errores leves en distintos objetos de la BD: ResultSet, Statement, Connection. – Al contrario que SQLException no es obligatorio capturar los SQLWarning. – Para obtener un SQLWarning se llama al método getWarning() sobre el objeto. – Para obtener SQLWarning adicionales se llama a getNextWarning(). • DataTruncation – Informa de avisos de truncado de datos en las lecturas y al escribir datos. 34
  • 35. Extensiones JDBC al paquete java.lang • Amplían envoltorio Number para permitir albergar grandes números. • Crean clases Exception especializadas. Number Exception BigDecimal SQLException SQLWarning Dat aTruncation 35
  • 36. Utilización de diferentes BD • JDBC permite utilizar distintas bases de datos sin cambiar el código o haciendo retoques mínimos. • Cambios que implica la utilización de una BD diferente: – controlador, – url de la BD. • Otros posibles cambios. 36
  • 37. Tipos de controladores • JDBC es una especificación que establece dos tipos de interfaces: – Interfaz de aplicación, que permite acceder a una base de datos independientemente de su fabricante. – Interfaz del controlador, al cual se deben adaptar los desarrolladores de controladores. • Actualmente en el mercado existen gran cantidad de controladores que varían en su arquitectura. Sun ha clasificado estos controladores en cuatro tipos. – http://industry.java.sun.com/products/jdbc/drivers 37
  • 38. Controlador Tipo 1 • Puente JDBC-ODBC Servidor Cliente DBC Serv. BD oco lo O ODBC Prot Cliente JDBC ODBC BD Java Protoc Serv. BD olo OD BC ODBC 38
  • 39. Controlador Tipo 2 • Controlador utilizando APIs nativas Servidor Cliente a tivo Serv. BD oco lo n nativo Prot Cliente API JDBC BD Java nativa 39
  • 40. Controlador Tipo 3 • Controlador JDBC-NET Java puro Servidor Cliente Serv. Serv. BD r o estánda JDBC nativo Protocol Cliente JDBC BD Java Protoc Serv. Serv. BD olo es tá ndar JDBC nativo 40
  • 41. Controlador Tipo 4 • Controlador Java puro y protocolo nativo Servidor Cliente Serv. BD o n ativo nativo ocol Cliente Prot JDBC BD Java 41
  • 42. Ejecución de distintas sentencias SQL • Tipos de sentencias SQL: – Sentencias de definición de datos: CREATE TABLE, CREATE INDEX. – Sentencias de manipulación de datos: INSERT, UPDATE, DELETE. – Sentencias de consulta: SELECT. • Cada tipo devuelve resultados distintos y empleamos distintos métodos stmt.execute(). 42
  • 43. Sentencias preparadas • Optimiza rendimiento en las sentencias que se ejecutan repetidamente. • Características: – Sentencias en las que no se ponen explícitamente determinados valores. – La base de datos sólo tiene que interpretar la sentencia la primera vez. – Optimizan la ejecución. 43
  • 44. Código fuente de sentencias preparadas PreparedStatement pstmt= con.prepareStatement( "INSERT INTO Autores VALUES (?,?,?,?)"); // Establece valores para cada uno de los parametros pstmt.setString(1,"Mario"); // Nombre pstmt.setString(2,"Vargas Llosa"); // Apellidos pstmt.setString(3,"Peru"); // Lugar nacimiento pstmt.setInt(4,1953); // Anio nacimiento int insCount= pstmt.executeUpdate(); // Establece valores para cada uno de los parametros pstmt.setString(1,"Nicholas"); // Nombre pstmt.setString(2,"Negroponte"); // Apellidos pstmt.setString(3,"New York"); // Lugar nacimiento pstmt.setInt(4,1953); // Anio nacimiento int insCount= pstmt.executeUpdate(); 44
  • 45. Conjunto de resultados desplazable • Recorrido básico del ResultSet: cursor hacia delante, de fila en fila y desde la primera fila  next(). • Podemos acceder a las filas del ResultSet de más formas (JDBC 2.0), como un índice de un array. 45
  • 46. Creación de la sentencia para Resultset desplazable • Cambio en la creación del objeto sentencia: – createStatement(int tipoResultSet, int concurrenciaResultSet) – tipoResultSet es el que permite flexibilidad en el desplazamiento. – Valores: • TYPE_FORWARD_ONLY, sólo hacia delante • TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE, métodos de posicionamiento habilitados 46
  • 47. Métodos de desplazamiento del cursor • Métodos – Movimiento hacia atrás: afterLast(), previous(). – Posicionamiento absoluto: first(), last(), absolute(numFila). – Posicionamiento relativo: relative(num). – Recupera fila actual: getRow(). 47
  • 48. Conjunto de resultados actualizable • Para actualizar datos en la BD teníamos que recurrir a sentencias SQL: INSERT, UPDATE, DELETE. • Podemos realizar actualizaciones por programa (JDBC 2.0). 48
  • 49. Creación de la sentencia para Resultset actualizable • Cambio en la creación del objeto sentencia: – createStatement(int tipoResultSet, int concurrenciaResultSet) – concurrenciaResultSet es el que permite actualizar ResultSet por programa. – Valores: • CONCUR_READ_ONLY, no se puede actualizar. • CONCUR_UPDATABLE, permite la utilización de métodos para modificar filas. 49
  • 50. Métodos para actualizar filas • Posicionarse en la fila para actualizar. • Llamar a los métodos de actualización de campos: – updateXXX(<campo>,<valor>) • Para confirmar las actualizaciones sobre la tabla llamamos a: updateRow(). 50
  • 51. Insertando y borrando por programa • Métodos para insertar filas sin utilizar SQL: – moveToInsertRow(), mueve a fila vacía. – updateXXX(<campo>,<valor>) sobre cada campo de la nueva fila. – insertRow(), confirma inserción. • Método para borrar filas sin utilizar SQL: – Posicionarnos sobre la fila a borrar. – deleteRow(). 51
  • 52. Información acerca de la base de datos (Metadatos) • Cuando a priori no tenemos información sobre la estructura de la base de datos podemos acceder a ella mediante los metadatos. • Esto permite adaptar el acceso que está realizando nuestra aplicación a una BD concreta en tiempo de ejecución. • Objeto Connection al que aplicamos el método getMetaData(), que devuelve un objeto que implementa la interfaz DatabaseMetaData. 52
  • 53. Metadatos para SQL • Types simplemente contiene constantes con los tipos de datos. • DatabaseMetadata, proporciona información sobre la BD. Object <<Interface>> Types Dat abaseMetaData 53
  • 54. Información sobre el resultado de una consulta • Muchas veces no conocemos lo que va a devolver una consulta: SELECT * FROM Usuarios. • JDBC permite obtener un objeto que implementa ResultSetMetaData al aplicar el método getMetada() a un objeto ResultSet. • De esta forma podemos obtener datos como número de columnas devueltas y el nombre de una determinada columna. • Esto permite la ejecución y recuperación de resultados de forma dinámica. 54
  • 55. Código fuente de recuperación de metadatos ResultSet rs = stmt.executeQuery(sqlStr); ResultSetMetaData rsmd= rs.getMetaData(); int columnCount= rsmd.getColumnCount(); // Vamos imprimiendo los nombres de cada columna for(int x =1;x<=columnCount;x++) { String columnName= rsmd.getColumnName(x); System.out.print(columnName +"t"); } ... 55
  • 56. Código fuente de recuperación de metadatos (cont.) // Recorremos filas e imprimimos los valores de cada columna while(rs.next()) { for(int x =1;x<=columnCount;x++) { if (rsmd.getColumnTypeName(x).compareTo("CURRENCY") == 0) System.out.print("$"); String resultStr = rs.getString(x); System.out.print(resultStr +"t"); } } ... 56
  • 57. Utilización de transacciones • Tratamiento conjunto de sentencias SQL. • COMMIT y ROLLBACK • Métodos para el tratamiento de transacciones: – commit(), roollback() y setAutoCommit(). 57
  • 58. Ampliaciones al tratamiento básico de BD • Versiones JDBC – JDBC 1.0 – JDBC 2.0 • JDBC Optional Package (inicialmente se le llamó standard extension API): paquete javax.sql. Es necesario si queremos utilizar objetos DataSource o Rowset. Está incluido en la J2EE. Si tenemos la J2SE podemos bajarlo por separado. – JDBC 3.0: paquetes java.sql y javax.sql está integrado en la plataforma J2SE 1.4. 58
  • 59. Características incluye JDBC 2.0 (I) • El recorrido del ResultSet no se limita al avance. • Actualización de los datos de la base de datos mediante métodos. • Envío de múltiples sentencias SQL de actualización a la BD para que las trate como una unidad (Batch updates). • Utilización de tipos de datos SQL3. • Creación y utilización de nuevos tipos SQL definidos por el usuario (UDTs). 59
  • 60. Características incluye JDBC 2.0 (y II) • Fuentes de datos como alternativa a getConnection. • Creación de conexiones como pools de conexiones. • RowSets. 60
  • 61. Acceso a base de datos desde Servlets y JSP
  • 62. Acceso a base de datos desde Servlets • La mayoría de las aplicaciones comerciales basadas en servlets utilizan bases de datos. • El acceso a base de datos desde un servlet es igual al que se puede realizar desde cualquier aplicación java. • Se utiliza la tecnología JDBC de Java. 62
  • 63. JDBC en un Servlet • Para emplear JDBC en un Servlet simplemente hay que incluir los paquetes de java adecuados. • Debemos tener en cuenta los distintos tipos de controladores JDBC y cual nos interesa emplear, como en otros entornos. • Se utilizan exactamente las mismas interfaces y las mismas clases para conectarnos y extraer información de la base de datos que en cualquier otra aplicación Java. 63
  • 64. Escenario común servlets y BD • Vamos a representar un escenario común en cualquier aplicación que utiliza servlets y BD. • Tenemos un formulario HTML en el que el usuario introduce datos. • Con los datos del formulario construimos una consulta que realizamos sobre la BD. • Los resultados se los devolvemos al usuario en otra página HTML. • Ejercicio: ir escribiendo el programa a la vez que vamos viendo cada una de las fases. 64
  • 65. Conexión a la base de datos • Respecto al rendimiento, el mayor cuello de botella se produce al crea un objeto Connection para conectarnos a la BD. • Debemos evitar tener que hacerlo repetidamente. • Código de creación de la conexión con la BD en la inicialización del servlet que se produce sólo una vez  método init(). 65
  • 66. Recuperar datos del formulario de consulta • Una vez conectados, el resto del código de acceso a BD estará en los métodos doGet() o doPost(). • Recuperamos los valores de los campos que ha introducido en el formulario que lanza la consulta. 66
  • 67. Construcción de la consulta • Construiremos la cadena que constituye la sentencia SQL que posteriormente ejecutaremos contra la base de datos. • Normalmente habrá una parte fija que no varía y unos parámetros que crearemos a partir de la información del formulario. 67
  • 68. Ejecución de la consulta y devolución de resultados • Una vez construida la consulta, la enviamos a la BD para su ejecución. • Si existe algún problema debemos devolver un error al usuario. • Si la ejecución fue correcta debemos devolver los resultados de la ejecución. 68
  • 69. Cierre de la conexión • Debemos asegurarnos que en el método destroy() del servlet se cierren todas las conexiones. • El recolector de basura podrá liberar todos los recursos. 69
  • 70. BD desde un servlet • Conexión con la BD. • Recuperar parámetros del formulario de consulta. • Construir la sentencia. • Ejecución de la consulta y devolución de resultados. • Cierre de la conexión. Ver acceso a BD desde JSP 70
  • 71. Sentencias preparadas en la construcción de sentencias • Principal uso de las sentencias preparadas: mejorar rendimiento. • También permiten evitar errores sintácticos en la construcción de la sentencia SQL en el servlet. • El usuario podría meter caracteres reservados (ej.: ’) en el parámetro. • El uso de setString() evita la confusión del analizador de sentencias de la BD. 71
  • 72. Acceso a base de datos desde JSP • JSP utiliza JDBC para acceder a base de datos. • No necesita etiquetas especiales para acceder a base de datos. 72
  • 73. JSP con el código de acceso a BD incrustado • Uso de scritplets que utilizan JDBC para acceder a la BD. • No es necesaria la captura de excepciones JSP hace el trabajo automáticamente. • Cuando recuperamos resultados de una consulta aparecerá código HTML dentro del bucle para ir mostrando cada fila. • Realizar ejemplo de acceso a BD con scritplets. 73
  • 74. Acceso a través de Beans • Una forma habitual de utilizar BD con JSP es utilizar componentes JavaBean de apoyo. • De esta forma mantenemos independiente la presentación y el acceso a datos, esto es fundamental para facilitar el mantenimiento de la aplicación. 74
  • 75. Proceso para recuperar datos a través de un JavaBean • El Bean se encarga de conectar con la BD y ejecutar la sentencia deseada. • El bean proporciona métodos para posicionarse en cada fila de la consulta. • A través de las propiedades del JavaBean podemos acceder a los valores de cada uno de los campos. • Las propiedades de un JavaBean se representan muy fácil en una página JSP. 75
  • 76. Estructura del JavaBean para acceso a BD • Constructor del JavaBean: • conexión con la base de datos. • realización de la consulta. • Guardar resultados en una estructura local al Bean. • establecer los valores de las propiedades. • cerrar la conexión. • Método para recorrer los resultados. • Recargando las propiedades cada vez que cambie. • Propiedades se corresponden con los campos de la tabla. 76
  • 77. Ejemplo JavaBean BD • Ejemplo sencillo de un JavaBean que permite recuperar resultados de una BD. • Métodos básicos: – obtenerFilas(), hace la consulta sobre la BD y guarda resultados en un vector interno. – seleccionarFila(int f), se posiciona en el elemento f del vector y carga en cada uno de los atributos los valores de los campos. 77
  • 78. JSP muestra resultados (I) • Realizamos una página JSP que utilizando el Bean anterior muestre todas las filas de la consulta en una tabla. • Pide al JavaBean que realice la consulta. <% BeanBd.obtenerFilas(); %> 78
  • 79. JSP muestra resultados (y II) • Recupera cada una de las filas. <% for (int i= 0; i<BeanBd.numEle(); i++) { BeanBd.seleccionarFila(i); %> <tr> <td><jsp:getProperty name=”BeanBd” property=“campo1”/></td> <td><jsp:getProperty name=”BeanBd” property=“campo2”/></td> <td><jsp:getProperty name=”BeanBd” property=“campo3”/></td> </tr> <% } %> 79

Notas do Editor

  1. http://java.sun.com/products/jdbc/index.html
  2. A partir de aquí se empieza a realizar el ejemplo de una consulta simple, a la vez que se va explicando.
  3. Ejemplo de registro de un origen de datos ODBC para nuestro ejemplo. jdbc.drivers contiene una lista separada por el carácter ‘:’ con todos los nombres de clase de los controladores.
  4. EjConexion.java
  5. EjEjecucion.java
  6. EjEjecucion.java
  7. EjEjecucion.java
  8. Compilar y probar ejemplo de consulta simple. Desde aquí posemos: 1. Saltar al acceso a BD desde servlets donde combinamos los conceptos de JDBC con los de servles. 2. Seguir profundizando en JDBC.
  9. http://industry.java.sun.com/products/jdbc/drivers
  10. EjPreparadas.java
  11. Niveles de aislamiento de las transacciones de una BD
  12. EjResultSetMetaData.java
  13. Construir el formulario para la consulta.
  14. Podemos utilizar el fichero servlets.properties para guardar el driver y la url de la BD y hacer el servlet más parametrizable.
  15. Compilar ejemplo y probarlo con el Tomcat.
  16. ConsultaLibros.jsp