SlideShare une entreprise Scribd logo
1  sur  78
JDBC Java Database Connectivity
Bibliografía ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],  
Objetivos ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Introducción ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Proceso de trabajo con JDBC Aplicación JDBC Driver A Connection Statement Gestor de drivers Driver B ResultSet    getConnection    createStatement    executeQuery
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Proceso de trabajo con JDBC Connection con = DriverManager.getConnection( "jdbc:odbc:misdatos", "login", "password"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1"); while  (rs.next()) { int  x = rs.getInt(”d1"); String s = rs.getString(”d2"); float  f = rs.getFloat(”d3"); } ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Connection con = DriverManager.getConnection( "jdbc:odbc:misdatos", "login", "password"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1"); while  (rs.next()) { int  x = rs.getInt(”d1"); String s = rs.getString(”d2"); float  f = rs.getFloat(”d3"); } ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Connection con = DriverManager.getConnection( "jdbc:odbc:misdatos", "login", "password"); Statement stmt = con.createStatement(); ResultSet rs =  stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1"); while  (rs.next()) { int  x = rs.getInt(”d1"); String s = rs.getString(”d2"); float  f = rs.getFloat(”d3"); } ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Connection con = DriverManager.getConnection( "jdbc:odbc:misdatos", "login", "password"); Statement stmt = con.createStatement(); ResultSet rs  = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1"); while  (rs.next()) { int  x = rs.getInt(”d1"); String s = rs.getString(”d2"); float  f = rs.getFloat(”d3"); }
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
El driver JDBC ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tipos de drivers ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tipos de drivers (II) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tipos de drivers (III) Driver  ODBC
El interface  Driver  y  la clase  DriverManager ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Clase  DriverManager ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Proceso de trabajo con JDBC Aplicación JDBC Driver A Connection Statement Gestor de drivers Driver B ResultSet    getConnection    createStatement    executeQuery
Mantenimiento de la lista de drivers ,[object Object],[object Object],[object Object],[object Object],[object Object],> java -Djdbc.drivers= sun.jdbc.odbc.JdbcOdbcDriver   aplicación Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Dónde poner el  forName ,[object Object],[object Object],[object Object],[object Object],public   class  GestorBD { static  { try  { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch  (ClassNotFoundException e) { System.out.println("No se ha podido cargar el driver de laBD"); }  } ... Resto de la clase }
Obtención de conexiones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Class.forName(" oracle.jdbc.driver.OracleDriver  "); String url = "jdbc:oracle:thin:@localhost:1521:PBD"; Connection con = DriverManager.getConnection(url, "PBD", "pbdpbd");
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
El interface  Connection ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
URLs en JDBC ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo de código de conexión a Oracle try  { Class.forName("oracle.jdbc.driver.OracleDriver"); }  catch  (ClassNotFoundException e) { System.err.println("No se ha podido cargar el driver de la BD"); } ... Connection con =  null ; try  { String url = "jdbc:oracle:thin:@localhost:1521:PBD"; con = DriverManager.getConnection(url, "PBD", "pbdpbd"); ... Trabajo con la conexión }  catch  (SQLException e) { e.printStackTrace(); }  finally  { try  { if  (con !=  null ) con.close(); }  catch  (SQLException e2) { e2.printStackTrace(); } }
Importante ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
El interface  Statement ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Connection con = DriverManager.getConnection(url, usr, pwd); Statement stmt = con. createStatement() ; ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); stmt.executeUpdate("DROP TABLE Table2"); int  n = stmt.executeUpdate("UPDATE Table2 SET a = a + 1");
El interface  Statement   (II) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
El interface  Statement   (III) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo de código para Oracle // Carga del driver (Class.forName ... Connection con =  null ; try  { String url = "jdbc:oracle:thin:@localhost:1521:PBD"; con = DriverManager.getConnection(url, "PBD", "pbdpbd"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(“SELECT  a, b, c FROM Table2"); ... Procesamiento del resultado rs.close(); stmt.close(); }  catch  (SQLException e) { e.printStackTrace(); }  finally  { try  { if  (con !=  null ) con.close(); }  catch  (SQLException e2) { e2.printStackTrace(); } } OJO QUE NO  ACABE EN  ;
Composición del SQL ,[object Object],[object Object],[object Object],String id = "xx67yw8“; String sql =  " SELECT a, b, c FROM Table2 WHERE id =' " + id + " ' " ; ResultSet rs = stmt.executeQuery(sql);
El interface  ResultSet ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); while  (rs.next()) { ... Tratamiento de cada fila }
El interface  ResultSet  (II) ,[object Object],[object Object],[object Object],ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while  (rs.next()) { int  i = rs.getInt("a");  // rs.getInt(1) String s = rs.getString("b");  // rs.getString(2) java.sql.Date f = rs.getDate("c"); // rs.getDate (3) System.out.println(“FILA = " + i + " " + s + " " + f); }
ResultSet  y valores nulos ,[object Object],[object Object],[object Object],[object Object],[object Object],int  i = rs.getInt("a"); // si el valor es null, i vale 0 if  (rs.wasNull() { ... }
Navegación por el  ResultSet ,[object Object],[object Object],[object Object],[object Object]
Tipos de datos y  get<Tipo> ,[object Object],[object Object]
Tipos de datos y  get<Tipo> 
Ejemplo completo try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while  (rs.next()) { int  i = rs.getInt(&quot;a&quot;);  // rs.getInt(1) String s = rs.getString(&quot;b&quot;);  // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); }   try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while  (rs.next()) { int  i = rs.getInt(&quot;a&quot;);  // rs.getInt(1) String s = rs.getString(&quot;b&quot;);  // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); }   Carga del driver try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while  (rs.next()) { int  i = rs.getInt(&quot;a&quot;);  // rs.getInt(1) String s = rs.getString(&quot;b&quot;);  // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); }   Conexión try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while  (rs.next()) { int  i = rs.getInt(&quot;a&quot;);  // rs.getInt(1) String s = rs.getString(&quot;b&quot;);  // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); }   Consulta try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while  (rs.next()) { int  i = rs.getInt(&quot;a&quot;);  // rs.getInt(1) String s = rs.getString(&quot;b&quot;);  // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); }   Procesar resultado
Ejemplo completo (II) ... rs.close(); stmt.close(); }  catch  (SQLException e) { e.printStackTrace(); }  finally  { try  { if  (con !=  null ) con.close(); }  catch  (SQLException e) { e.printStackTrace(); } } ... rs.close(); stmt.close(); }  catch  (SQLException e) { e.printStackTrace(); }  finally  { try  { if  (con !=  null )  con.close(); }  catch  (SQLException e2) { e2.printStackTrace(); } } Cerrar TODO
Ejemplo de prácticas package  sol; import  bd.AbstractDBManager; import  java.sql.*; import  model.*; public   class  GestorBD  extends  AbstractDBManager {  // Registro del driver apropiado para la BD a utilizar static  { try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.out.println(&quot;No puedo cargar el driver JDBC de la BD&quot;); } } public  Articulo getArticulo(String codigo) { }  }
public  Articulo getArticulo(String codigo) { Articulo articulo =  null ; Connection con =  null ; try { con =  DriverManager.getConnection (&quot;jdbc:oracle:thin:@localhost:1521:pbd&quot;,  &quot;prbd&quot;, &quot;prbdprbd&quot;); Statement stm =  con.createStatement (); String sql = &quot; SELECT nombre, PVP FROM Articulo WHERE codigo =' &quot; +codigo+ &quot; ' &quot;; ResultSet res =  stm.executeQuery(sql); if  ( res.next() ) { articulo = new Articulo(codigo,  res.getString(&quot;nombre&quot;) , res.getDouble(&quot;PVP&quot;) ); } res.close(); stm.close(); }  catch  (SQLException e) { e.printStackTrace(); }  finally  { if  (con !=  null )  try  { con.close(); }  catch  (SQLException ex) { ex.printStackTrace(); } } return  articulo; }
El interface  PreparedStatement ,[object Object],[object Object],[object Object],[object Object],Connection con = DriverManager.getConnection(url, usr, pwd); PreparedStatement stmt = con. prepareStatement(... SQL ...) ;
El interface  PreparedStatement ,[object Object],[object Object],[object Object],[object Object],PreparedStatement ps = con.prepareStatement(&quot;UPDATE table SET sueldo= ? WHERE nombre= ? &quot;);
Inyección de SQL ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
El interface  PreparedStatement ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],PreparedStatement ps = con.prepareStatement(&quot;UPDATE table SET sueldo= ? WHERE nombre= ? &quot;); ps.setFloat(1, 1500.0); ps.setString(2, “Pepe&quot;); ps.executeUpdate();
Ejemplo try  { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); }  catch  (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); float  sueldos [] = {1500, 2000, 1205.75f}; String nombres [] = {&quot;Juan&quot;,&quot;Ana&quot;,&quot;Maria&quot;}; PreparedStatement ps = con.prepareStatement(&quot;UPDATE table SET sueldo=? WHERE nombre=?&quot;); for  ( int  i=0;i<sueldos.length;i++) { ps.setFloat(1,sueldos[i]);  ps.setString(2,nombres[i]);  ps.executeUpdate(); } ps.close();
Ejemplo (II) }  catch  (SQLException e) { e.printStackTrace(); }  finally  { try  { if  (con !=  null ) con.close(); }  catch  (SQLException e2) { e2.printStackTrace(); } }
Parámetros con valores  null ,[object Object],[object Object],[object Object],[object Object],PreparedStatement ps = con.prepareStatement(“INSERT INTO Persona(nombre,  casado) VALUES (?,?)&quot;); ps.setString (1, &quot;Juan&quot;); ps.setNull(2, java.sql.Types.BOOLEAN);
Notas sobre fechas (Oracle) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
El interface  CallableStatement ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ejemplo ,[object Object],// Carga del driver ... Connection con =  null ; try  { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); CallableStatement call=con.prepareCall(&quot;{?=call PrecioArticulo(?,?)}&quot;); call.registerOutParameter(1, Types.DOUBLE); call.setString(2, &quot;D786SCO&quot;); call.setInt(3, 10); call.executeQuery(); precioLinea = call.getDouble(1); call.close(); } ... cerrar la conexión
Ejemplo (II) ,[object Object],// Carga del driver ... Connection con =  null ; try  { // ... Establecimiento de la conexión CallableStatement call = con.prepareCall(“{call swap(?, ?)}&quot;); call.registerOutParameter(1, Types.INTEGER); call.registerOutParameter(2, Types.INTEGER); call.setInt(1, 1); call.setInt(2, 2); call.execute(); int r1 = call.getInt(1); int r2 = call.getInt(2); call.close(); System.out.println(&quot;Los valores ahora son &quot;+r1+&quot; y &quot;+r2); } ... cerrar la conexión
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Transacciones en JDBC ,[object Object],[object Object],[object Object],[object Object]
Transacciones en JDBC ,[object Object],[object Object],[object Object],[object Object]
Ejemplo ... Carga del driver ... String URL = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; Connection con =  null ; try  { con = DriverManager.getConnection(URL, &quot;PBD&quot;, &quot;pbdpbd&quot;); con.setAutoCommit( false ); float  sueldos [] = {1500, 2000, 1205.75f}; String nombres [] = {&quot;Juan&quot;,&quot;Ana&quot;,&quot;Maria&quot;}; PreparedStatement ps =con.prepareStatement(&quot;UPDATE table SET sueldo=?&quot;+  &quot;WHERE nombre=?&quot;); for  ( int  i=0;i<sueldos.length;i++) { ps.setFloat(1,sueldos[i]);  ps.setString(2,nombres[i]);  ps.executeUpdate(); } ps.close();  con.commit();
Ejemplo (II) }  catch  (SQLException e) { e.printStackTrace(); try  { if  (con !=  null )  con.rollback(); }  catch  (SQLException e2) { e2.printStackTrace(); } }  finally  { try  { if  (con !=  null ) con.close(); }  catch  (SQLException e2) { e2.printStackTrace(); } }
Control de la concurrencia ,[object Object],[object Object],[object Object],[object Object]
Control de la concurrencia (II) ,[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
SQLException ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DatabaseMetaData ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ResultSetMetaData ,[object Object],[object Object],[object Object],[object Object],[object Object]
Secuencias de escape ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],st.executeQuery(&quot;SELECT * FROM Articulo WHERE Id LIKE '%' {escape 'apos;};
Sobre conexiones ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Pool de Conexiones Aplicación DriverManager new  Connection( con.close() Pool de Conexiones getConnection( getConnection(
Cuando usar  PreparedStatement ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Actualizaciones por lotes ,[object Object],[object Object],[object Object],[object Object],Statement stmt = con.createStatement(); stmt.addBatch( &quot;... un INSERT, algo que no sea SELECT ...&quot;); stmt.addBatch( &quot;...  ... stmt.executeBatch();
ResultSet  recorrible y actualizable ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY );
ResultSet  recorrible y actualizable (II) ,[object Object],[object Object],[object Object],[object Object],[object Object]
Nuevos tipos de datos ,[object Object],[object Object],[object Object],[object Object],[object Object]
javax.sql ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Novedades JDBC 4.0 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Cosas que se quedan en el tintero ,[object Object],[object Object],[object Object]
}  finally  {   try  {   if  (presentacion !=  null )    presentacion.close();   }  catch  (SQLException e) {   e.printStackTrace();   } }

Contenu connexe

Tendances (19)

JDBC
JDBCJDBC
JDBC
 
Jdbc
JdbcJdbc
Jdbc
 
Java DataBase Connectivity
Java DataBase ConnectivityJava DataBase Connectivity
Java DataBase Connectivity
 
Java y Base de Datos
Java y Base de DatosJava y Base de Datos
Java y Base de Datos
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
Java.sql.*
Java.sql.*Java.sql.*
Java.sql.*
 
Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
Java y Bases Datos
Java y Bases DatosJava y Bases Datos
Java y Bases Datos
 
Java Database Connectivity [JDBC]
Java Database Connectivity [JDBC]Java Database Connectivity [JDBC]
Java Database Connectivity [JDBC]
 
JDBC
JDBCJDBC
JDBC
 
Jdbc lenguaje de programación
Jdbc lenguaje de programaciónJdbc lenguaje de programación
Jdbc lenguaje de programación
 
T2 - JDBC
T2 - JDBCT2 - JDBC
T2 - JDBC
 
Jdbc
JdbcJdbc
Jdbc
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Mecanismos de Persistencia en Android
Mecanismos de Persistencia en AndroidMecanismos de Persistencia en Android
Mecanismos de Persistencia en Android
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Jdbc(JAVA DATABASE CONNECTIVITY)
Jdbc(JAVA DATABASE CONNECTIVITY)Jdbc(JAVA DATABASE CONNECTIVITY)
Jdbc(JAVA DATABASE CONNECTIVITY)
 
Jdbc
JdbcJdbc
Jdbc
 

Similaire à Jdbc (20)

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
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
11.android bases de datos
11.android   bases de datos11.android   bases de datos
11.android bases de datos
 
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
 
Jdbc
JdbcJdbc
Jdbc
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
T1 - Introducción
T1 - IntroducciónT1 - Introducción
T1 - Introducción
 
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
 
Jdbc
JdbcJdbc
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)
[ES] Conectividad de java a base de datos(jdbc)
 
Jdbc diapositivva
Jdbc diapositivvaJdbc diapositivva
Jdbc diapositivva
 
Jdbc
JdbcJdbc
Jdbc
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 

Dernier

Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxLINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxkimontey
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
La tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadLa tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadEduardoSantiagoSegov
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdfsharitcalderon04
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armadob7fwtwtfxf
 

Dernier (20)

Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxLINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
La tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadLa tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedad
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdf
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armado
 

Jdbc

  • 1. JDBC Java Database Connectivity
  • 2.
  • 3.
  • 4.
  • 5.
  • 6. Proceso de trabajo con JDBC Aplicación JDBC Driver A Connection Statement Gestor de drivers Driver B ResultSet  getConnection  createStatement  executeQuery
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12. Tipos de drivers (III) Driver ODBC
  • 13.
  • 14.
  • 15.
  • 16. Proceso de trabajo con JDBC Aplicación JDBC Driver A Connection Statement Gestor de drivers Driver B ResultSet  getConnection  createStatement  executeQuery
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. Ejemplo de código de conexión a Oracle try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } ... Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); ... Trabajo con la conexión } catch (SQLException e) { e.printStackTrace(); } finally { try { if (con != null ) con.close(); } catch (SQLException e2) { e2.printStackTrace(); } }
  • 24.
  • 25.  
  • 26.
  • 27.
  • 28.
  • 29.
  • 30. Ejemplo de código para Oracle // Carga del driver (Class.forName ... Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(“SELECT a, b, c FROM Table2&quot;); ... Procesamiento del resultado rs.close(); stmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (con != null ) con.close(); } catch (SQLException e2) { e2.printStackTrace(); } } OJO QUE NO ACABE EN ;
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37. Tipos de datos y get<Tipo> 
  • 38. Ejemplo completo try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while (rs.next()) { int i = rs.getInt(&quot;a&quot;); // rs.getInt(1) String s = rs.getString(&quot;b&quot;); // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); } try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while (rs.next()) { int i = rs.getInt(&quot;a&quot;); // rs.getInt(1) String s = rs.getString(&quot;b&quot;); // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); } Carga del driver try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while (rs.next()) { int i = rs.getInt(&quot;a&quot;); // rs.getInt(1) String s = rs.getString(&quot;b&quot;); // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); } Conexión try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while (rs.next()) { int i = rs.getInt(&quot;a&quot;); // rs.getInt(1) String s = rs.getString(&quot;b&quot;); // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); } Consulta try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(&quot;SELECT a, b, c FROM Table1&quot;); while (rs.next()) { int i = rs.getInt(&quot;a&quot;); // rs.getInt(1) String s = rs.getString(&quot;b&quot;); // rs.getString(2) java.sql.Date f = rs.getDate(&quot;c&quot;); // rs.getDate (3) System.out.println(“FILA = &quot; + i + &quot; &quot; + s + &quot; &quot; + f); } Procesar resultado
  • 39. Ejemplo completo (II) ... rs.close(); stmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (con != null ) con.close(); } catch (SQLException e) { e.printStackTrace(); } } ... rs.close(); stmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (con != null ) con.close(); } catch (SQLException e2) { e2.printStackTrace(); } } Cerrar TODO
  • 40. Ejemplo de prácticas package sol; import bd.AbstractDBManager; import java.sql.*; import model.*; public class GestorBD extends AbstractDBManager { // Registro del driver apropiado para la BD a utilizar static { try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.out.println(&quot;No puedo cargar el driver JDBC de la BD&quot;); } } public Articulo getArticulo(String codigo) { } }
  • 41. public Articulo getArticulo(String codigo) { Articulo articulo = null ; Connection con = null ; try { con = DriverManager.getConnection (&quot;jdbc:oracle:thin:@localhost:1521:pbd&quot;, &quot;prbd&quot;, &quot;prbdprbd&quot;); Statement stm = con.createStatement (); String sql = &quot; SELECT nombre, PVP FROM Articulo WHERE codigo =' &quot; +codigo+ &quot; ' &quot;; ResultSet res = stm.executeQuery(sql); if ( res.next() ) { articulo = new Articulo(codigo, res.getString(&quot;nombre&quot;) , res.getDouble(&quot;PVP&quot;) ); } res.close(); stm.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (con != null ) try { con.close(); } catch (SQLException ex) { ex.printStackTrace(); } } return articulo; }
  • 42.
  • 43.
  • 44.
  • 45.
  • 46. Ejemplo try { Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;); } catch (ClassNotFoundException e) { System.err.println(&quot;No se ha podido cargar el driver de la BD&quot;); } Connection con = null ; try { String url = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; con = DriverManager.getConnection(url, &quot;PBD&quot;, &quot;pbdpbd&quot;); float sueldos [] = {1500, 2000, 1205.75f}; String nombres [] = {&quot;Juan&quot;,&quot;Ana&quot;,&quot;Maria&quot;}; PreparedStatement ps = con.prepareStatement(&quot;UPDATE table SET sueldo=? WHERE nombre=?&quot;); for ( int i=0;i<sueldos.length;i++) { ps.setFloat(1,sueldos[i]); ps.setString(2,nombres[i]); ps.executeUpdate(); } ps.close();
  • 47. Ejemplo (II) } catch (SQLException e) { e.printStackTrace(); } finally { try { if (con != null ) con.close(); } catch (SQLException e2) { e2.printStackTrace(); } }
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56. Ejemplo ... Carga del driver ... String URL = &quot;jdbc:oracle:thin:@localhost:1521:PBD&quot;; Connection con = null ; try { con = DriverManager.getConnection(URL, &quot;PBD&quot;, &quot;pbdpbd&quot;); con.setAutoCommit( false ); float sueldos [] = {1500, 2000, 1205.75f}; String nombres [] = {&quot;Juan&quot;,&quot;Ana&quot;,&quot;Maria&quot;}; PreparedStatement ps =con.prepareStatement(&quot;UPDATE table SET sueldo=?&quot;+ &quot;WHERE nombre=?&quot;); for ( int i=0;i<sueldos.length;i++) { ps.setFloat(1,sueldos[i]); ps.setString(2,nombres[i]); ps.executeUpdate(); } ps.close(); con.commit();
  • 57. Ejemplo (II) } catch (SQLException e) { e.printStackTrace(); try { if (con != null ) con.rollback(); } catch (SQLException e2) { e2.printStackTrace(); } } finally { try { if (con != null ) con.close(); } catch (SQLException e2) { e2.printStackTrace(); } }
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67. Pool de Conexiones Aplicación DriverManager new Connection( con.close() Pool de Conexiones getConnection( getConnection(
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78. } finally { try { if (presentacion != null ) presentacion.close(); } catch (SQLException e) { e.printStackTrace(); } }

Notes de l'éditeur

  1. En realidad JDBC es un nombre comercial por si mismo pero comunmente se conoce por Java Database Connectivity
  2. JDBC: Practical Guide for Java Programmers. Gregory Speegle. Morgan Kaufmann, 1st Ed (nov, 2001). ISBN: 1558607366. Malo JDBC API Tutorial and Reference, Third Edition . Maydene Fisher et al. Addison-Wesley Pub Co; 3rd edition (June 11, 2003). ISBN: 0321173848 Guia oficial de sun Java Programming with Oracle JDBC. Donald Bales. O&apos;Reilly (January 2002). ISBN: 0-596-00088-X Bueno. Muchos detalles sobre Oracle. Saca las castañas del fuego en muchas ocasiones. Principles of DB Systems with Internet and Java . G. Riccardi. Addison Wesley 2001. ISBN: 02-0161-247-X Java Oracle Database Development. David J. Gallardo. Prentice Hall PTR (2003). ISBN: 0-13-046218-7 Me gusta. Muy completo. Ubre muchos temas. Un buen libro de programación de BD y no sólo de JDBC JDBC: Practical Guide for Java Programmers. Gregory Speegle. Morgan Kaufmann, 1st Ed (nov, 2001). ISBN: 1558607366. Database Programming with JDBC and Java, 2 nd Edition . George Reese. O&apos;Reilly, 2000. ISBN: 1565926161 Java Database best Practices. George Reese, O’Reilly, 2003. ISBN: 0-596-00522-9 PARA programadores expertos. Trucos consejos sobre como hacer bien y más eficientemente las cosas JDBC™ Guide: Getting Started . Copyright © 1996, 1997, Sun Microsystems, Inc. Documentación sobre JDBC . http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/index.html. PUNTO DE ARRANQUE Oracle9 i JDBC Developer’s Guide and Reference . Copyright © 1999, 2001 Oracle Corporation. COMPLICADA Y MUY DE DETALLE en relación solo con Oracle
  3. Razonar xq son interfaces y no clases concretas Ideas ya presentadas en el tema de Panorámica. Incidir en que es una capa entre aplicación y SGBDs Puntualizar: aisla de los detalles de un SBD concreto. Por ejemplo el tema de los comodines lo estandariza (es el % aunque en Access sea el *). Pero hay ciertas cosas que no están bien estandarizadas. Por ejemplo las funciones (son muy dependientes de el SGBD, no igual en Oracle que en Access). Además hay ciertas cosas que no están permitidas por el SGBD pr lo que simplemente no las hace. El metaData informa de si el SGBD soporta o no ciertas características.
  4. Decir que la petición de conexión se hace al driver pero que para no ligar la aplicación con un driver concreto (para no tener que recompilar si se cambia luego el SGBD concreto) se hace la petición a un intermediario que elige el driver adecuado y nos devuelve una conexión del tipo adecuado.
  5. Repasar los conceptos de conexión-instrucción-cursor del tema de panorámica
  6. Repasar de nuevo el q son interfaces. Verlos en el javadoc: decir que hay muy pocas clases concretas y que lo demás (los interfaces) es el resultado del proceso de abstracción de los de sun (los que desarrollaron JDBC) que vieron que elementos había en un API de conxión a BDs Mostrar la lista de drivers (ACTUALIZARLA) http://developers.sun.com/product/jdbc/drivers
  7. Los drivers que tiene Orace son de tpo 2 (el OCI) y de tipo 4 (el thin) Para uso con proc almac convene usar el OCI (es más rápido) En el caso de tipo 3: Oracle tiene una cosa llamada ConnectionManaget que actúa como ese middleware (ver Java Programming with Oracle JDBC cap 2 y sec 3.4, 3.4.1)
  8. En la página de Sun http://developers.sun.com/product/jdbc/drivers no se listan drivers de tipo 3.
  9. Decir que aunque nos referiramos al conjunto de clases que implementan los interfaces JDBC como driver ODBC hay entre esos interface uno que se llama Driver y cuya responsabilidad es dar conexiones Vover a decir que no se usa la clase concreta de driver, xq si lo hacemos perdemos la posibilidad de reutilizar el código con otra BD Si mi código empieza { OracleDriver driver = new OracleDriver(); Connection con = driver.connect(...); Si luego quiero usar el JdbcOdbcDriver, debo entrar en el código, cambiar y luego recompilar.
  10. Decir que la petición de conexión se hace al driver pero que para no ligar la aplicación con un driver concreto (para no tener que recompilar si se cambia luego el SGBD concreto) se hace la petición a un intermediario que elige el driver adecuado y nos devuelve una conexión del tipo adecuado.
  11. Hemos dicho que el Driverman guarda una lista de los drivers disponibles Como se forma esa lista … Si se desea introducir un nuevo driver después de que el DriverManager se halla inicializado se utilizará el método forname de la clase Class  este método carga ña clase y la clase al cargarse se autoregistra
  12. Otras URL para otros drivers de Oracle (ver Java Programming with Oracle JDBC cap 2): Para OCI en Oracle 8: oci8 ... jdbc:oracle:oci8@&lt;nombre tns&gt; Para OCI en Oracle 9: oci ... jdbc:oracle:oci@&lt;nombre tns&gt; Para el driver interno de Oracle: kprb ... ??? Con los OCI sólo se puede usar lo de tns_name y con el thin sólo lo de host:port:sid Hay una direción especial para contactar con la BD local: se trata de dejar en blanco la localización de la BD. Se supone, entonces, que se desea conectar con la BD local: jdbc:oracle:oci@ Mucho ojo! El driver (el classes12.jar) a usar debe ser el correspondiente (exacto) a la versión instalada. Recomiendo copiar el classes12.jar de la carpeta en la que esté como resultado de la instalación y usar ese. Si no puede haber problemas de jaa.lang.UnsatisfiedLinkError en la llamada (ver Java Programming with Oracle JDBC cap 2).
  13. Recordar aquí lo de la Breve Intro a la ejec de Statements SQL en la BD que habré tendio que dar antes: alli se introducía el conepto de cursor, … Xej se puede ejecutar stmt.executeUpdate(&amp;quot;begin Insert into mktg values(1000,&apos;xxx&apos;); Insert into mktg values(1001,&apos;yyy&apos;); end;&amp;quot;); Inserta las dos tuplas
  14. Y según parece comprobarse aunque se cierre el resultset (cursor), si no se cierra el staement no se cierra definiivamente el cursor. Esto me paso en la aplicación de corregir lo de practicas de sql, que creaba muchos statements (no lo cerraba) en una misma conexión y aunque tuve l cuidado de cerar los resultsets me dio error de demaisados cusores abiertos. Cuando cere el satement no me dio mas el problema
  15. Hablar recordar un poco que es la optimización de consultas (referirles a la página web de la asignatura de BD en la que deben estar esos contenidos) y que es el plan de consulta. La sentencia se prepara y luego se ejecuta tantas veces como sea necesario con el plan de ejecución determinado durante la preparación
  16. Cada ? Será sustituido por un valor de campo. No vale para nombres de campos ni de tablas. Además al sustituir el valor se aplica el formato adecuado, ej si es varchar, se pone entre ‘’. Esto ayuda a comprender xq esto ESTA MAL String sql = “Select * from articulo where upper(nombre) like upper(‘%?%’)”  al traducir hará … like upper(‘%’ algo’%’) MAL PreparedStatement ps = con.prepareStatement(sql); ps.setString(1,”algo”); Y SI ESTA BIEN String sql = “Select * from articulo where upper(nombre) like upper(?)”  al traducir hará … like upper(‘%algo%’) BIEN PreparedStatement ps = con.prepareStatement(sql); ps.setString(1,”%algo%”); // Es aquí donde ponemos los % Inyecciones de SQL: Ejemplo teclear en el text de un form que pide el nombre de usr lo siguiente admin’ -- y dejar en balnco el de contrseña Si esto se inserta en el siguiente SQL select * from Users where idUsr=‘*’ and pwd=‘**’ Al componer el SQL queda select * from Users where idUsr=‘admin’ --’ and pwd=‘**’ Si el -- es el carácter de comentario esto hace que No se compruiebe la contraseña y se puede entrar en la aplicaicón. EL prepares evita esto xq trata el texto como texto El usar ’12-12-2004’ funciona en Access y en Oracle public class PruFehasAccess { public static void main(String[] args) { String url = &amp;quot;jdbc:odbc:a&amp;quot;; try { Class.forName(&amp;quot;sun.jdbc.odbc.JdbcOdbcDriver&amp;quot;); } catch (ClassNotFoundException e) { System.out.println(&amp;quot;No se ha podido cargar el driver de la JDBC-ODBC&amp;quot;); } Connection con = null; try { con = DriverManager.getConnection(url, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); Statement select = con.createStatement(); int i = select.executeUpdate(&amp;quot;INSERT INTO a values(&apos;12-12-2003&apos;)&amp;quot;); select.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (con != null) con.close(); } catch (SQLException ex) { } } } }
  17. Criticas al uso de ? Para defenderse del String Interpolation El uso de parámetros posicionales no escala bien: Para dar valor hay que usar la posición y si la query es larga es complicado de entender, tracear … Hay que dar muchos valores y se pierde el control No sirve para todas los casos: &amp;quot;SELECT x, y, z FROM Table WHERE id IN ($set_of_ids)&amp;quot;
  18. Cuando se trata de comparaciones no funciona bien y hay que poner el is null. Por ejemplo el código siguiente no funciona a no ser que pongamos lo del is null (no funciona no en Oracle ni en Access): package bd; import util.ResultSetDisplayer; import java.sql.*; public class PruebaPreparedConNull { // Registro del driver apropiado para la BD a utilizar static { try { Class.forName(&amp;quot;sun.jdbc.odbc.JdbcOdbcDriver&amp;quot;); } catch (ClassNotFoundException e) { System.out.println(&amp;quot;No puedo cargar el driver JDBC de la BD&amp;quot;); } } public static void main(String[] args) { try { Connection con = DriverManager.getConnection(&amp;quot;jdbc:odbc:xx&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;); PreparedStatement ps = con.prepareStatement(&amp;quot;select * from finca where calefacción = ?&amp;quot;); // PreparedStatement ps = con.prepareStatement(&amp;quot;select * from finca where calefacción is null&amp;quot;); Esto si funciona // ps.setString(1, null); ps.setNull(1, Types.VARCHAR); // Es lo mismo que lo de arriba y tp funciona bien ResultSet rs = ps.executeQuery(); ResultSetDisplayer rsd = new ResultSetDisplayer(rs); rsd.print(); rs.close(); ps.close(); con.close(); } catch (SQLException ex) { ex.printStackTrace(); } } }
  19. Oracle tiene dos (tres) tipos para fechas, lo de tres es por el Time que sólo almacena hora Aunque esta no existe en Oracle, la tercer es una TIMESTAMP with time zone
  20. No dejarse las {} y poner call en minúsculas Si no hay params no se pone (), aunque en Oracle da igual ponerlo que no, en JDBC. Es decir se puede poner {?=call TamanioMedioAlbum} o {?=call TamanioMedioAlbum()} Pero en SQL, no da igual call TamanioMedioAlbum() into :x; FUNCIONA call TamanioMedioAlbum into :x; NO FUNCIONA select TamanioMedioAlbum() from dual; FUNCIONA select TamanioMedioAlbum() from dual; FUNCIONA
  21. Ej: se puede contar algo sobre hacer un pedido: el usr mete varias líneas pero se equivoca y en una mete una cantidad negativa. EL sistema lo detecta en forma de restricción de integridad violada. El error debe ser reportado al usr, pues el sistema no sabe como corregirlo (no puede adivinar qué cantidad quería el usr). Pero lo que no puede ser es que quede el pedido a medias de meter (xq no corresponde con ningún pedido real, xq luego se va a intentar de nuevo y estría en parte duplicado, xq el usr se arrepiente y no quiere meterlo).
  22. Hay una pequeña diferencia en el comportamiento del nivel de aislamiento serializable en Java y el SQLPlus: Si se abren dos sesiones SQLPlus y se ponen a serializable, en ese momento es como si se hiciese una foto de cómo están las tablas. Si se hace un update+commit en una sesión en la otra el select devolverá el estado pre-update de la tabla alterada en la otra sesion. En java no es del todo así. Si se abren dos conexiones a una BD y se ponen a serializable; si se hace un update+commit en una sesión en la otra el cambio se ve o no dependiendo si hemos empezado ya a hacer cosas: si en la segunda sesión no se ha hecho ningún select se ve el cambio; si ya se ha hecho un select (aunque sea de otra tabla) el cambio no se ve.
  23. Cualquier error que puede aparecer en la ejecución normal: deadlock, no serializable, bloqueo no admitido, ... (mostrar la lista inmensa de errores posibles en ORA)
  24. Propiedades sobre lo que puede hacer la BD y el driver: procedimientos almacenados, outer joins, … transaciones select for update, savepoints, … Funciones que incluye la BD (to_date, …) y tipos que soporta
  25. {escape ‘’} en Oracle es … nombre like ‘\_%’ escape ‘’ y que las secuecnias {d ‘yyyy-mm-dd} no funcioa en SQL directamente Esto hace que la sintaxis de escape sea independiente de la DBMS y permite al programador usar características que de otro modo no estarían disponibles. Los caracteres “%” y “_” trabajan como comodines en la cláusula SQL LIKE (“%” significa cero o más caracteres y “_” significa exactamente un carácter”. En orden a interpretarlos literalmente, pueden estar precedidos por un backslash (‘’), que es un carácter de escape especial en cadenas. Se puede especificar un carácter que se use como carácter de escape por la inclusión de la sintaxis siguiente al final de la consulta. {escape &apos;escape-character&apos;} Por ejemplo, la siguiente consulta, usando backslash como carácter de escape, encuentra nombres de identificador que comiencen con ‘_’. stmt.executeQuery(&amp;quot;SELECT name FROM Identifiers WHERE Id LIKE &apos;\_%&apos; {escape &apos;&apos;};
  26. Las conexiones son un recurso limitado: hay que cerrarlas Pero cuando? ¿Tras cada transacción? ¿Se pueden conservar entre transacciones? Depende mucho del tipo de aplicación y de las necesidades se pueden conservar Si hay pocos usr concurrenetes Si hay que mantener las props de transacciones en varias interacciones Pero hay que comprobar que la conexión está viva (y no siempre funciona el isAlive() y hay que hacer queries como SELECT 7 FROM DUAL Hay que cerrarla si hay muchos usrs conectados concurrentemente, por ejemplo en portales (pensar que si la sesión duran 30 m en 30 m pueden entrar miles de usrs). En estos casos tras cada servicio hay que cerrar la conexión. Se suelen usar Pool de conexiones
  27. (ver tb http://www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how-to-use-them-properly ) Ultima opnión de Kyte leída: The use of a Statement in JDBC should be 100% localized to being used for DDL (ALTER, CREATE, GRANT, etc) as these are the only statement types that cannot accept BIND VARIABLES. PreparedStatements or CallableStatements should be used for EVERY OTHER type of statement (DML, Queries). As these are the statement types that accept bind variables. This is a fact, a rule, a law -- use prepared statements EVERYWHERE. Use STATEMENTS almost no where. (ver C:usrFranMasterJDBCAsk-Tom- Statements vs PreparedStatements.doc) Segun Thomas Kyte, SIEMPRE ES MEJOR Prepared que Statement. Exise un bechmark que será el que leí yo en su dñia que decía que sólo era mejor si se repetía muchas veces la query. Pero kyte analiza xq salía ese resulatdo y corrige el test para comprobar que siempre es mejor (ver Effectie Oracle By Design; Oracle Press pág 273). Why Prepared Statements are important and how to use them &amp;quot;properly&amp;quot; Databases have a tough job. They accept SQL queries from many clients concurrently and execute the queries as efficiently as possible against the data. Processing statements can be an expensive operation but databases are now written in such a way so that this overhead is minimized. However, these optimizations need assistance from the application developers if we are to capitalize on them. This article shows you how the correct use of PreparedStatements can significantly help a database perform these optimizations. How does a database execute a statement? Obviously, don&apos;t expect alot of detail here; we&apos;ll only examine the aspects important to this article. When a database receives a statement, the database engine first parses the statement and looks for syntax errors. Once the statement is parsed, the database needs to figure out the most efficient way to execute the statement. This can be computationally quite expensive. The database checks what indexes, if any, can help, or whether it should do a full read of all rows in a table. Databases use statistics on the data to figure out what is the best way. Once the query plan is created then it can be executed by the database engine. It takes CPU power to do the access plan generation. Ideally, if we send the same statement to the database twice, then we&apos;d like the database to reuse the access plan for the first statement. This uses less CPU than if it regenerated the plan a second time. Statement Caches Databases are tuned to do statement caches. They usually include some kind of statement cache. This cache uses the statement itself as a key and the access plan is stored in the cache with the corresponding statement. This allows the database engine to reuse the plans for statements that have been executed previously. For example, if we sent the database a statement such as &amp;quot;select a,b from t where c = 2&amp;quot;, then the computed access plan is cached. If we send the same statement later, the database can reuse the previous access plan, thus saving us CPU power. Note however, that the entire statement is the key. For example, if we later sent the statement &amp;quot;select a,b from t where c = 3&amp;quot;, it would not find an access plan. This is because the &amp;quot;c=3&amp;quot; is different from the cached plan &amp;quot;c=2&amp;quot;. So, for example: for ( int I = 0; I &lt; 1000; ++I) {   PreparedStatement ps = conn.prepareStatement(&amp;quot;select a,b from t where c = &amp;quot; + I);   ResultSet rs = Ps.executeQuery();   Rs.close();   Ps.close(); } Here the cache won&apos;t be used. Each iteration of the loop sends a different SQL statement to the database. A new access plan is computed for each iteration and we&apos;re basically throwing CPU cycles away using this approach. However, look at the next snippet: PreparedStatement ps = conn.prepareStatement(&amp;quot;select a,b from t where c = ?&amp;quot;); for(int I = 0; I &lt; 1000; ++I) {   ps.setInt(1, I);   ResultSet rs = ps.executeQuery();   Rs.close(); } ps.close(); Here it will be much more efficient. The statement sent to the database is parameterized using the &apos;?&apos; marker in the sql. This means every iteration is sending the same statement to the database with different parameters for the &amp;quot;c=?&amp;quot; part. This allows the database to reuse the access plans for the statement and makes the program execute more efficiently inside the database. This basically let&apos;s your application run faster or makes more CPU available to users of the database. PreparedStatements and J2EE servers Things can get more complicated when we use a J2EE server. Normally, a prepared statement is associated with a single database connection. When the connection is closed, the preparedstatement is discarded. Normally, a fat client application would get a database connection and then hold it for its lifetime. It would also create all prepared statements eagerly or lazily. Eagerly means that they are all created at once when the application starts. Lazily means that they are created as they are used. An eager approach gives a delay when the application starts but once it starts then it performs optimally. A lazy approach gives a fast start but as the application runs, the prepared statements are created when they are first used by the application. This gives an uneven performance until all statements are prepared but the application eventually settles and runs as fast as the eager application. Which is best depends on whether you need a fast start or even performance. The problem with a J2EE application is that it can&apos;t work like this. It only keeps a connection for the duration of the request. This means that it must create the prepared statements every time the request is executed. This is not as efficient as the fat client approach where the prepared statements are created once, rather than on every request. J2EE vendors have noticed this and designed connection pooling to avoid this performance disadvantage. When the J2EE server gives your application a connection, it isn&apos;t giving you the actual connection; you&apos;re getting a wrapper. You can verify this by looking at the name of the class for the connection you are given. It won&apos;t be a database JDBC connection, it&apos;ll be a class created by your application server. Normally, if you called close on a connection then the jdbc driver closes the connection. We want the connection to be returned to the pool when close is called by a J2EE application. We do this by making a proxy jdbc connection class that looks like a real connection. It has a reference to the actual connection. When we invoke any method on the connection then the proxy forwards the call to the real connection. But, when we call methods such as close instead of calling close on the real connection, it simply returns the connection to the connection pool and then marks the proxy connection as invalid so that if it is used again by the application we&apos;ll get an exception. Wrapping is very useful as it also helps J2EE application server implementers to add support for prepared statements in a sensible way. When an application calls Connection.prepareStatement, it is returned a PreparedStatement object by the driver. The application then keeps the handle while it has the connection and closes it before it closes the connection when the request finishes. However, after the connection is returned to the pool and later reused by the same, or another application, , then ideally, we want the same PreparedStatement to be returned to the application. J2EE PreparedStatement Cache J2EE PreparedStatement Cache is implemented using a cache inside the J2EE server connection pool manager. The J2EE server keeps a list of prepared statements for each database connection in the pool. When an application calls prepareStatement on a connection, the application server checks if that statement was previously prepared. If it was, the PreparedStatement object will be in the cache and this will be returned to the application. If not, the call is passed to the jdbc driver and the query/preparedstatement object is added in that connections cache. We need a cache per connection because that&apos;s the way jdbc drivers work. Any preparedstatements returned are specific to that connection. If we want to take advantage of this cache, the same rules apply as before. We need to use parameterized queries so that they will match ones already prepared in the cache. Most application servers will allow you to tune the size of this prepared statement cache. Comentarios del documento de consultoria de reingeniería de Saunier Duval (pueden estar obsoletos – HAY ERRORES según Thomas Kyte (ver coemntario de arriba)) Sobre el uso de PreparedStatement en vez de Statements El API Java para acceso a bases de datos (JDBC) proporciona dos instrumentos para la realización de consultas y actualizaciones: Statement y PreparedStatement. El propósito del segundo es optimizar la ejecución de la operación. Para ello el driver accede una vez a la BD para recuperar los metadatos asociados a la consulta (tipos, estructuras de tablas, …) y los reutiliza en posteriores accesos. En contraposición, un Statement hace dos accesos a la BD cada vez: uno para recuperar los metadatos asociados a la operación, y otro para ejecutarla. Podría pensarse, por tanto, que usar un PreparedStatement siempre será más eficiente que emplear su correspondiente Statement. Sin embargo los datos experimentales no demuestran tal cosa: En primer lugar es preciso aclarar que casi todos los gestores de base de datos realizan un cacheo interno de las consultas (selects) que procesan, almacenando el plan de ejecución para posteriores reutilizaciones. El efecto de PreparedStatement en consultas se ve superado por esta optimización a nivel de SGBD, por lo que su empleo se ha de limitar a el caso de consultas de actualización (insert, update, delete). Un objeto PreparedStatement está vinculado a la conexión JDBC que lo crea, por lo que, si se cambia de conexión, se debe crear y recompilar de nuevo, eliminándose, evidentemente, el efecto de la optimización. A pesar de que pudiera parecer que a partir de la segunda ejecución, y posteriores, un PreparedStatement es al menos un 50 % más rápido que un Statement, experimentalmente es posible comprobar que el rendimiento de PreparedStatement no es superior al de Statement hasta que al consulta no se repite unas 125 veces( Utilizando el Thin driver de Oracle, sobre base de datos Oracle 8.1.6) . La sobrecarga de utilización de un objeto PreparedStatement (el tiempo de preparación de la operación es siginificativamente más grande que el de la correspondiente Statement) explica este comportamiento. Ya que cada PreparedStatement está asociado con cada conexión, que en el portal se utiliza un pool de conexiones (de tamaño mínimo 10), que, para sacar partido de la optimización, es preciso repetir la ejecución de cada PreparedStatement más de 100 veces, que las conexiones en el pool son destruidas periódicamente para evitar problemas de obsolescencia, y que las consultas que se pueden optimizar (actualizaciones) son menos habituales, se deduce que es muy difícil garantizar una mejora en el rendimiento imputable al uso de PreparedStatement. Si a lo anterior añadimos la consideración del sobre-coste de diseño y codificación que implica el empleo de este tipo de objetos JDBC
  28. SOLO vale para Statement. Si se prueba a hacer con PreparedStatement fall (método no soportado). Al menos en Oracle. SI no se dice nada no es transacional. Es decir cada instrucción del lote se autoconfirma. Se puede comprobar con el siguiente codigo (en el que se hace fallar al lote al incluir un dato que viola una restricción). Se comprueba que los datos anteriores si están en la BD (si se hace un setAutocomit false ya no estárán los datos): import bd.ConnectionManager; import java.sql.Connection; import java.sql.*; public class PruBatch { public static void main(String[] args) { initBD(); añadeDatos(); } private static void initBD() { Connection con = null; try { con = ConnectionManager.getConnection(); Statement stm = con.createStatement(); stm.addBatch(&amp;quot;drop table AAAA cascade constraints&amp;quot;); stm.addBatch(&amp;quot;create table AAAA (a Number(1,0) check (a&gt;0))&amp;quot;); stm.executeBatch(); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); } finally { if (con != null) { try { ConnectionManager.returnConnection(con); } catch (SQLException ex1) { ex1.printStackTrace(); } } } } private static void añadeDatos() { Connection con = null; try { con = ConnectionManager.getConnection(); Statement stm = con.createStatement(); stm.addBatch(&amp;quot;insert into AAAA values (1)&amp;quot;); stm.addBatch(&amp;quot;insert into AAAA values (2)&amp;quot;); stm.addBatch(&amp;quot;insert into AAAA values (3)&amp;quot;); stm.addBatch(&amp;quot;insert into AAAA values (-4)&amp;quot;); stm.addBatch(&amp;quot;insert into AAAA values (5)&amp;quot;); stm.executeBatch(); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); } finally { if (con != null) { try { ConnectionManager.returnConnection(con); } catch (SQLException ex1) { ex1.printStackTrace(); } } } } }
  29. ResultSet.TYPE_SCROLL_INSENSITIVE , una vez consultados los datos si estos son cambiados por terceros no veremos los cambios. Los cambios no se sincronizan De esto habla un poco el libro “Databases and Transaction Processing”, pág 305. Scroll insensitive : Usa un cursor INSENSITIVE supone que una vez hecha la consulta los cambios realizados en las tablas subyacentes a la consulta por otros usuarios, transacciones, sesiones (como quiera verse) o por la misma transacción que creo el resultset (que puede, tras consultar el resultset, hacer cambios en la stablas y seguir teniendo el result set a medias de procesar), que esos cambios no son visibles por el result set Scroll sensitive: usa un Cursor SENSITIVE. SQL standard no define un comportamiento esperado cunado la opción INSENSITIVE. Los abricantes de SGBD pueden hacer lo que quieran y JDBC lo que hace es proporcionar la semántica del SGBD subyacente. Muchos usan lo que se denomina semantica KEYSET_DRIVEN, por la cual los updates y deleets son visibles pero los inserts no. Para actualizar hay una serir de métodos update&lt;Tipo&gt; y luego se hace updateRow(). Tambien se puede hacer insertRow() para añadir una fila vacía y luego grabarla con updateRow. El control de la concurrencia los cambios he leido que se hace con locks de escritura, de modo que solo un cada vez puede tener el resultset; otras implementacione spueden usar estrategias optimistas. Ej: con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );   Luego, para cambiar los datos se usan métodos updateXxx(). Por ejemplo:   ResultSet rs = stmt.executeQuery(&amp;quot;SELECT * FROM Cosa&amp;quot;); while (rs.next()) { if ( true ) { double delta = 8; double precio = rs.getDouble(&amp;quot;Precio&amp;quot;); rs. updateDouble (&amp;quot;Precio&amp;quot;, precio+delta); rs. updateRow (); }
  30. Incluso en drivers que si las soportan, determinadas queries complejas pueden devolver resultados que por ejemplo no sean modificables : supongo (eso es mio) que pasará algo parecido a lo que sucede con las vistas; habrá resultados que no se puedan actualizar: uniones, groups, ...
  31. JDBC 3 incluye cosas sobre (ver tb http://www.ibm.com/developerworks/java/library/j-jdbcnew/): - conexiones: parametros standard - cacheo/pooling de prepared statements - parámetros con nombre (no solo posición) en CallableStatements - resultset que no se cierran al hacer commit en la conexión (resultSet holdability) - se pueden tener abiertos a la vez en instrucciones que devuelvan varios resultsets - Se pueden recuperar los valores autogenerados que se suelen usar en campos clave (en SGBD que lo permitan, claro; Oracle lo dudo) - mejoras en resultset para poder get y set tipos CLOB BLOB y ARRAY
  32. The DriverManager.getConnection method has been enhanced to support the Java Standard Edition Service Provider mechanism. JDBC 4.0 Drivers must include the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC driver’s implementation of java.sql.Driver.
  33. Interrogación didáctica – evaluación formativa Cuál es el proceso de trabajo con JDBC? (cargar driver, abrir conexión, statem, procesar, cerrar) ¿Cómo se procesa un ResultSet? (next y getXXX) ¿Hay que cerrar el ResultSet? ¿Hay que cerrar la conexión? Hemos dicho “La aplicación no suele trabajar directamente con el Driver concreto”. ¿Qué pasaría si trabajasemos con un driver concreto en una determinada aplicación (falta de genericidad)? ¿Qué hay que hacer para que una aplicación construida con JDBC cambie la BD sobre la qe trabaja (cambiar los params de conexión) Cosas a mandar: Lectura/escritura de CLOBS CachedRowSet