JDBC: Concetti Fondamentali Lorenzo Blanco

Slides:



Advertisements
Presentazioni simili
Trieste, 26 novembre © 2005 – Renato Lukač Using OSS in Slovenian High Schools doc. dr. Renato Lukač LinuxDay Trieste.
Advertisements

Teoria e Tecniche del Riconoscimento
1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Interfacce Java.
Microsoft SQL Server 2008 Utilizzo. Creazione DataBase CREATE DATABASE CREATE DATABASE Cinema.
EBRCN General Meeting, Paris, 28-29/11/20021 WP4 Analysis of non-EBRCN databases and network services of interest to BRCs Current status Paolo Romano Questa.
SQL (Standard query language) Istruzioni per la creazione di una tabella: Create table ( tipo, (, [vincoli]) Primary key ( ) CHIVE PRIMARIA Foreign key(
Capitolo 2 Nozioni fondamentali su Java Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill.
JPA Overview della tecnologia. Java Persistence Architecture Definita nella JSR-220 EJB 3.0 ( Tentativo di unificare EJB2.1 con.
Database nel Web Modulo Didattico: Francesca Platania
L'interfaccia socket in Java
1.E un algoritmo ricorsivo: Tutti le istanze di oggetti raggiungibili da un oggetto persistente diventano anchessi persistenti.
Un DataBase Management System (DBMS) relazionale client/server.
MySQL Esercitazioni. Ripasso Connessione a MySQL. Creazione delle basi di dati e delle tablelle. Inserimento dei dati. Interrogazioni.
EJB Enterprise Java Beans B. Pernici. Approccio Java.
Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.
Model – View - Controller
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
J0 1 Marco Ronchetti Java Threads & Sincronizzazione.
J0 1 Marco Ronchetti - Basi di Dati Web e Distribuite – Laurea Specialitica in Informatica – Università di Trento.
J0 1 Marco Ronchetti - Corso di Formazione Sodalia – Febbraio 2001 – Modulo Web Programming Tomcat configuration.
OO.1 Marco Ronchetti - Java Sql package.
EJB Getting started Database: MySql Application Server: Pramati Server Ambiente di sviluppo: Pramati Studio 3 Applicazione esempio: Logon Trento, 30/10/2002.
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Directory services Directory offline –Elenchi telefonici –Guide TV –Cataloghi acquisti Directory online –Application specific (lotus notes, MS Exchange.
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
Java Database Connection (dal corso dei Servizi Web)
Programming with JXTA Hello World Peer discovery Peer Group discovery Creating Peer group Joining a Peer Group.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 3 - Functions Outline 3.1Introduction 3.2Program Components in C++ 3.3Math Library Functions 3.4Functions.
SQL Esercitazione per il corso “Basi di Dati” Gabriel Kuper
Players: 3 to 10, or teams. Aim of the game: find a name, starting with a specific letter, for each category. You need: internet connection laptop.
JDBC(TM) Database Access
Java base VI: Gestione I/O. Argomenti Introdurre le API per linput e output in Java.
Sequence. CREARE UNA SEQUENCE CREATE SEQUENCE nome [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE]
Constraints.
Componenti dell’architettura Oracle
1 Attivita di ricerca Carlo Batini. 2 Aree Come costruire ed esprimere il contenuto informativo integrato di sistemi informativi complessi basati.
Palermo, may 2010 F.Doumaz, S.Vinci (INGV-CNT- Gruppo di telerilevamento)
Università degli studi di Modena e Reggio Emilia Facoltà di Ingegneria di Modena Corso di Laurea Specialistica in Ingegneria Informatica Analisi e valutazione.
7 cose da sapere su Volume Activation con Windows 7 © 2009 Microsoft Corporation. Tutti i diritti riservati. Come professionista IT, devi sapere che l'attivazione.
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
Gli ambienti di apprendimento Firenze, 3 marzo 2006.
Fondamenti di Informatica Corsi di Laurea in Ingegneria Gestionale Canale AL ESERCITAZIONE 6 ARGOMENTI: LAVORARE CON CLASSI METODI DELLISTANZA, COSTRUTTORI.
Project Review byNight byNight December 6th, 2011.
24 aprile 2002 Avvisi: Risultati 1 o Esonero: (entro) lunedi 27 disponibili nella pag. WEB, ma anche esposti nella bacheca fuori dal corridoio 2 o dente,
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
Visual Studio Tools for Office: Developer Solutions Platform Fulvio Giaccari MCSD.NET / MCT Responsabile Usergroup ShareOffice Blog:
Test con JUnit. zJUnit è un ambiente di test per programmi Java ySviluppato da Kent Beck É possibile usare JUnit allinterno di Eclipse per eseguire i.
Project Review Novembrer 17th, Project Review Agenda: Project goals User stories – use cases – scenarios Project plan summary Status as of November.
Project Review byNight byNight December 21th, 2011.
Project Review Novembrer 17th, Project Review Agenda: Project goals User stories – use cases – scenarios Project plan summary Status as of November.
Project Review byNight byNight December 5th, 2011.
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java.
SUBQUERY Chi ha un salario maggiore di quello di Abel? Occorre scomporre la query in due sotto problemi: MAIN : quali impiegati hanno un salario maggiore.
1 Basi di dati (Sistemi Informativi) Scuola di Dottorato in Scienze Veterinarie per la Salute Animale e la Sicurezza Alimentare a.a Ing. Mauro.
Analysis and Development of Functions in REST Logic: Application to the «DataView» Web App UNIVERSITA’ DEGLI STUDI DI MODENA E REGGIO EMILIA DIPARTIMENTO.
Negli ultimi anni, la richiesta di poter controllare in remoto la strumentazione e cresciuta rapidamente I miglioramenti nell’hardware e nel software insieme.
Collection & Generics in Java
Introduction to automatic ABMs documentation Keywords: Doxygen ODD protocol MASON documentation Simone Romano.
Sistemi di elaborazione dell’informazione Modulo 3 -Protocolli applicativi Unità didattica 4 - Protocolli del Web Ernesto Damiani Lezione 3 – Esempi HTTP.
A PEACEFUL BRIDGE BETWEEN THE CULTURES TROUGH OLYMPICS OLYMPIC CREED: the most significant thing in the olympic games is not to win but to take part OLYMPIC.
Guida alla compilazione del Piano di Studi Curricula Sistemi per l’Automazione Automation Engineering.
Dynamic SQL.
JDBC Java DataBase Connectivity SISTEMI ITIS B. CASTELLI Anno Scolastico
Interazione col DB Per interagire con una base dati da una pagina PHP occorre procedere come segue: Eseguire la connessione al DBMS MySQL in ascolto;
Studente : Andrea Cassarà Classe: 5AII A.S. 2014/2015 Link Sito
Transcript della presentazione:

JDBC: Concetti Fondamentali Lorenzo Blanco Basi di Dati JDBC: Concetti Fondamentali Lorenzo Blanco

Concetti Fondamentali Riferimenti Introduzione Architettura Tipi di driver Un Esempio Driver e Driver Manager Connection PreparedStatement ResultSet

Riferimenti Sito Sun - The Java Tutorial http://java.sun.com/docs/books/tutorial/jdbc/index.html Sito Sun – Java SE - Java Database Connectivity (JDBC) http://java.sun.com/javase/technologies/database/index.jsp Cap. 6 del libro Atzeni, Ceri, Paraboschi, Torlone Basi di dati, McGraw-Hill Italia, 2009

Introduzione Da Java Tutorial Dal libro di Atzeni The JDBC API is a Java API that can access any kind of tabular data, especially data stored in a Relational Database JDBC helps you to write java applications that manage these three programming activities: Connect to a data source, like a database Send queries and update statements to the database Retrieve and process the results received from the database in answer to your query Dal libro di Atzeni JDBC: esempio di Call Level Interface Dalla documentazione JavaDoc java.sql: classi fondamentali javax.sql: estensioni

Introduzione Una applicazione che accede (in lettura e/o scrittura) ad una sorgente di dati (nel nostro caso un database relazionale) ha bisogno di fare le seguenti operazioni: 1. aprire una connessione alla sorgente dati 2. inviare attraverso la connessione istruzioni (di interrogazione e aggiornamento) alla sorgente dati 3. processare i risultati ricevuti dalla sorgente dati in risposta alle istruzioni inviate

Introduzione Le nostre sorgenti dati sono database relazionali, gestiti da un DBMS Ogni DBMS espone una API Le applicazioni Java interagiscono con le API del DBMS attraverso un driver

Architettura Applicazione Java utilizza le interfacce java.sql e javax.sql Driver Manager implementano java.sql e, in alcuni casi javax.sql Driver Postgres Driver Oracle Driver IBM Db2

Tipi di Driver Type 1 - drivers that implement the JDBC API as a mapping to another data access API, such as ODBC. Drivers of this type are generally dependent on a native library, which limits their portability. The JDBC-ODBC Bridge driver is an example of a Type 1 driver. Type 2 - drivers that are written partly in the Java programming language and partly in native code. These drivers use a native client library specific to the data source to which they connect. Again, because of the native code, their portability is limited. Type 3 - drivers that use a pure Java client and communicate with a middleware server using a database-independent protocol. The middleware server then communicates the client’s requests to the data source. Type 4 - drivers that are pure Java and implement the network protocol for a specific data source. The client connects directly to the data source.

Driver: Type 1, Type 2 Type 1: JDBC-ODBC Bridge plus ODBC Driver This combination provides JDBC access via ODBC drivers. ODBC binary code -- and in many cases, database client code -- must be loaded on each client machine that uses a JDBC-ODBC Bridge. Sun provides a JDBC-ODBC Bridge driver, which is appropriate for experimental use and for situations in which no other driver is available. Type 2: A native API partly Java technology-enabled driver This type of driver converts JDBC calls into calls on the client API for Oracle, Sybase, Informix, DB2, or other DBMS. Note that, like the bridge driver, this style of driver requires that some binary code be loaded on each client machine.

Driver: Type 3, Type 4 Type 4: Direct-to-Database Pure Java Driver This style of driver converts JDBC calls into the network protocol used directly by DBMSs, allowing a direct call from the client machine to the DBMS server and providing a practical solution for intranet access. Type 3: Pure Java Driver for Database Middleware This style of driver translates JDBC calls into the middleware vendor's protocol, which is then translated to a DBMS protocol by a middleware server. The middleware provides connectivity to many different databases.

Confronto tra driver Type 1 (Ponte JDBC-ODBC) Type 2 Type 3 Type 4 prestazioni scadenti non indipendente dalla piattaforma fornito a corredo di SDK Type 2 migliori prestazioni Type 3 client indipendente dalla piattaforma servizi avanzati (caching) architettura complessa Type 4 indipendente dalla piattaforma buone prestazioni scaricabile dinamicamente Per approfondimenti: http://java.sun.com/products/jdbc/driverdesc.html

Esempio Obiettivo: esemplificare l’API JDBC. Quindi: Operazioni scriviamo codice che ha unicamente lo scopo di evidenziare l'uso della API JDBC non ci preoccupiamo della qualità del codice Java Operazioni inserimento di una tupla nel db cancellazione di una tupla ricerca di un tupla per chiave primaria ricerca di un insieme di tuple (per qualche proprietà)

Esempio Consideriamo la classe Student: package model; import java.util.Date; public class Student { private String firstName; private String lastName; private int code; private Date birthDate; public String getFirstName() { return firstName; } public void setFirstName(String firstname) { this.firstName = firstName; // seguono tutti gli altri metodi getter e setter

Esempio E il database university: CREATE TABLE students ( code integer NOT NULL, firstname character varying(64) NOT NULL, lastname character varying(64) NOT NULL, birthdate date NOT NULL, CONSTRAINT pk_students PRIMARY KEY (code) )

Ambiente DBMS Driver JDBC per il DBMS scelto Ambiente Java standard a scelta (PostgreSQL, MySQL, DB2, Oracle, SQLServer) consigliato: PostgreSQL Driver JDBC per il DBMS scelto con postgresql 8.4 scaricare il driver http://jdbc.postgresql.org/download/postgresql-8.4-701.jdbc4.jar con altri DBMS, scaricare un driver appropriato (se non lo trovate: http://developers.sun.com/product/jdbc/drivers) Ambiente Java standard Nota bene: il .jar del driver deve essere nel CLASSPATH

Le classi fondamentali di JDBC Package java.sql (va importato) Classe DriverManager Interfaccia Driver Interfaccia Connection Interfaccia PreparedStatement Interfaccia ResultSet

Un Esempio Nel seguito, con riferimento ad nostro studio di caso, descriveremo le seguenti operazioni Operazione n.1: Caricare il driver Operazione n.2: Aprire una connessione Operazione n.3: Definire l’istruzione SQL Operazione n.4: Gestire il risultato Operazione n.5: Rilascio delle risorse

Operazione n.1: Caricare il Driver Creare un oggetto della classe Driver Driver d = new org.postgresql.Driver(); Registrare il driver sul DriverManager DriverManager.registerDriver(d); A questo punto il driver è disponibile

Operazione n.1: Caricare il Driver Le operazioni precedenti sono equivalenti alla istruzione: Class.forName("org.postgresql.Driver"); Vedi classe documentazione classe java.lang.Class Soluzione vantaggiosa: Il nome della classe è indicato con una stringa che può essere letta da un file di configurazione Disaccoppiamento dallo specifico DBMS Non è necessario ricompilare il codice se si cambia il DBMS, basta modificare la stringa nel file di configurazione

Operazione n.2: Connessione Ottenere una connessione dal DriverManager per farlo è necessario specificare: host, dbms, db utente e password URI (“indirizzo” completo) della connessione specifica server, porta e database Sintassi jdbc:<sottoprotocollo>:<parametri>

Operazione n.2: Connessione URI per PostgreSQL jdbc:postgresql:<baseDati> jdbc:postgresql://<host>/<baseDati> jdbc:postgresql://<host>:<porta>/<baseDati> URI per Access jdbc:odbc:<sorgenteODBC> NB: la sorgente ODBC deve essere registrata sotto Windows: pannello di controllo, Strumenti di amministrazione, origine dati odbc sotto Linux: file odbc.ini (o .odbc.ini) Esempi jdbc:postgresql:university jdbc:postgresql://127.0.0.1/university jdbc:postgresql://193.204.161.14:5432/university jdbc:odbc:university

Operazione n.2: Connessione Creazione della connessione Connection DriverManager.getConnection( String uri, String utente, String password); Esempio Connection connection; connection = DriverManager.getConnection( "jdbc:postgresql:university" , "postgres", "postgres" ); Attenzione: ottenere una connessione è un’operazione costosa creare troppe connessioni comporta problemi di prestazioni nel corso di SIW saranno illustrate tecniche per superare questo problema

Nell’Esempio Confiniamo in una classe, DataSource, le operazioni necessarie per ottenere la connessione il suo compito è servire connessioni alle altre classi che ne hanno bisogno metodo Connection getConnection() che restituisce una nuova connessione ad ogni richiesta E' una soluzione artigianale usata solo a fini didattici

La classe DataSource import java.sql.*; public class DataSource { private String dbURI = "jdbc:postgresql://localhost/university"; private String user = "postgres"; private String password = "postgres"; public Connection getConnection() throws Exception { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(dbURI, user, password); return connection; }

Operazione n.3: Istruzione SQL Vediamo ora il codice JDBC che esegue istruzioni SQL per: salvare (rendere persistenti) oggetti nel db cancellare oggetti dal db trovare oggetti dal db Vedi classe StudentRepository Concentriamoci in particolare sul codice dei singoli metodi, piuttosto che del progetto di tale classe

Operazione n.3: Istruzione SQL Per eseguire una istruzione SQL è necessario creare un oggetto della classe che implementa PreparedStatement creato dall'oggetto Connection invocando il metodo: PreparedStatement prepareStatement(String s); La stringa s è una istruzione SQL parametrica: i parametri sono indicati con il simbolo ? Esempio 1 String insert = "insert into students(code, firstname, lastname, birthdate) values (?,?,?,?)"; statement = connection.prepareStatement(insert); Esempio 2 String delete = "delete from students where code=?"; statement = connection.prepareStatement(delete);

Operazione n.3: Istruzione SQL I parametri sono assegnati mediante opportuni metodi della classe che implementa PreparedStatement metodi setXXX (<numPar>, <valore>) un metodo per ogni tipo, il primo argomento corrisponde all'indice del paramentro nella query, il secondo al valore da assegnare al parametro Esempio 1 (cont.) PreparedStatement statement; String insert = "insert into students(code, firstname, lastname, birthdate) values (?,?,?,?)"; statement = connection.prepareStatement(insert); statement.setInt(1, student.getCode()); statement.setString(2, student.getFirstName()); statement.setString(3, student.getLastName()); long secs = student.getBirthDate().getTime()); statement.setDate(4, new java.sql.Date(secs));

Operazione n.3: Istruzione SQL JDBC usa java.sql.Date, mentre la classe Student usa java.util.Date Le istruzioni long secs = student.getBirthDate().getTime()); statement.setDate(4, new java.sql.Date(secs)); servono a "convertire" una data da una rappresentazione all'altra Per i dettagli vedi la documentazione

Operazione n.3: Istruzione SQL Una volta assegnati i valori ai parametri, l'istruzione può eseguita Distinguiamo due tipi di operazioni: aggiornamenti (insert, update, delete) modificano lo stato del database interrogazioni (select) non modificano lo stato del database ritornano una sequenza di tuple

Operazione n.3: Istruzione SQL Aggiornamenti (insert, delete, update) vengono eseguiti invocando il metodo executeUpdate() sull'oggetto PrepareStatement Esempio 1 (cont.) PreparedStatement statement; String insert = "insert into students(code, firstname, lastname, birthdate) values (?,?,?,?)"; statement = connection.prepareStatement(insert); statement.setString(1, student.getCode()); statement.setString(2, student.getFirstName()); statement.setString(3, student.getLastName()); long secs = student.getBirthDate().getTime()); statement.setDate(4, new java.sql.Date(secs)); statement.executeUpdate();

Operazione n.3: Istruzione SQL Interrogazioni (select) vengono eseguiti invocando il metodo executeQuery() che ritorna il risultato in un oggetto ResultSet Esempio 2 (cont.) PreparedStatement statement; String query = "select * from students where code=?"; statement = connection.prepareStatement(query); statement.setInt(1,code); ResultSet result = statement.executeQuery();

Operazione n.4: Gestire il risultato di una query Un oggetto della classe ResultSet rappresenta la collezione di ennuple restituita da una query SQL (istruzione SELECT) Per gestire il risultato offre vari metodi: metodo boolean next() per scorrere le ennuple (analogo ad un iteratore) metodi getXXX(String attributo) per acquisire i valori degli attributi Es.: int getInt(String attributo); Es.: String getString(String attributo);

Operazione n.4: Gestire il risultato di una query Il metodo next() Moves the cursor forward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on. When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown. Returns: true if the new current row is valid; false if there are no more rows

Operazione n.4: Gestire il risultato di una query Connection connection = this.dataSource.getConnection(); String retrieve = "select * from students where code=?"; PreparedStatement statement = connection.prepareStatement(retrieve); statement.setInt(1, code); ResultSet result = statement.executeQuery(); Student student = null; if (result.next()) { student = new Student(); student.setCode(result.getInt("code")); student.setFirtsName(result.getString("firstname")); student.setLastName(result.getString("lastname")); long secs = result.getDate("birthdate").getTime(); birthDate = new java.util.Date(secs); student.setBirthDate(birthDate); }

Operazione n.4: Gestire il risultato di una query Un altro esempio List<Student> students = new LinkedList<Student>(); Connection connection = this.dataSource.getConnection(); PreparedStatement statement; String query = "select * from students"; statement = connection.prepareStatement(query); ResultSet result = statement.executeQuery(); while(result.next()) { Student student = new Student(); student.setCode(result.getInt("code")); student.setFirstName(result.getString("firstname")); student.setLastName(result.getString("lastname")); student.setBirthDate(new java.util.Date(result.getDate ("birthdate").getTime())); students.add(student); }

Operazione n.5: rilascio delle risorse connessione, statement, ResultSet devono essere sempre "chiusi" dopo essere stati usati l'operazione di chiusura corrisponde al rilascio di risorse L’approccio seguito in queste lezioni è semplicistico, un modo più sofisticato e corretto richiede la conoscenza del meccanismo delle eccezioni che verrà introdotto nel corso di “Sistemi informativi su Web”

Esercizio Studiare il codice della classe StudentRepository Spiegare a che cosa serve l'istruzione if (findByPrimaryKey(student.getCode())!=null) { del metodo public void persist() Scrivere il codice del metodo: public void update(Student student) che aggiorna nel database la tupla corrispondente all'oggetto passato come parametro. Suggerimento: usare il metodo findByPrimaryKey()

Esercizio Creare il database olympic: CREATE TABLE athletes ( code integer NOT NULL, name character varying(64) NOT NULL, nation character varying(64) NOT NULL, birthdate date NOT NULL, height double precision, CONSTRAINT pk_athletes PRIMARY KEY (code) )

Esercizio Creare la classe Athlete: package olympic; import java.util.Date; public class Athlete { private int code; private String name; private String nation; private double height; private Date birthDate; public Athlete(){} // metodi getter e setter }

Esercizio Scrivere e testare il codice della classe AthleteRepository Oltre ai metodi: persist(Athlete a) delete(Athlete a) update(Athlete a) findByPrimaryKey(int code) findAll() scrivere il codice del metodo public List<Athlete> findTallAthletes(double h) che ritorna gli atleti con altezza maggiore del parametro h