Вы находитесь на странице: 1из 14

Cours de JAVA

Serge Rosmorduc rosmord@iut.univ-paris8.fr 20002005

Table des matires


1 Java et les bases de donnes 1.1 Introduction JDBC . . . . . . . . . . . . . . . . . . . . 1.2 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Un exemple : postgres . . . . . . . . . . . . . . . . . . . . 1.4 tablir la connexion . . . . . . . . . . . . . . . . . . . . . 1.4.1 Exemple : . . . . . . . . . . . . . . . . . . . . . . 1.5 Envoyer une requte . . . . . . . . . . . . . . . . . . . . 1.5.1 Mthodes . . . . . . . . . . . . . . . . . . . . . . 1.5.2 Mthodes applicables un ResultSet . . . . . . . 1.5.3 Execute . . . . . . . . . . . . . . . . . . . . . . . 1.6 Commandes prpares . . . . . . . . . . . . . . . . . . . 1.7 chappements SQL . . . . . . . . . . . . . . . . . . . . . 1.8 Gestion des transactions . . . . . . . . . . . . . . . . . . 1.8.1 Niveau disolement . . . . . . . . . . . . . . . . . 1.9 Capacits de la base de donnes : DataBaseMetaData . 1.10 Exploration des tables . . . . . . . . . . . . . . . . . . . . 1.10.1 mthodes de ResultSetMetaData . . . . . . . 1.11 Extensions du jdbc2.0 . . . . . . . . . . . . . . . . . . . . 1.11.1 ResultSet navigables . . . . . . . . . . . . . . 1 1 1 1 2 2 3 3 4 4 5 5 6 6 7 7 7 7 8

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

ii

TABLE DES MATIRES

Chapitre 1 Java et les bases de donnes


Jdbc : Java Data Base Connectivity.

1.1 Introduction JDBC


1. Ncessit dutiliser un langage appropri pour interroger une base de donne (SQL) ; 2. Ncessit dun systme client serveur cause des restrictions des applets.

1.2 Architecture
Application java Applet Java

JDBC

interface jdbc du Moteur

Moteur de bases de donne

1.3 Un exemple : postgres


Linterface jdbc est distribue avec les sources, postgresql-6.2/src/interfaces/jdbc ; une fois compile, la bibliothque est utilisable sous tout ordinateur ; Les sources qui lutilisent doivent contenir la ligne :
import java.sql.*;

dans

CHAPITRE 1. JAVA ET LES BASES DE DONNES


Pour spcier le driver JDBC utiliser, deux mthodes : 1. compiler les sources avec la ligne :
% java -Djdbc.drivers=org.postgresql.Driver monfic.java

2. include dans le code :


Class.forName("org.postgresql.Driver");

Attention ! Le driver doit se trouver dans le CLASSPATH ; sil sagit dun chier jar, le chier lui mme doit tre dans le classpath :
export CLASSPATH=.:/home/titi/postgresql.jar:/usr/local/jdk1.2

1.4 tablir la connexion


On utilise :
Connection DriverManager.getConnection(String url, String login, String passwd);

La forme de lURL est :


jdbc:sous protocole:adresse

1.4.1 Exemple :
try { Connection db; String url= "jdbc:postgresql://localhost/guest"; db= DriverManager.getConnection(url, "guest", "toto"); // manipulations diverses : .... // on a fini : db.close(); } catch (SQLException e) { }

ladresse est ici compose du nom du serveur postgres (localhost) suivi du nom de la base de donne (ici, guest ; lIUT ce sera votre nom de login).

1.5. ENVOYER UNE REQUTE

1.5 Envoyer une requte


les requtes sont reprsentes par la classe Statement ; les modications de la base sont effectues par la mthode Statement.executeUpdate(String) ; les requtes sont effectues par la mthode Statement.executeQuery(String) ; Le rsultat dune requte Query est un ResultSet
// On cre un canal de communication Statement st= db.createStatement(); // On envoie une requte ResultSet res= st.executeQuery("select * from Etud"); // Tant quil y a des lignes dans le rsultat.. while (res.next()) { // on lit les valeurs des champs System.out.println("col 1 = " + rs.getString("Nom")); } res.close(); st.close();

Notes : on peut avoir plusieurs requtes ouvertes sur la mme connexion ; il nest possible daccder un champ quune fois et une seule ; il est ncessaire de fermer (close) les Statement et les ResultSet.

1.5.1 Mthodes
ResultSet executeQuery (String requete) throws SQLException Envoie une requte SQL, (normalement de type select ), et renvoie le rsultat sous forme dun ResultSet. Le rsultat nest jamais null. int executeUpdate (String requete) throws SQLException Excute une requte de modication des donnes ou de la base (bref, tout ce qui nest pas select). La valeur retourne normalement le nombre de lignes modies, ce qui a un sens pour insert, delete, update. Pour les autres oprateurs, le rsultat est 0. boolean execute (String requete) throws SQLException Envoie une requte SQL qui peut mme envoyer plusieurs rsultats. Le rsultat est true si la premire valeur renvoye est un ResultSet. Nous dtaillons plus avant la mthode execute en 1.5.3.

CHAPITRE 1. JAVA ET LES BASES DE DONNES

1.5.2 Mthodes applicables un ResultSet


Les mthodes suivantes permettent daccder la valeur dune colonne, soit en passant comme argument le numro de colonne (commenant 1), soit le nom de la colonne : getByte getShort getInt getLong getFloat getDouble getBigDecimal getBoolean getString getBytes getDate getTime getTimestamp getAsciiStream getUnicodeStream getBinaryStream getObject Par ailleurs, aprs appel dune de ces mthodes, la mthode wasNull() permet de savoir si en fait la valeur tait NULL.

1.5.3 Execute
La mthode execute() permet denvoyer une requte, quelle soit de type select ou quelle soit une modication dune base. Les mthodes utilises dans lexemple suivant permettent de rcuprer des informations sur la requte. Bien entendu, dans la plupart des cas, le programmeur sait quelle est la requte, et donc utilise executeQuery ou executeUpdate(). La mthode execute() sera, par exemple, utilise dans un programme o lutilisateur pourra saisir une requte SQL quelconque.
Utilisation gnrale de Execute stmt.execute(queryStringWithUnknownResults); while(true) { int rowCount = stmt.getUpdateCount(); if(rowCount > 0) { // Des donnes ont t modifies System.out.println("Rows changed = " + count); stmt.getMoreResults(); continue; } if(rowCount == 0) { // Modification de la Structure, // ou pas de changement. System.out.println(" Pas de ligne modifie, ou la ligne est une commande DDL"); stmt.getMoreResults(); continue; } // Si on arrive ici, il sagit dune requte ResultSet rs = stmt.getResultSet; if(rs != null) { ... // Il faut utiliser les mtadata pour connatre // la liste des colonnes while(rs.next()) { ... // Traiter le rsultat stmt.getMoreResults(); continue; } break;

1.6. COMMANDES PRPARES


// there are no more results } }

1.6 Commandes prpares


classe PreparedStatement ; typiquement, commande utilise plusieurs fois en changeant la valeur de certains paramtres ; les paramtres qui changent sont remplacs dans la commande par des ? ; les commandes setXXX (o XXX est le type de la variable) permettent de spcier la valeur des paramtres.
PreparedStatement pstmt = connec.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?"); ... pstmt.setString(1, "Hi"); for (int i = 0; i < 10; i++) { pstmt.setInt(2, i); int rowCount = pstmt.executeUpdate(); }

NULL : pour que la valeur dun paramtre soit NULL , il suft dutiliser la commande setNull

1.7 chappements SQL


But : avoir une plus grande portabilit, et faciliter la cration de commandes SQL.

Syntaxe : Dans la chane de commande SQL :


{commande arguments}

Spcier un caractre dchappement :


stmt.executeQuery("SELECT name FROM Identifiers WHERE Id LIKE \{}_% {escape \}");

Spcier une date :


{d yyyy-mm-dd}

CHAPITRE 1. JAVA ET LES BASES DE DONNES

1.8 Gestion des transactions


par dfaut, chaque requte forme une transaction ; pour changer ce comportement, on manipule lobjet Connection li la base de donne :
maconnexion.setAutoCommit(false);

ensuite : maconnexion.commit() ; valide les requtes dj effectues lors de cette transaction ; maconnexion.rollback() ; annule les requtes dj effectues ;

1.8.1 Niveau disolement


But : une transaction doit voir un tat de la base. Dans le cas daccs concurrents la base : on peut changer le type daccs concurrent avec la mthode de Connection :
public void {setTransactionIsolation}(int level) throws SQLException

o level peut valoir : TRANSACTION_READ_UNCOMMITTED TRANSACTION_READ_COMMITTED TRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLE TRANSACTION_READ_UNCOMMITTED on peut lire des modications ds quelles sont faites. En cas de ROLLBACK, postrieur, les valeurs lues peuvent tre fausses ; TRANSACTION_READ_COMMITTED on ne peut pas lire une range sur laquelle il y a des modications non valides (par commit) ; TRANSACTION_REPEATABLE_READ idem ; de plus, vite le cas o la transaction lit une range, une autre transaction la modie, et la premire relit la range modie ; la lecture donne toujours le mme rsultat, do le nom ; TRANSACTION_SERIALIZABLE le comportement est similaire celui obtenu avec un traitement squentiel. Empche le cas o 1. la transaction fait un select avec une condition ; 2. une seconde transaction cre des lignes qui satisfont la condition ; 3. la premire transaction refait le mme select.

1.9. CAPACITS DE LA BASE DE DONNES : DATABASEMETADATA

1.9 Capacits de la base de donnes : DataBaseMetaData


Se rcupre grce la mthode getMetaData() de Connection les mthodes permettent de connatre les capacits de la base. Par exemple : supportsSelectForUpdate() renvoie vrai si la base permet dutiliser un select dans un update (cf. le cours de SQL !) des mthodes permettent dobtenir le catalogue de la base et la liste des tables : ResultSet getTables (String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException revoie un ResultSet dcrivant les tables et les index de la base. Par exemple, pour afcher la liste des tables et index :
rs= meta.getTables(null , null, null, null); while (rs.next()) { System.out.println(rs.getString("TABLE_NAME"); } rs.close();

Les arguments de getTables peuvent tre nuls. Les plus intressants sont : types : un tableau de chanes de caractre, donnant le type des tables rcuprer, entre autres : TABLE pour les tables stricto sensu, VIEW pour les vues.

1.10 Exploration des tables

la mthode getMetaData() de linterface ResultSet permet de rcuprer le ResultSetMetaData associ.

1.10.1 mthodes de ResultSetMetaData


int getColumnCount() nombre de colonnes ; String getColumnName(int column) : nom de la ie colonne ; String getColumnLabel(int column) : titre de la colonne pour afchage ; int getColumnType(int column) : type SQL de la colonne ; les valeurs possibles pour le rsultat sont dcrites dans java.sql.Types.

1.11 Extensions du jdbc2.0


La version 2.0 du jdbc propose un certain nombre dextensions.

CHAPITRE 1. JAVA ET LES BASES DE DONNES

1.11.1 ResultSet navigables


Par dfaut, on ne peut parcourir un un ResultSet que dune manire : du premier au dernier lment. Le jdbc version 2 permet de se dplacer librement dans un ResultSet, et ventuellement den modier les lments. Ces options ne sont pas forcment implmentes par les drivers jdbc. Par exemple, le driver postgresql permet les dplacements, mais pas la modication. Pour disposer de ResultSets modiables, il faut le demander au moment de crer un Statement, en utilisant la mthode createStatement de la classe Connection : Statement createStatement (int resultSetType, int resultSetConcurrency) throws SQLException resultSetType trois valeurs possibles : ResultSet.TYPE_FORWARD_ONLY : seul les dplacements vers lavant sont possibles ResultSet.TYPE_SCROLL_INSENSITIVE : tout dplacement est possible. Par contre, si les donnes sont modies, et que lon revient sur une ligne dj visite, la valeur visible sera la valeur dorigine et non la valeur modie. ResultSet.TYPE_SCROLL_SENSITIVE : tout dplacement est possible. , Si les donnes sont modies, et que lon revient sur une ligne dj visite, la valeur visible sera la valeur modie. resultSetConcurrency : rgle le comportement du ResultSet en cas par raport aux transactions. ResultSet.CONCUR_READ_ONLY : lecture seule ; ResultSet.CONCUR_UPDATABLE : modiable. Dplacement dans le ResultSet Un ResultSet fonctionne comme un tableau dont les cases sont numrotes de 1 n. Il dispose de plus de deux positions spciales, beforeFirst et afterLast, aux deux extrmites du tableau. Le curseur est lorigine plac sur beforeFirst. void last () throws SQLException se place au dernier enregistrement. void first () throws SQLException se place au premier enregistrement. void afterLast () throws SQLException se place aprs le dernier enregistrement.

1.11. EXTENSIONS DU JDBC2.0


void beforeFirst () throws SQLException se place avant le premier enregistrement. void next () throws SQLException avance lenregistrement suivant. void previous () throws SQLException avance lenregistrement prcdent.

boolean absolute (int i) throws SQLException se place sur lenregistrement numro i. Si i vaut 1, cest lquivalent de first. Si i est ngatif, on numrote partir du dernier enregistrement. La fonction renvoie true si le curseur pointe sur un enregistrement valide. boolean relative (int delta) throws SQLException Dplacement relatif la position courante. relative(-1) est quivalent previous, et relative(1) next(). La fonction renvoie true si le curseur pointe sur un enregistrement valide. int getRow () throws SQLException renvoie lindice de la ligne courante. Modication dun ResultSet Un ResultSet nest modiable que si on la demand et que le driver le gre. Les mthodes principales sont (remplacer XXX par int, String...) : void updateXXX (int i, XXX a) throws SQLException modie le ie champ, de type XXX, en lui donnant la valeur a. void updateXXX (String name, XXX a) throws SQLException modie le champ nomm name, de type XXX, en lui donnant la valeur a. void deleteRow () throws SQLException dtruit la ligne courante. void moveToInsertRow () throws SQLException se place sur une ligne spciale, qui sert aux insertions de nouvelles donnes.

10

CHAPITRE 1. JAVA ET LES BASES DE DONNES

void moveToCurrentRow () throws SQLException aprs un appel moveToInsertRow, revient sa position initiale. void insertRow () throws SQLException insre le contenu de la ligne dinsertion dans la base.

Вам также может понравиться