CC5002 -‐ Desarrollo de Aplicaciones Web - U-Cursos

44
CC5002 Desarrollo de Aplicaciones Web Clase 6: SQL y JDBC Nicolás Silva, Universidad de Chile 1

Transcript of CC5002 -‐ Desarrollo de Aplicaciones Web - U-Cursos

CC5002  -­‐  Desarrollo  de  Aplicaciones  Web  

Clase  6:  SQL  y  JDBC  

Nicolás  Silva,  Universidad  de  Chile   1  

Plan  de  clases  proyectado  (1era  Mitad)  

1.  Intro  2.  HTTP  y  HTML  3.  Servlets  y  Tomcat  4.  JSP  y  Threads  5.  Sesiones  y  Cookies  6.  -­‐>Bases  de  datos  7.  JavaBeans  8.  JSP  

9.  MVC  10. JSTL  11. Seguridad  12. CSS    13. Javascript  14. AJAX  15. Control  

Nicolás  Silva,  Universidad  de  Chile   2  

Clase  de  Hoy  

•  Temas  AdministraZvos  •  Preguntas  •  SQL  •  JDBC  

Nicolás  Silva,  Universidad  de  Chile   3  

Pregunta  para  Uds.  

•  Están  disfrutando  la  Tarea  3?  

Nicolás  Silva,  Universidad  de  Chile   4  

Pregunta  para  Uds.  

•  Como  almacenarían  su  base  de  datos  en  el  disco?  – Usando  un  archivo?  

•  Leen  y  escriben  el  archivo  completo?  •  En  que  formato?  •  Serialización  en  Java?  •  Archivos  CSV?  

– Usando  una  base  de  datos  relacional?  

Nicolás  Silva,  Universidad  de  Chile   5  

Tareas  de  una  Base  de  Datos  

•  Crear  el  archivo  •  Determinar  su  estructura  •  Leer/Escribir  el  archivo  completo?  •  Agregarlo  en  el  final?  •  Encontrar  un  registro  en  parZcular  •  Solamente  cambiar  un  registro  en  parZcular  •  Cambiar  múlZples  registros  •  Cambiar  múlZples  registros  sin  interferir  con  otros  Threads  que  están  haciendo  lo  mismo!  

Nicolás  Silva,  Universidad  de  Chile   6  

Otras  tareas  

•  Respaldo  

•  Seguridad  

•  Detección/Reparación  de  datos  corruptos  

•  Desempeño  

Nicolás  Silva,  Universidad  de  Chile   7  

Desde  los  viejos  Zempos…  

•  El  sistema  operaZvo  provee  una  estructura  de  archivos  organizada  por  – Por  Secuencia  – RelaZvos  – En  B-­‐Trees  –  Índice  Secundario  

Nicolás  Silva,  Universidad  de  Chile   8  

Archivos  por  Secuencia  •  Archivos  donde  solo  se  puede  agregar  info  –  Los  registros  varían  en  tamaño  –  La  cabecera  indica  el  tamaño  –  Se  borran  registros  con  un  pequeño  flag  

–  Se  encuentran  registros  por  •  Offset  (O(1))  •  Búsqueda  secuencial  (O(n))  

–  Se  recupera  el  espacio  reescribiendo  el  archivo.  

Nicolás  Silva,  Universidad  de  Chile   9  

Brieva  

Longton  

Bachelet  

López  

Tapia  

Archivos  por  posición  relaZva  •  Es  un  arreglo  de  registros  – Los  registros  Zenen  un  tamaño  fijo  – Se  borran  registros  

•  Con  un  flag  

•  Se  encuentran  registros  por  – Numero  de  Registro  (O(1))  – Búsqueda  secuencial  (O(N))  

Nicolás  Silva,  Universidad  de  Chile   10  

Brieva  

Longton  

Bachelet  

López  

Tapia  

Archivos  en  B-­‐Trees  •  Árbol  N-­‐ario  

–  Las  paginas  de  índices  son  fijas  en  tamaño  

–  Registros  pueden  variar  en  tamaño  

–  Paginas  de  índice  parcialmente  llenas  •  Se  dividen  cuando  se  llenan  

–  Paginas  de  índice  se  cachean  

•  Se  borran  los  registros  –  Se  remueve  el  registro  y  se  actualiza  el  índice  

•  Se  buscan  registros  por  –  Key  (O(log(n)))  –  Búsqueda  secuencial  (O(N))  

Nicolás  Silva,  Universidad  de  Chile   11  

Índices  Secundarios  •  Cuando  quieres  acceder  registros  por  múlZples  keys  

•  Son  B-­‐Trees  indexados  por  diferentes  key  

Nicolás  Silva,  Universidad  de  Chile   12  

Después  llego  el  Monitor  de  Transacciones  

•  Control  de  concurrencia  •  Respaldos  •  Recuperación  contra  Fallos  •  Seguridad  

Nicolás  Silva,  Universidad  de  Chile   13  

Hoy  Tenemos  Bases  de  Datos  Relacionales  

•  Internamente  tenemos:  – Estructura  de  archivos  

•  Por  Secuencia  •  RelaZvos  •  B-­‐Trees  •  Índices  Secundarios  

•  Tipos  de  Datos  – Caracteres  – Enteros  – Flotantes  – Fechas  – BLOBs  

Nicolás  Silva,  Universidad  de  Chile   14  

BD  Relacionales  nos  Proveen  

•  Control  de  Concurrencia  •  Recuperación  contra  Fallos  •  Respaldos  •  Soporte  para  mulZ-­‐procesadores  

Nicolás  Silva,  Universidad  de  Chile   15  

Solo  Escribir  SQL  

•  SQL  –  Structured  Query  Language  – SQL  es  “Estándar”  

Nicolás  Silva,  Universidad  de  Chile   16  

Base  de  Datos  Típica  

•  Una  base  de  datos  relacional  es  organizada  en  varias  tablas  

•  Tabla:  telefonos  

Nicolás  Silva,  Universidad  de  Chile   17  

apellido   nombre   telefono  

Piñera   SebasZan   2248954  

Brieva   Francisco   2439725  

Ejemplo  Base  de  Datos  Relacional  

•  MySQL  Community  Server  – GraZs  desde  www.mysql.com  

•  Disponible  para  Windows,  Linux  y  Mac  OS  X  •  Yo  estoy  usando  la  versión  5.1.44  

– Buena  documentación  existente  •  Instrucciones  de  instalación/configuración  •  Tutoriales  •  Manuales  de  referencia  

Nicolás  Silva,  Universidad  de  Chile   18  

MySQL  

•  Instalación  estándar  corre  como  un  servicio  de  Windows  

•  Por  default  no  esta  habilitado  el  acceso  remoto  

•  Correr  el  cliente:  mysql  –u  root  -­‐p  •  (Luego  lo  accederemos  desde  Java  usando  JDBC  

Nicolás  Silva,  Universidad  de  Chile   19  

Ejemplo  •  create database clase6;

•  use clase6; •  create table telefonos (apellido varchar(20),

nombre varchar(20), telefono varchar(20));

•  insert into telefonos values (‘Piñera’,’Sebastian’,null);

•  select * from telefonos;

•  update telefonos set telefono = ‘2245533’ where apellido = ‘Piñera’;

•  delete from telefonos where apellido=‘Piñera’;

•  drop table telefonos;

Nicolás  Silva,  Universidad  de  Chile   20  

Podemos  hacer  mas  con  SQL  

•  …  order  by  •  Muchos  Zpos  de  datos:  integer  – Concepto  de  null  

•  Joins  – Unimos  el  resultado  de  2  tablas  

•  Hay  muchos  cursos  dedicados  únicamente  a  bases  de  datos  

Nicolás  Silva,  Universidad  de  Chile   21  

Normalmente  un  “Id  de  Registro”  es  usado  

•  IdenZfica  únicamente  una  fila  •  MySQL  soporta  esto  con  “auto_increment”  •  Se  usa  un  B-­‐Tree  para  indexar  y  encontrar  rápidamente  la  fila  

Nicolás  Silva,  Universidad  de  Chile   22  

id   apellido   nombre   telefono  

1   Piñera   SebasZan   2248954  

2   Brieva   Francisco   2439725  

Ejemplo  de  auto_increment  •  create table telefonos (id not null

auto_increment, apellido varchar(20), nombre varchar(20), telefono varchar(20), primary key(id));

•  insert into telefonos values (‘Bachelet’,’Michelle’,null);

•  select * from telefonos where id=1;

•  update telefonos set telefono = ‘2245533’ where id=1;

•  delete from telefono where id=1;

Nicolás  Silva,  Universidad  de  Chile   23  

Pueden  chequear  la  base  de  datos  “mysql”  

•  Esta  conZene  tablas  con  datos  de  sistema  de  MySQL.  

Nicolás  Silva,  Universidad  de  Chile   24  

A  donde  nos  dirigimos  

Nicolás  Silva,  Universidad  de  Chile   25  

Browser  

Datos  

HTTP  Request  

HTML  

JVM   Motor  de  Servlets  

Archivos  .class  

Driver  JDBC  

Servidor  Tomcat  

Servlet  

DAO  

BD  Relacional  

Pregunta  para  Uds.  

•  Cuantos  han  chequeado  componentes  de  sus  aplicaciones  web  como  programas  Java  por  separado?  (Fuera  de  Tomcat)  

Nicolás  Silva,  Universidad  de  Chile   26  

Por  Donde  Empezamos?  

Nicolás  Silva,  Universidad  de  Chile   27  

Datos  

JVM  

Archivos  .class  

Driver  JDBC  

Test.class  

BD  Relacional  

Acceso  a  BD  desde  Java  •  Bajar  el  Driver  JDBC  para  MySQL  •  Import  java.sql  •  Cargar  el  driver  JDBC  para  MySQL  •  Conectarse  a  la  base  de  datos  (Usando  java.sql.connecZon)  •  Crear  las  sentencias  SQL  (Usando  Statement  o  

PreparedStatement)  •  Ejecutar  las  sentencias  

–  Updates  para  crear  tablas  o  agregar  filas  –  Queries  para  seleccionar  

•  Obtener  los  resultados  (Usando  java.sql.ResultSet)  •  Mas  sobre  SQL  

–  Especificar  columnas  en  las  sentencias  Insert  –  Campos  de  auto_increment  –  Transacciones  –  Pool  de  conexiones  Nicolás  Silva,  Universidad  de  Chile   28  

Bajar  el  Driver  JDBC  

•  Es  un  archivo  JAR  •  Bajarlo  de  www.mysql.com  – Se  llama  Connector/J  

•  Se  baja  desde  hzp://www.mysql.com/products/connector/j/  –  Versión  actual  es  5.1  

– Extraer  del  archivo  zip  – Agregarlo  a  la  aplicación  

•  Para  una  webapp  en  Tomcat,  ponerlo  en  la  carpeta  lib  dentro  de  WEB-­‐INF  •  Para  una  aplicación  Java,  en  netbeans  hacer  click  derecho  a  libraries,  y  poner  add  library.  

Nicolás  Silva,  Universidad  de  Chile   29  

Acceder  al  paquete  java.sql  

•  Tendrán  que  colocar  “import  java.sql.*;”  •  Documentación  en  Java  API  Docs  – hzp://java.sun.com/j2se/1.5.0/docs/api/  

Nicolás  Silva,  Universidad  de  Chile   30  

Cargar  el  Driver  JDBC  en  Java  •  Java  puede  buscar  el  driver  en  la  primera  conexión  –  Buscando  en  archivos  de  propiedades  por  el  driver  jdbc  

•  Muchos  prefieren  precargar  el  driver.  Esta  es  la  receta  mas  común:  –  Se  precarga  el  driver  usando  Class.forName()  –  Esto  hace  que  Java  busque  y  cargue  el  Driver  –  Receta  }pica:  

try { Class.forName("com.mysql.jdbc.Driver");

}catch (ClassNotFoundException e) { throw new AssertionError(e); }

Nicolás  Silva,  Universidad  de  Chile   31  

Conectarse  a  la  Base  de  Datos  

•  Usar  DriverManager.getConnec6on()  para  abrir  la  conexión  a  la  base  de  datos.  

•  Pasarle  la  información  de  conexión  – La  URL  de  la  base  de  datos  

•  En  MySQL  seria:  “jdbc:mysql:///<nombrebd>”  

– Opcionalmente,  userid,  y  password  

Nicolás  Silva,  Universidad  de  Chile   32  

El  Driver  Implementa  la  Interfaz  java.sql  

•  java.sql.ConnecZon  – Permite  enviarle  sentencias  al  servidor  y  otros  requests  (Ej:  Transacciones)  

•  java.sql.Statement  – Permite  enviar  queries  para  ejecutar  

•  Usar  executeQuery  para  leer  de  la  base  de  datos  –  Uso  de  SELECT,  SHOW,  DESCRIBE,  etc.  

•  Usar  executeUpdate  para  escribir  en  la  base  de  datos  –  Uso  de  INSERT,  DELETE,  UPDATE,  CREATE,  DROP  –  Retorna  el  numero  de  filas  modificadas  

Nicolás  Silva,  Universidad  de  Chile   33  

Pregunta  para  Uds.  

•  Conectarse  a  mysql  con  usuario  root  y  password  root  desde  localhost.  – Fue  esto  una  buena  idea?  

Nicolás  Silva,  Universidad  de  Chile   34  

Acceso  desde  localhost  a  la  base  de  datos  

•  Poner  passwords  en  archivos  de  texto  plano  no  es  seguro  – Al  tener  acceso  local  a  un  equipo,  puedes  leer  estos  archivos  

– Muchos  programas  necesitaran  estos  passwords  para  conectarse  

•  Mejor  es  permiZr  el  acceso  a  la  base  de  datos  (localmente)  con  un  password  obvio.  

•  Verificar  que  no  se  este  dando  acceso  remoto  – Ver  tabla  users  en  base  de  datos  mysql  Nicolás  Silva,  Universidad  de  Chile   35  

Usar  ResultSet  para  recuperar  las  Filas  

•  next()  te  mueve  a  la  siguiente  fila  (Retorna  false  si  no  hay  mas  filas)  

•  Los  métodos  get  permiten  acceder  a  los  campos  dentro  de  la  fila  – Ej:  getString(“ciudad”)  – Ej:  getInt(“zonahoraria”)  

Nicolás  Silva,  Universidad  de  Chile   36  

Caracteres  no  PermiZdos  

•  Que  pasa  con  cosas  no  permiZdas  que  quieran  meter  en  mi  bases  de  datos?  – Comillas  son  un  problema  – HTML  

Nicolás  Silva,  Universidad  de  Chile   37  

Usar  Prepared  Statements  

•  Mejor  desempeño  al  precompilar  los  queries  – Aunque  no  se  si  esto  pasa  en  MySQL  

•  Escapa  los  datos  al  preparar  el  query,  por  lo  que  los  caracteres  no  permiZdos  no  son  un  problema  

Nicolás  Silva,  Universidad  de  Chile   38  

JDBC  Soporta  Transacciones  

•  Transacciones  son  un  método  para  agrupar  múlZples  sentencias  SQL  – Por  lo  que  su  efecto  es  el  de  que  se  ejecuten  sin  interferencia  de  otros  Threads.  

•  Es  un  atributo  de  la  conexión  – Setear  autocommit  a  false  – Ejecutar  las  sentencias  – Hacer  commit  – Cerrar  la  conexión,  o  setear  autocommit  a  true  

•  Mas  adelante  veremos  las  transacciones  con  mas  detalle   Nicolás  Silva,  Universidad  de  Chile   39  

Transacciones  y  auto_increment  

•  La  asignación  de  ID  es  un  problema  de  sincronización  

•  Si  se  trata  de  crear  dos  registros  simultáneamente  puede  haber  un  problema  

•  Pueden  usar  transacciones  en  la  base  de  datos  para  solucionarlo  

•  O  pueden  setear  el  Zpo  de  dato  como  auto_increment  – Ej:  Típicamente  se  crea  el  id  como  Zpo  de  dato  integer  not  null  auto_increment.  Al  crear  un  registro,  este  campo  lo  llenamos  como  null,  y  la  base  de  datos  lo  completa  como  auto  incremental.  

Nicolás  Silva,  Universidad  de  Chile   40  

Control  de  Concurrencia  

•  Cada  sentencia  corre  como  si  estuviera  sola  – Sin  interferencia  de  otras  sentencias  concurrentes  – La  base  de  datos  maneja  la  sincronización  de  sentencias  individuales  

– Usar  transacciones  para  agrupar  sentencias  como  si  estuvieran  corriendo  solas.  

Nicolás  Silva,  Universidad  de  Chile   41  

Usar  una  Base  de  Datos  en  una  Aplicación  Web  

Nicolás  Silva,  Universidad  de  Chile   42  

Browser  

Datos  

HTTP  Request  

HTML  

JVM   Motor  de  Servlets  

Archivos  .class  

Driver  JDBC  

Servidor  Tomcat  

Servlet  

DAO  

BD  Relacional  

Ejemplo  

•  TodoList2  – hzp://localhost:8080/ToDoList2  

Nicolás  Silva,  Universidad  de  Chile   43  

Próxima  Clase  

•  JavaBeans  

Nicolás  Silva,  Universidad  de  Chile   44