• No se han encontrado resultados

CLASIFICACIÓN DE MINERALES EN OTROS PAÍSES Y EN CHILE

PRECONCENTRACIÓN DE MINERALES

3.1. CLASIFICACIÓN DE MINERALES EN OTROS PAÍSES Y EN CHILE

Scrivere nel programma i parametri di connessione alla base di dati è considerato poco elegante.

public class MyProg {

public static void main(String[] args) {

// non fatelo

String driver = “COM.cloudscape.core.JDBCDriver”; String url = “jdbc:cloudscape:InvoiceDB;create=true”; String username = “username”;

String password = “password”; ...

} }

Se volete, poi, passare a una diversa base di dati, dovete trovare queste stringhe, ag- giornarle e compilare nuovamente il programma.

Al contrario, inserite le stringhe in un file di configurazione. Il file SimpleDataSource.java legge un file di configurazione contenente i parametri della connessione alla base di dati: per connettervi a una base di dati diversa, fornite sem- plicemente sulla riga dei comandi un diverso nome di file di configurazione.

4.2

Esecuzione di enunciati SQL

Una volta che avete una connessione, la potete usare per creare og- getti di tipo Statement, di cui avete bisogno per eseguire enunciati SQL.

Statement stat = conn.createStatement();

Il metodo execute della classe Statement esegue un enunciato SQL. Ad esempio stat.execute(“CREATE TABLE Test (Name CHAR(20))”);

stat.execute(“INSERT INTO Test VALUES (‘Romeo’)”);

Per inviare un’interrogazione, usate il metodo executeQuery della clas- se Statement; il risultato dell’interrogazione viene restituito come og- getto di tipo ResultSet. Ad esempio

String queryStatement = “SELECT * FROM Test”;

ResultSet result = stat.executeQuery(queryStatement); Un oggetto di tipo Connection

può creare oggetti di tipo Sta- tement, che si usano per ese- guire comandi SQL.

Il risultato di un’interrogazione SQL viene restituito in un ogget- to di tipo ResultSet.

+ “SET Quantity = Quantity + 1 “ + “WHERE Invoice_Number = ‘11731’”;

int count = stat.executeUpdate(updateStatement);

In alternativa, potete usare il generico comando execute anche per eseguire interro- gazioni e aggiornamenti: esso restituisce un valore di tipo boolean per indicare se il comando SQL fornisce un insieme di dati come risultato. In tal caso, potete recuperar- lo con il metodo getResultSet, oppure potete conoscere il conteggio degli aggiorna- menti effettuati usando il metodo getUpdateCount.

String command = ...;

boolean hasResultSet = stat.execute(command); if (hasResultSet)

{

ResultSet result = stat.getResultSet(); ...

} else {

int count = stat.getUpdateCount(); ...

}

Potete riutilizzare un oggetto di tipo Statement per eseguire tutti i comandi SQL che volete, ma, per ciascun oggetto di tipo Statement, dovete avere attivo un solo oggetto di tipo ResultSet per volta. Se il vostro programma ha bisogno di consultare diversi insiemi di risultati contemporaneamente, allora dovete creare diversi oggetti di tipo Statement.

Quando avete terminato di consultare un oggetto di tipo ResultSet, dovreste chiu- derlo prima di inviare una nuova interrogazione allo stesso oggetto di tipo Statement.

result.close();

Quando avete finito di utilizzare un oggetto di tipo Statement, dovreste chiuderlo, chiudendo così automaticamente anche l’insieme di risultati a esso associato.

stat.close();

4.3

Analisi dei risultati di interrogazioni

Un oggetto di tipo ResultSet vi consente di recuperare i risultati, una riga alla volta. Iterate lungo le righe, e per ogni riga potete esaminare i valori delle colonne; come gli iteratori delle liste, anche la classe ResultSet ha un metodo next per accedere alla riga successiva, ma il suo comportamento è un po’ diverso. Il metodo next non restituisce

dati, ma un valore di tipo boolean che indica se sono disponibili ulteriori dati. Inoltre, quando ricevete un insieme di risultati dal metodo executeQuery, non vi è alcun dato disponibile: dovete invocare il metodo next per accedere alla prima riga di dati. Sem- bra strano, ma ciò rende più semplice il ciclo di iterazione:

while (result.next()) {

esamina le colonne dei dati della riga attuale }

Se l’insieme di risultati è vuoto, la prima invocazione di result.next() restituisce false e il corpo del ciclo non viene mai eseguito. Altrimenti, la prima invocazione di result.next() recupera dalla base di dati i dati della prima riga. Come potete vedere, il ciclo termina quando il metodo next restituisce false, cioè quando tutte le righe sono state recuperate.

Dopo che l’oggetto che rappresenta l’insieme dei risultati ha recuperato una parti- colare riga, ne potete esaminare le colonne; diversi metodi di tipo get forniscono i valori delle colonne con il formato di numero, di stringa, di data, e così via. Uno di tali metodi ha un parametro di tipo intero che indica la posizione della colonna; un altro ha un parametro di tipo stringa che indica il nome della colonna. Ad esempio, potete esaminare il codice prodotto in questo modo

String productCode = result.getString(1); oppure

String productCode = result.getString(“Product_Code”);

Notate che l’indice di tipo intero parte da uno, non da zero: getString(1) esamina la prima colonna. Gli indici delle colonne delle basi di dati sono diversi dagli indici degli array.

Accedere a una colonna usando un indice intero è leggermente più veloce ed è decisamente accettabile se avete indicato esplicitamente il nome delle colonne desi- derate nell’enunciato SELECT, come in questo caso:

SELECT Invoice_Number FROM Invoice WHERE Payment = 0

Se, invece, avete eseguito un’interrogazione di tipo SELECT *, è meglio usare un nome di colonna invece di un indice numerico: il vostro codice sarà più facile da leggere e non lo dovrete aggiornare quando modificherete la disposizione delle colonne.

Nell’esempio precedente avete visto in azione il metodo getString. Per recupera- re, invece, un numero, usate i metodi getInt e getDouble, come in questi esempi:

int quantity = result.getInt(“Quantity”); double unitPrice = result.getDouble(“Price”);

Adesso sapete come inviare interrogazioni SQL da un programma Java e come iterare nell’insieme risultante. Un errore compiuto comunemente dagli studenti è quello di scandire una tabella alla volta per trovare un risultato. Ad esempio, supponete di voler trovare tutte le fatture che contengono aspirapolvere per automobile. Potreste fare in questo modo:

1. Inviate l’interrogazione SELECT * FROM Product e iterate nell’insieme risultante per trovare il codice prodotto dell’aspirapolvere per automobile

2. Inviate l’interrogazione SELECT * FROM Item e iterate nell’insieme risultante per trovare gli articoli aventi quel codice prodotto

Tuttavia, questa procedura è estremamente inefficiente. Un tale programma esegue al rallentatore ciò che una base di dati esegue molto rapidamente, perché è stata proget- tata appositamente per farlo.

Al contrario, dovreste lasciare che la base di dati faccia tutto il lavoro, inviando l’interrogazione completa:

SELECT Item.Invoice_Number FROM Product, Item

WHERE Product.Description = ‘Car vacuum’

AND Product.Product_Code = Item.Product_Code

Successivamente, iterate nell’insieme risultante per leggere i numeri delle fatture. I principianti hanno spesso timore di inviare interrogazioni SQL complesse, ma se non sfruttate il linguaggio SQL rinunciate a uno dei maggiori benefici di una base di dati relazionali.

4.4

I dati descrittivi

Documento similar