# Construcció d'Aplicacions de Programari Lliure en J2EE/Accés a bases de dades amb JDBC i seguretat amb SSL
## JDBC
### Què és JDBC?

JDBC és un conjunt de métodes i interficies que ens permeten accedir i manipular bases de dades. Gràcies a ells podem utilitzar codi SQL dins del codi Java. Podeu visitar la web oficial o mirar el tutorial
JDBC està pensat per a no tenir que patir sobre el funcionament del SGBD que volem utilitzar, ja que per a nosaltres, tot el procés de comunicació ens serà transparent. L'encarregat de entendres amb el SGBD serà el controlador (driver) específic de cada JDBC.
Existeixen 4 tipus de controladors:
* Bridging drivers
* Native API Partly Java Drivers
* Net Protocol All-Java Drivers
* Native-Protocol All-Java Drivers

### Ús de JDBC
#### Càrrega del controlador

Per poder utilitzar el controlador del SGBD que hem escollit, primer hem de carregar el controlador. Per fer-ho s'utilitza el següent codi:
El mètode forname carrega el controlador que correspon a la cadena que passem per paràmetres. En aquest cas estariam carregant el controlador del SGBD postgresql.
Els noms del controladors dels diferents SGBD els podeu trobar en el següent enllaç: Noms controladors JDBC

#### Establir connexió

Un cop carregat el controlador podem establir una connexió. Per poder-ho fer haurem de saber la URL (Universal Resource Locator).
La forma de definir la URL varia depenent del SGBD. Podeu veure diferents exemples en el següent enllaç: Formats de URL per a connexions JDBC
Per obtenir la connexió farem us del mètode DriveMangaer.getConnection. Aquest mètode ens retornara un objecte del tipus Connection que conté una connexió establerta amb la BD. Podem demanar la connexió especificant diferent nombre de paràmentres, però el més habitual és fer-ho així:
Per poder veure les diferents variants a l'hora de obtindre connexions podeu consultar l'API
Quan la connexió ja no sigui necessària hem de utilitzar el mètode close de l'objecte Connectionper alliberar-la.

#### Accés a la BD

Ara què disposem de l'objecte Connection podem utilitzar comandes SQL. JDBC ens proporciona tres tipus d'objecte per aconseguir aquest proposit.
* Statement: Ens permet fer una consulta o manipulació de dades (SELECT, CREATE o UPDATE)
* PreparedStatement: Ens permet precompilar la comanda per a oferir millors prestacions
* CallableStatement: Ens permet cridar a procediments definits en la BD.
Per a obtenir aquests objectes ho farem desde l'objecte del tipus Connection
Un cop creat el podem utilitzar per a executar commandes SQL dins la BD. Per fer consultes utilitzarem el mètode executeQuery
El paràmetre d'aquest mètode és una cadena que representa la consulta SQL. El resultat el recollim dins d'un objecte ResultSet. Aquest tipus d'objecte el veurem en més detall en el següent apartat.
Disposem d'un altre mètode per a executar commandes que no retornen cap resultat (DELETE, UPDATE, ...).
El mètode executeUpdate ens retorna el nombre de files afectades per la commanda que li passem per paràmetre.
Si a priori no sabem si la nostra comanda ens ha de retornar un resultat, podem utilitzar el mètode execute que ens retorna true si aquest té resultat i false en altre cas. Per recollir el valor o el nombre de línies afectades ho farem amb els mètodes getResultSet i getUpdateCount respectivament.
En el cas de que necessitem executar el mateixa commanda amb diferents valors podem fer ús del preparedStatement. Aquest també l'obtenim de l'objecte Connection
En aquest cas el mètode que ens proporciona el PreparedStatement té un pàrametre que és la commanda SQL. Aquesta commanda es enviada al controlador de la BD i precompilada. Ara hem assignar valor a aquells llocs on hem situat el caràcter ?. Per fer-ho utilitzarem els mètodes que té el PreparedStatement per aquesta finalitat. Són del tipus setXXX(valor). Per a saber amb quins mètodes compta pots visitar l'API.
Ara resta executar la commanda:
Per a cridar procediments ho farem mitjançant l'objecte CallableStatement. Aquest objecte conté una crida a un procediment definit a la BD com per exemple el següent:
La sintaxis del procediment canvia depenent del SGBD, alguns requereixen anar entre begin i end, etc. Per crear el CallableStatement també ho farem a partir de l'objecte del tipusConnection. Un cop crean només hem d'executar la commanda mitjançant els mètodes que vists amb anterioritat.
Quan ja no necessitem els objectes de sentencia els hem de tancat mitjançant el mètode close

#### Resultats

L'execució d'una commanda SQL ens retorna una taula accessible mitjançant un objecte del tipus ResultSet. Aquest objecte ens propociona un conjunt de mètodes i propietats per a llegir les dades. El següent codi permet veure com accedim a les dades de dins del ResultSet:
El mètode next accedeix una a una a les fileres que contenen les dades. Els metodes getXXX("nom columna") ens retornen el valor de la columna especificada per paràmetre en la fila actual. Per veure els diferents tipus de retorn podeu consultar l'API.
L'accés a les dades només es fa en una direcció. Per tant hem de processar les dades segons anem recorrent la taula. No és fins a la versió 2.0 de JDBC que ens permet despaçar-nos lliurement per tots els resultats. Gràcies a aquestes millores comptem amb mètodes com:
* first: Ens porta a la primera fila
* absolute(número_de_fila): Ens porta a una fila específica.
* previous: Ens porta a la fila anterior.
És en aquesta versió on apareix també la possibilitat de actualitzar o inserir noves files.
Per defecte el ResultSet que ens retorna l'Statement no ens permet fer aquestes operacions. Aquestes habilitats les haurem d'especificar a l'hora de crear l'Statement.

#### Accés a les metadades

Les metadades no són res més que informació referent al SGBD. Per obtenir aquestes dades tenim l'objecte anomenat DataBaseMetaData. Aquest objecte el podem recollir a partir de l'objecte Connection
Per a veure la informació que podeu obtenir mitjançant el BaseDataMetaData podeu consultar lAPI
A més a més de obtenir informació relativa al SGBD podem obtenir informació sobre els resultats d'una consulta. Aquestes dades les obtenim mitjançant l'objecte ResultSetMetaData
Per a veure la informació que podeu obtenir mitjançant el ResultSetMetaData podeu consultar lAPI
Tornar a la plana principal: Construcció d'Aplicacions de Programari Lliure en J2EE

### Connexions sobre Tomcat

Si pretem utilitzar JDBC en una aplicació web podem utilitzar les capacitats de tomcat per poder gestionar connexions. Per fer-ho utilitzarem JNDI DataSource.
En el JNDI Datasource HOW-TO podem veure en profunditat com funciona aquest sistema.
Seguirem el següent exemple:

#### Configuració del tomcat

Configurarem el tomcat perquè aquest sigui capaç de realitzar una connexio a una BD MYSQL.
* Afegirem el driver de MYSQL dins del directori common/lib del Tomcat
* Editarem el fitxer server.xml (Ho farem sobre una de les configuracions de servidor dins de Eclipse)
* Afegirem un nou contexte aquest ha d'anar dins del node <HOST>

#### Creació d'una aplicació web

* Utilitzarem l'eclipsi per a crear un nou projecte web (Dynamic Web Project).
* Crearem un nou servlet el qual tindrà els mètodes init, doGet i doPost
* Crearem un objecte DataSource
* En el mètode ini solicitarem el DataSource a partir del contexte configurat al tomcat.
* En el metode doPost obtindrem una connexió a partir de l'objecte del tipusDataSource
* Llegirem dades de la BD

#### Configuració de l'aplicació web

Ens resta configurar el fitxer web.xml de l'aplicació. Inclourem el següent codi dins del node <webapp> del .
Ara la nostra connexió prodrà fer ús d'aquest recurs.

## Seguretat

Les dades que circulen desde el servidor (Aplicació web) al client (Navegador) poden ser interceptades per una tercera persona si aquest té accés als paquets HTTP que circulen per la xarxa. Aquests paquets poden ser llegits i en poden extreure la informació.
En molts cops hem de fer circular dades secretes (claus d'accés, dades personals, etc). Per aquest motiu és necessari tenir un protocol per poder a poder fer connexions segures. Aquest és HTTPS (HTTP + SSL).

### SSL

SSL (Secure Socket Layer) és un sistema de xifratge dissenyat per l'empresa Netscape Communications, que permet xifrar connexions. Es basa en un sistema criptogràfic asimètric i en el concepte dels certificats.
Per a més informació polseu aquí

### SSL mitjançant Apache

Aquesta configuració protegirà les aplicacions web mitjançant connexions SSL. El primer pas serà configurar l'apache perquè redireccioni les peticions HTTPS del port 443 cap a el nostre port 8080 que és on tenim l'aplicació web.
Per defecte l'apache ja ve preparat i configurat per suportar SSL.
Per fer la unió utilitzarem els paràmetres ProxyPass i el ProxyPassReverse.
* Obrirem el fitxer /etc/httpd/cond.d/ssl.conf (Aquest fitxer descriu el host virtual protegit amb SSL)