Tecnologia e Applicazioni Internet 2011/12

Похожие документы
Introduzione JDBC interfaccia java.sql driver caricare i driver

PROVA FINALE Ingegneria del software

JDBC per l accesso Java a DB. Tito Flagella tito@link.it

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

JDBC versione base. Le classi/interfacce principali di JDBC

Laboratorio di reti II: Gestione di database lato server

JDBC di base. Le classi/interfacce principali di JDBC

Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2012/2013

JDBC: Introduzione. Java Database Connectivity (JDBC): parte 1. Schema dei legami tra le classi principali. Principali classi/interfacce di JDBC

Laboratorio Progettazione Web PHP e MySQL. Andrea Marchetti IIT-CNR 2013/2014

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity

Programmazione Java Avanzata

Come trattare il risultato di un comando SQL (relazioni) che

Caricamento della classe driver. Apertura della connessione. DriverManager.getConnection() Creazione di uno statement

Esercitazione su JDBC

Java: la libreria delle classi

JDBC. A. Bechini Accesso a DataD con Java

JDBC. Di Michele de Nittis Versione 06/08/2008

Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2011/2012

Introduzione. 8- Programmazione di una base di dati attraverso JDBC ESEMPIO

MySQL Database Management System

JDBC. Dispense per il corso di Ingegneria del Web

Lavorare con JDBC L'impiego di JDBC è semplice, e solitamente si articola attraverso quattro passi:

Architettura MVC-2: i JavaBeans

Sviluppo Applicazioni Mobile Lezione 12 JDBC. Dr. Paolo Casoto, Ph.D

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Dominio applicativo. Progettazione. v SQL incluso in codice applicativo v Embedded SQL v Cursori v Dynamic SQL v JDBC v Stored procedures

ORM: Approccio DAO. Versione preliminare. Antonella Poggi. Dipartimento di informatica e Sistemistica Sapienza Università di Roma

The Hitchhiker's Guide to testable code

Strumenti Software per Esercitazioni (ambiente Windows) Basi di Dati L LS Ing. Gestionale

Corso breve su automazione d'ufficio

1 Gestione dell utente connesso in sessione con Java Server Pages, Java Beans, Servlet

Accesso Web a Data Base

Corso di Informatica Modulo T3 B2 - Database in rete

PHP e Structured Query Language

JDBC: SQL NEI LINGUAGGI DI PROGRAMMAZIONE

Esempio di architettura software

JDBC Driver Manager. JDBC Architettura generale. JDBC - Tipi di dato. JDBC - Flusso applicativo. JDBC - Tipi di dato. ODBC Driver. Livello di gestione

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

Esercitazione 4 JDBC

DBMS ED APPLICAZIONI (CAPITOLO 6) SQL incluso in codice applicativo Embedded SQL Cursori Dynamic SQL JDBC Stored procedures

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A Esercitazione 08 DAO e Hibernate

Appunti di MySql. Evoluzione di un tutorial di base di mysql, scritto da Etel Sverdlov.

PHP 5. PHP ed i database. Database e tabelle. Struttura di un DB relazionale. Accesso a database

DBMS: MySQL CORSO DI BASI DI DATI 2014/2015

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

JDBC: Java e database.

PHP e MySQL. Scripting server-side per accesso a DB MySQL

Basi di Dati Esercitazione JDBC

Gestione delle eccezioni in Java

Tecnologie di Sviluppo per il Web

PHP: Hypertext Preprocessor

Scheda 15 Accedere ai DataBase con JDBC

bool mysql_select_db([string database_name [,resource link_identifier]]) Connessione ad un server MySQL vuole conettere

Gestione Orario Lezioni: Schema del Database

Accesso a Database con JDBC

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

Unità 2.1 Comandi sui database

Quando si sa chiaramente come si deve comportare l applicazione si può analizzare una possibile soluzione applicativa.

SQL nei linguaggi di programmazione

Stored Procedures. Antonella Poggi, Claudio Corona. Dipartimento di informatica e Sistemistica SAPIENZA Università di Roma

AA Esame di Tecnologie Informatiche per il Web - Prof. Piero Fraternali Prova straordinaria del 19 marzo 2004 Esercizio 1 (6 punti)

JDBC: SQL nei linguaggi di programmazione

PHP + MySQL. Programmazione lato server. Cosa vediamo. MySQL. MySQL: comandi utili. MySQL: accesso al server. web server.

SQL e applicazioni. Capitolo 8. SQL e linguaggi di programmazione. Applicazioni ed SQL: architettura. Una difficoltà importante.

Office Web Components in programmi C# da

Impostazione ambiente di lavoro. Stefano Marchetti

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Basi di Dati: Corso di laboratorio

Programmazione Java Avanzata Spring - JDBC

SISTEMI OPERATIVI. Sincronizzazione in Java (Monitor e variabili condizione in Java)

Preparazione. Introduzione a MySQL: costruzione di una base di dati e gestione degli accessi. Accesso all area condivisa. Avvio Server MySQL

Lezione 8. Metadati, Viste e Trigger

PHP + MySQL. Programmazione lato server. Cosa vediamo. web server. database server. request. response. web client

PHP E MYSQL CREAZIONE DI UN NUOVO DATABASE DAL PHPMYADMIN

Indice. Java. JDBC è l interfaccia di base standard di Java ai database relaionali

Laboratorio di Sistemi Autenticazione utente mediante MySQL Jsp [Java]

Транскрипт:

Tecnologia e Applicazioni Internet 2011/12 Lezione 4 - Persistenza Matteo Vaccari http://matteo.vaccari.name/ matteo.vaccari@uninsubria.it

Perché usare un DB relazionale? Per l accesso concorrente ai dati (e svincolare il codice applicativo dalla concorrenza) Per estrarre i dati in maniera veloce Per fare fronte a nuovi requisiti tramite una semplice riconfigurazione dello schema (cf. usare il filesystem)

Java and JDBC A Java process Application code JDBC JDBC Driver for MySql TCP MySql server process Java runtime lib

Get a JDBC connection import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception; public class DatabaseConnector { // Should be loaded from external configuration final String USERNAME = "myuser"; final String PASSWORD = "mypassword"; final String URL = "jdbc:mysql://localhost/mydatabase"; final String DRIVER = "com.mysql.jdbc.driver"; public Connection getconnection() throws ClassNotFoundException, SQLException { // load JDBC driver Class.forName(DRIVER); // create connection return DriverManager.getConnection(URL, USERNAME, PASSWORD);

Execute sql code Statement statement = connection.createstatement(); String sql = "INSERT INTO customers (name) VALUES('Mario Rossi')"; statement.executeupdate(sql);

Use a prepared statement String sql = "INSERT INTO customers (name) VALUES (?)"; PreparedStatement statement = connection.preparestatement(sql); statement.setstring(1, "pippo"); statement.executeupdate();

... and close the statement PreparedStatement statement; try { String sql = "INSERT INTO customers (name) VALUES (?)"; statement = connection.preparestatement(sql); statement.setstring(1, "pippo"); statement.executeupdate(); finally { if (null!= statement) { try { statement.close(); catch(exception ignored) {

Note statement.finalize() chiuderebbe lo statement, ma viene chiamato dal garbage collector non si sa quando Bisogna chiudere esplicitamente lo statement, altrimenti se abbiamo molte operazioni concorrenti alcune falliranno Bisogna ignorare le eccezioni in statement.close(), altrimenti oscureranno l eventuale eccezione lanciata da statement.executeupdate()

Reading data from a table Statement statement = connection.createstatement(); ResultSet resultset = statement.executequery("select * FROM customers"); while (resultset.next()) { String s = resultset.getstring("name");

... and close objects Statement statement; ResultSet resultset; try { statement = connection.createstatement(); resultset = statement.executequery("select * FROM my_table"); while (resultset.next()) { String s = resultset.getstring("col_string"); finally { if (null!= resultset) { try { resultset.close(); catch(exception ignored) { if (null!= statement) { try { statement.close(); catch(exception ignored) {

Usare uno script per generare il database Crea due database, uno per unit test e uno per sviluppo Però prima li cancella se esistono Carica lo schema dei dati Crea un utente applicativo e gli dà i diritti

Usare uno script per generare il database, perchè? Bisogna sempre automatizzare tutto Mette i colleghi in grado di partire velocemente Cristallizza le informazioni necessarie per installare l applicazione Se ho lo script, modificare lo schema costa poco

# define key information src=sql # sql sources directory dbname=tai_chat # name of development db dbname_test=tai_chat_test # name of test db dbuser=tai_chat # name of application user dbpassword=tai_chat # password of application user # ask mysql root password read -s -p "mysql root password? (type return for no password) " MYSQL_ROOT_PASSWORD if [ "$MYSQL_ROOT_PASSWORD"!= "" ]; then MYSQL_ROOT_PASSWORD=-p$MYSQL_ROOT_PASSWORD fi # drop and create databases mysqladmin -uroot $MYSQL_ROOT_PASSWORD drop $dbname mysqladmin -uroot $MYSQL_ROOT_PASSWORD --force drop $dbname_test mysqladmin -uroot $MYSQL_ROOT_PASSWORD create $dbname mysqladmin -uroot $MYSQL_ROOT_PASSWORD create $dbname_test # create application user and give grants echo "grant all on $dbname.* to '$dbuser'@localhost identified by '$dbpassword';" \ mysql -uroot $MYSQL_ROOT_PASSWORD $dbname echo "grant all on $dbname_test.* to '$dbuser'@localhost identified by '$dbpassword';" \ mysql -uroot $MYSQL_ROOT_PASSWORD $dbname_test # load schema cat $src/???_*.sql mysql -u$dbuser -p$dbpassword $dbname cat $src/???_*.sql mysql -u$dbuser -p$dbpassword $dbname_test

Astrarre il database

Una semplice interfaccia al DB public interface Database { void execute(string sql, Object... params); Map<String, Object> selectonerow(string sql, Object... params); List<Map<String, Object>> selectmultiplerows(string sql, Object... params); database.execute( UPDATE users SET email =? WHERE user_id =?, foo@bar.com, 1234);

L implementazione del database astratto Database database = new MysqlDatabase( "localhost", "blog_test", "blog_user", "password"); @Test public void selectsonerow() throws Exception { List<DatabaseRow> rows = database.select("select 2+2"); assertequals(1, rows.size()); assertequals(new Long(4), rows.get(0).getlong(0)); @Test public void selectsmorerows() throws Exception { List<DatabaseRow> rows = database.select("(select 2) union (select 3)"); assertequals(2, rows.size()); assertequals("2", rows.get(0).getstring(0)); assertequals("3", rows.get(1).getstring(0));

Il metodo execute public void execute(string sql, Object... params) { Connection connection = getconnection(); PreparedStatement statement = null; try { statement = connection.preparestatement(sql); for (int i=0; i<params.length; i++) { statement.setobject(i+1, params[i]); statement.executeupdate(); catch (SQLException e) { throw new RuntimeException(e); finally { safelyclose(statement); // example String sql = "insert into my_table (foo, bar) values (?,?)"; executor.execute(sql, "a string", 123);

private void safelyclose(statement statement) { if (null!= statement) { try { statement.close(); catch (SQLException ignored) {

Astrarre la persistenza The Repository pattern: A mechanism for encapsulating 1. storage, 2. retrieval, and 3. search which emulates a collection of objects -- Eric Evans, Domain Driven Design

Example repository public interface PictureRepository { // storage void add(picture picture); void update(picture picture); // retrieval Picture findone(object pictureid); List<Picture> findall(); // search List<Picture> findallbyauthor(string authorname); List<Picture> findallbyyearrange(int startyear, int endyear); public class DatabasePictureRepository implements PicturesRepository { public DatabasePictureRepository(Database database) {...