Java Database Connectivity JDBC - PowerPoint PPT Presentation

About This Presentation
Title:

Java Database Connectivity JDBC

Description:

... por la compa a se comunica con uno 'nativo' y este con la base de datos ... Protocolo Nativo. Es s lo Java. Se usa un protocolo de red con la BD. 8 ... – PowerPoint PPT presentation

Number of Views:46
Avg rating:3.0/5.0
Slides: 30
Provided by: vicg9
Category:

less

Transcript and Presenter's Notes

Title: Java Database Connectivity JDBC


1
Java Database Connectivity JDBC
  • JDBC es una API, formada por conjunto de clases e
    interfaces en el lenguaje de programación Java,
    para ejecutar sentencias SQL sobre una base de
    datos (externa).
  • Ofrece un estándar de conexión a cualquier base
    de datos disponible en el mercado.
  • Permite obtener los datos en forma fácil y cómoda
    en ambientes cliente-servidor a través de
    Internet/Intranet.

2
Qué hace JDBC?
  • Permite establecer una conexión a una base de
    datos.
  • Permite enviar sentencias SQL.
  • Permite procesar los resultados de estas
    sentencias.
  • Las clases que permiten esto están en el paquete
    java.sql (hay que importarlo)

3
Modelos de acceso a BD
  • De 2 capas
  • La aplicación habla directamente con la base de
    datos.
  • Controlador JDBC se comunica con el sistema
    específico que maneja la base de datos.
  • La base de datos puede estar en otra máquina, con
    lo que el cliente se comunica por red. Esta es la
    configuración llamada cliente/servidor.

Cliente
Aplicación Java
JDBC
Protocolo BD
DBMS
Servidor BD
4
Modelos de acceso a BD
Cliente (GUI)
  • De 3 capas
  • Los comandos son enviados a la capa intermedia de
    servicios, la cual envía sentencias SQL a la base
    de datos. Ésta las procesa y envía los resultados
    de vuelta a la capa intermedia, para luego ser
    enviados al cliente.
  • Permite un control de acceso y de actualización.
  • Provee ventajas de performance.

Applet en Java o Navegador HTML
Llamadas HTTP, RMI,CORBA
Aplicación Java
Servlets JSP EJB
JDBC
Protocolo BD
DBMS
Servidor BD
5
Arquitectura JDBC
  • Hay 4 formas distintas de establecer una conexión
    entre un programa java y una base de datos
  • Usando la ODBC (creado por microsoft para brindar
    una API estándar para comunicarse con bases de
    datos en una plataforma windows
  • Usando un driver JDBC que se comunica con un
    driver desarrollado por la compañía que
    desarrollo el DBMS (que puede estar en cualquier
    lenguaje)
  • Lo mismo, pero con el driver desarrollado por la
    compañía en java
  • Lo mismo, pero el driver desarrollado por la
    compañía se comunica con uno nativo y este con
    la base de datos

6
Arquitectura JDBC
Programa Java
Base de Datos
Punete JDBC- ODBC
API JDBC
Api del proveedor
En el cliente
Driver JDBC
Driver Servidor JDBC
En elservidor
7
Categorías de los controladores JDBC
  • Puente JDBC-ODBC.
  • Parte API Nativa-Parte Java. Se convierte las
    llamadas JDBC al sistema de la Base de datos.
  • JDBC-Red. Es sólo Java. Las llamadas JDBC son
    convertidas a un protocolo de red independiente
    del sistema de la base de datos. Este protocolo
    es convertido en un servidor
  • Protocolo Nativo. Es sólo Java. Se usa un
    protocolo de red con la BD.

8
Cargando el Driver
  • Es necesario primero cargar una clase con el
    driver de la base de datos (esto lo provee el
    vendedor de la DBMS)
  • Ejemplo
  • Class c Class.forName(com.informix.jdbc.IfxDriv
    er")
  • Calss.forName(com.novell.sql.LDAPDriver)
  • Class.forName("com.mysql.jdbc.Driver")
  • Esto es particular según la base de datos que se
    usa
  • Luego hay que crear una instancia de la clase
  • c.newInstance()

9
Estableciendo la Conexión
  • Connection con DriverManager.getConnection (
  • url,"login", "password")
  • En los ejemplos omitiremos login y password
  • Un objeto Connection representa una conexión a
    una base de datos.
  • La clase DriverManager intenta ubicar el
    controlador que pueda conectarse a la base de
    datos representada en la URL.

10
Conexión
  • Ejemplos de URL
  • jdbcmysql//localhost/test (para ejemplos)
  • jdbcoracle//oraserver
  • jdbcodbcmydatabase
  • jdbcinformix-sqli//hostnameport/dbnameINFORMIX
    SERVERserverName (para las bases CGE)
  • jdbcldap//serverbaseDNbaseDNuseCleartexttrue

11
...Conexión
  • Sintáxis de una URL JDBC
  • jdbcltsubprotocologtltsubnombregt
  • ltsubprotocologt es el nombre del controlador o del
    mecanismo de conexión. Ejemplo odbc.
  • ltsubnombregt es la identificación de la base de
    datos. El formato varia según el controlador
    especificado. Ejemplo //servidorpuerto/bd y
    parámetros

12
Enviando sentencias SQL
  • JDBC permite enviar cualquier tipo de sentencia
    SQL. Aunque ésta fuera dependiente de la base de
    datos sólo se correría el riesgo de
    incompatibilidad al cambiar de base de datos.

13
...Enviando sentencias SQL
  • JDBC provee 3 clases
  • Statement Este objeto es usado para enviar
    sentecias SQL simples. Es creado por el método
    createStatement.
  • PreparedStatement Este objeto es usado para
    sentencias que requieren uno o más parámetros. La
    sentencia es precompilada y guardada para uso
    futuro.
  • CallableStatement Es usado para ejecutar
    procedimientos almacenados en la base de datos.

14
La clase Statement
  • Statement stmt con.createStatement()
  • En este momento la statement existe pero no tiene
    una sentencia SQL para ejecutar. Esta se puede
    pasar con los métodos
  • executeUpdate(String), usada para crear/modificar
    tablas (no hay resultados), típicamente para
    create, update, delete...
  • executeQuery(String) para hacer consultas,
    retornan resultados en un objeto de la clase
    ResultSet, típicamente para select

15
Ejemplos de excuteUpdate
  • stmt.executeUpdate(create table alumno (nombre
    varchar(32), matricula integer, direccion
    varchar(40), añonac integer, ...)
  • stmt.executeUpdate(insert into alumnos (Valeria
    Valencia , 00998852678, Calle bonita 223
    Vitacura Stgo, 1974, ...)
  • stmt.executeUpdate(update alumnos set direccion
    ????? where nombre Valeria Valencia )

16
Ejemplos de excuteUpdate
  • CreateCoffees crea tabla Coffees en base de
    datos test
  • CreateSuppliers igual pero tabla Suppliers
  • DropCoffees Borra ambas tablas
  • MyConnection encapsula la conexión a la base de
    datos (para usarla en los otros programas)
  • InsertCoffees inserta filas en la tabla
  • InsertSupliers inserta filas en la tabla
  • InsertCoffeesDatos inserta filas a partir de
    datos leidos desde un archivo
  • ListCoffes, ListSuppliers muestran el contenido
    (usan executeQuery)

17
Retorno de excuteUpdate
  • El método excuteUpdate retorna un valor entero
    correspondiente al número de filas que la
    sentencia SQL modificó
  • Si se trataba de una creación de tablas el valor
    de retorno es 0
  • Si se trata de insertar una fila el valor es 1
  • El resultado es interesante cuando se usa en una
    sentencia SQL con la instrucción update tabla
    set campo ltexpresióngt where ltcondiciongt

18
Ejemplos de excuteQuery
  • stmt.executeQuery(select from alumnos
    where añonac 1974)
  • Los resultados de una consulta se reciben en un
    objeto de la clase ResultSet
  • ResultSet rs stmt.executeQuery(....)
  • Un ResultSet se puede ver como una enumeración de
    filas que representan el resultado
  • Existen métodos adecuados para recorrer los
    elementos de esta enumeración y recuperar los
    valores de las columnas (campos)

19
El ResultSet
  • ResultSet rs stmt.executeQuery(select nombre
    where direccion like Santiago)
  • while (rs.next())
  • String s rs.getString(nombre)
  • int y rs.getInt(año)
  • System.out.println(s y)
  • ResultSet rs contiene una colección de filas con
    los resultados de la pregunta. La instrucción
    next avanza un puntero que indica en qué fila
    estamos actualmente. Al principio está antes de
    la primera fila, por lo cual se hace necesario
    ejecutar un next() para situarse en la primera

20
La instrucción getXXX
  • Se puede usar con 2 tipos de parámetros
  • getXXX(nombre de columna en la tabla) ej
    getString(nombre)
  • getXXX(número de columna en la tabla) ej
    getString(1)
  • getXXX trata de leer lo que hay en la columna y
    convertirlo al tipo Java especificado en XXX

21
La instrucción getXXX
  • Hay veces en que si bien, el tipo SQL no es el
    mismo que el tipo XXX una conversión es posible
    sin problemas (por ejemplo, con getString y
    getObject se puede recuperar sin problemas
    cualquier cosa)
  • Otras, en que la conversión es posible pero con
    pérdida de información o con posible problema de
    formateo (ej getByte para un numeric o un
    longvarchar
  • Otras, es simplemente imposible (un getLong para
    Time)

22
Prepared Statements
  • Donde se ha usado Satement es generalmente
    posible usar PreparedStatement para hacer más
    eficientes las consultas
  • Una instrucción con PreparedStatement va a ser,
    en la mayoría de los casos, traducida a una
    consulta SQL nativa de la base de datos en tiempo
    de compilación
  • La otra ventaja es que es posible usar parámetros
    dentro de ella, pudiendo hacer más flexibles las
    consultas o hacer varias consultas distintas
    dentro de un ciclo cambiando el valor de algunas
    variables
  • PreparedStatement us con.prepareSatatement(upda
    te alumnos set comuna ? where direccion like
    ?)
  • us.setString(1,Vitacura) us.setString(2,Hual
    tatas)

23
Prepared Statements Ejemplo
  • PreparedStatement updateSales
  • String updateString "update COFFEES "
  • "set SALES ?
    where COF_NAME like ?"
  • updateSales con.prepareStatement(updateString)
  • int salesForWeek 175, 150, 60, 155, 90
  • String coffees "Colombian", "French_Roast",
    "Espresso", "Colombian_Decaf",
    "French_Roast_Decaf"
  • int len coffees.length
  • for(int i 0 i lt len i)
  • updateSales.setInt(1,
    salesForWeeki)
  • updateSales.setString(2, coffeesi)
  • updateSales.executeUpdate()

24
Transacciones
  • Una transacción consiste en una o más sentencias
    que han sido ejecutadas y luego confirmadas
    (commit) o deshechas (rolled back)
  • Auto-commit está preseteado.
  • Si Auto-commit está desactivado se debe usar los
    métodos commit o rollback explícitamente.

25
Transacciones
  • Para hacer uso de transacciones debe primero
    dessetearse elauto-commit
  • con.setAutoCommit(false)
  • PreparedStatement ps .....
  • ....
  • ps.executeUpdate() ....
  • ps.excecuteUpdate() ...
  • con.commit()

26
Stored Procedures
  • Es un grupo de sentencias SQL que se agrupan
    lógicamente en una unidad para efectuar una
    determinada tarea
  • Existen en la mayoría de los DBMS pero son
    dependientes de estas (no es muy estándar la
    forma cómo se escriben/ejecutan)
  • Generalmente reciben parámetros
  • Se escriben con un Update y se ejecutan con un
    Query

27
Un ejemplo
  • Para crear el Stored Procedure
  • String crearSP create prodcedure
    SHOW_SUPPLIERS
  • as
  • select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME
  • from SUPPLIERS, COFFEES
  • where SUPPLIERS.SUP_ID COFFEES.SUP_ID
  • Statement stmt con.CreateStatement()
  • stmt.executeQuery(createSP)
  • Para llamar el Stored Procedure
  • CallableStatement cs
  • cs con.prepareCall(call SHOW_SUPPLIERS)
  • ResultSet rs cs.executeQuery()

28
Usando los metadatos
  • Los metadatos son la información acerca de la
    estructura de una Base de Datos o un ResultSet
  • Se obtiene con el método getMetaData()

stmt con.createStatement() ResultSet rs
stmt.executeQuery(query) ResultSetMetaData rsmd
rs.getMetaData() int numberOfColumns
rsmd.getColumnCount() int rowCount 1 while
(rs.next()) System.out.println("Row "
rowCount " ") for (int i 1 i lt
numberOfColumns i) System.out.print("
Column " i " ") System.out.println(rs.get
String(i)) System.out.println("") rowCount

29
Usando los metadatos
  • Ejemplo para conocer las tablas de una Base de
    Datos

DatabaseMetaData dbmd con.getMetaData() Strin
g dbmsName dbmd.getDatabaseProductName() Resul
tSet rs dbmd.getTableTypes() System.out.print(
"The following types of tables are
") System.out.println("available in "
dbmsName " ") while (rs.next()) String
tableType rs.getString("TABLE_TYPE") System.o
ut.println(" " tableType)
Write a Comment
User Comments (0)
About PowerShow.com