• Aucun résultat trouvé

JDBC fait partie du JDK (Java Development Kit)

N/A
N/A
Protected

Academic year: 2022

Partager "JDBC fait partie du JDK (Java Development Kit)"

Copied!
45
0
0

Texte intégral

(1)

Cours 3 : JDBC

Java DataBase Connectivity

(2)

JDBC

Une API (Application Programming Interface) qui permet d’exécuter des instructions SQL

JDBC fait partie du JDK (Java Development Kit)

Toutes les classes et interfaces sont dans le package java.sql :

import java.sql.*

2019-2020 Bases de données 2

(3)

JDBC

Les classes du package java.sql

Java.lang.Object

java.util.Date DriverManager DriverPropertyInfo Types

Date Time Timestamp

2019-2020 Bases de données 3

(4)

JDBC

Les interfaces du package java.sql

ResultSetMetaData

DatabaseMetaData ResultSet

Connection Statement

Driver

PreparedStatement

CallableStatement

2019-2020 Bases de données 4

(5)

JDBC : structure d’un programme

1. On établit une connexion avec une source de données

2. On effectue des requêtes

3. On utilise les données obtenues pour des affichages, des traitements statistiques etc.

4. On met à jour les informations de la source de données

5. On termine la connexion

6. Eventuellement, on recommence en 1

2019-2020 Bases de données 5

(6)

1. Connexion

Pour établir une connexion à une base de données, il faut :

1. Connaître son nom

2. Lui associer un pilote (ou driver)

Pour charger l’adresse des pilotes : EXPORT CLASSPATH =

nomFichier:.:$CLASSPATH

2019-2020 Bases de données 6

(7)

Déclaration du driver

Pour charger un driver, on peut utiliser la méthode

Class.forName(String) Pilote utilisé à l’IUT :

oracle.jdbc.driver.OracleDriver

• Emplacement des archives :

C:\Oracle32\jdbc\lib\ojdbc8

• Pour charger les archives sous Eclipse :

Avec l’onglet « Libraries », choisir « Add external jars »

2019-2020 Bases de données 7

(8)

Exemple (jusqu’ici)

import java.sql.*;

public class premiereConnexion {

public static void main(String[ ] args){

try{

Class.forName("oracle.jdbc.driver.OracleDriver");

}

catch (ClassNotFoundException e){

System.out.println("Impossible de charger le pilote");

System.exit(1);

}

System.out.println("Pilote chargé");

} /*du main*/

} /* de la classe premiereConnexion*/ 8

(9)

Nommage des bases de données : les URL

<protocole>:<sous-protocole>:<compléments>

Protocole : jdbc

Sous-protocole : le driver. Tous les drivers distribués par Oracle commencent par oracle:

(oracle:thin, oracle:oci7, oracle:oci8, …).

A l’IUT, on utilise oracle:thin

Compléments identifie la base de données : login/motDePasse@ordinateur:port:base

• Exemple :

String url = "jdbc:oracle:thin:ffioren/mdp@oracle.iut-orsay.fr:1521:etudom"

2019-2020 Bases de données 9

(10)

Etablir la connexion

On utilise la méthode getConnection( ) de la classe DriverManager avec l’URL en argument :

Connection maConnexion =

DriverManager.getConnection(url);

ou bien

Connection maConnexion =

DriverManager.getConnection(url,"ffioren","mdp");

2019-2020 Bases de données 10

(11)

Exemple (suite)

...

System.out.println("Pilote chargé");

String url = "jdbc:oracle:thin:ffioren/mdp";

url+="@oracle.iut-orsay.fr:1521:etudom";

Connection maConnexion = null;

try{

maConnexion = DriverManager.getConnection(url);

}

catch (SQLException e){

System.out.println("Impossible de se connecter à l’url : "+url);

System.exit(1);

}

} /*du main*/

} /* de la classe premiereConnexion*/ 11

(12)

2. Déclaration et exécution de la requête

Il faut tout d’abord demander la création du statement

Statement monInstruction =

maConnexion.createStatement( );

Ensuite il faut déclarer le code SQL de la requête

ResultSet monResultat =

monInstruction.executeQuery(maRequête);

2019-2020 Bases de données 12

(13)

Exemple (suite)

public static void main(String[ ] args) throws SQLException{

System.out.println("Pilote chargé");

String url = "jdbc:oracle:thin:ffioren/mdp";

url+="@oracle.iut-orsay.fr:1521:etudom";

Connection maConnexion = DriverManager.getConnection(url);

Statement monInstruction = maConnexion.createStatement( );

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

} /*du main*/

13 Bases de données

(14)

3. Exploitation des résultats

On peut parcourir les lignes de l’objet ResultSet avec la méthode next( ). Cette méthode renvoie

VRAI s’il reste des lignes à lire et FAUX sinon :

while(monResultat.next( )){

traitement des données récupérées }

2019-2020 Bases de données 14

(15)

Exemple (suite)

public static void main(String[ ] args) throws SQLException{

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

while(monResultat.next( )){

String titre = monResultat.getString("titre");

int numero = monResultat.getInt("numFilm");

System.out.println(numero + "\t" + titre);

}

} /*du main*/

15 Bases de données

(16)

Variante 1

public static void main(String[ ] args) throws SQLException{

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

while(monResultat.next( )){

String titre = monResultat.getString(2);

int numero = monResultat.getInt(1);

System.out.println(numero + "\t" + titre);

}

} /*du main*/

16 Bases de données

(17)

Variante 2

public static void main(String[ ] args) throws SQLException{

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

while(monResultat.next( ))

System.out.println(monResultat.getInt(1) + "\t" + monResultat.getString(2));

} /*du main*/

17 Bases de données

(18)

Variante 3

public static void main(String[ ] args) throws SQLException{

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

while(monResultat.next( ))

System.out.println(monResultat.getString(1) + "\t" + monResultat.getString(2));

} /*du main*/

18

2019-2020 Bases de données

(19)

Variante 4

public static void main(String[ ] args) throws SQLException{

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

while(monResultat.next( )){

for (int c = 1; c <= 2; c++)

System.out.print(monResultat.getString(c) + "\t");

System.out.println(" ");

}

} /*du main*/

19

2019-2020 Bases de données

(20)

Variante 5 (avec ResultSetMetaData)

public static void main(String[ ] args) throws SQLException{

ResultSet monResultat = monInstruction.executeQuery(

"select numfilm, titre from ens2004.film where titre like 'A%'");

while(monResultat.next( )){

for (int c = 1; c <= monResultat.getMetaData().getColumnCount(); c++) System.out.print(monResultat.getString(c) + "\t");

System.out.println(" ");

}

} /*du main*/

20

2019-2020 Bases de données

(21)

Cas des valeurs nuls

Un NULL Java peut être renvoyé par les

méthodes qui retournent un objet : getString( ), getObject( ), getDate( ), …

Un 0 peut être renvoyé par les méthodes qui retournent une valeur numérique : getInt( ), getByte( ), getShort( ), . . .

Une valeur FAUX peut être renvoyée par la méthode getBoolean( ).

wasNull( ) : méthode de ResultSet

isNullable( ) : méthode de ResultSetMetaData

2019-2020 Bases de données 21

(22)

4. Accès en mise à jour

En outre de l’exécution d’un select avec executeQuery, on peut aussi exécuter un

update, un insert ou un delete :

Statement monInstruction =

maConnexion.createStatement( );

int monResultat =

monInstruction.executeUpdate(maRequête);

2019-2020 Bases de données 22

(23)

Exemple (suite)

public static void main(String[ ] args) throws SQLException{

while(monResultat.next( )){…}

int num = 1112;

String client = "charlie";

int nbLignes = monInstruction.executeUpdate(

"INSERT INTO location(numExemplaire, login,

dateLocation) VALUES("+num+",'"+client+"',SYSDATE)");

System.out.println(nbLignes + " ligne(s) inserée(s).");

} /*du main*/

23 Bases de données

(24)

Gestion des transactions

Par défaut, autocommit on

Pour modifier ce mode on appel la

méthode setAutoCommit( ) de la classe Connection (paramètres true et false)

Pour valider ou annuler on appel les méthodes commit( ) et rollback( ) de la classe Connection

2019-2020 Bases de données 24

(25)

5. Déconnexion

Libérer les objets ResultSet et Statement :

monObjet.close( );

Fermer la connexion :

maConnexion.close( );

2019-2020 Bases de données 25

(26)

Exemple (suite et fin)

public static void main(String[ ] args) throws SQLException{

System.out.println(nbLignes + " ligne(s) inserée(s).");

monInstruction.close( );

maConnexion.close( );

} /*du main*/

26

2019-2020 Bases de données

(27)

Interface ResultSetMetaData

Elle fournit des informations concernant les types et les propriétés des colonnes d’une instance de

ResultSet

Combien d’attributs contient le ResultSet ?

Les noms des attributs sont-ils sensibles à la casse ?

Est-il possible de rechercher des données dans la colonne de son choix ?

Est-il possible d’affecter la valeur NULL à un attribut ?

Quel est le nombre maximal de caractères affichables pour un attribut donné ?

Quel est le nom d’un attribut ?

A quelle table appartient un attribut ?

De quel type est un attribut ?

2019-2020 Bases de données 27

(28)

Contenu de l’interface ResultSetMetaData

getCatalogName()

getColumnClassName() getColumnCount()

getColumnDisplaySize() getColumnLabel()

getColumnName() getColumnType()

getColumnTypeName() getPrecision()

getScale()

getSchemaName()

getTableName() isAutoIncrement() isCaseSensitive() isCurrency()

isDefinitelyWritable() isNullable()

isReadOnly() isSearchable() isSigned()

isWritable()

2019-2020 Bases de données 28

(29)

Exemple

ResultSet monResultat =

monInstruction.executeQuery("select numfilm, titre from ens2004.film");

ResultSetMetaDatarsmd= monResultat.getMetaData();

int nbColonnes = rsmd.getColumnCount();

for(int i=1; i<=nbColonnes; i++){

String nomColonne = rsmd.getColumnName(i);

String nomType = rsmd.getColumnTypeName(i);

System.out.println("La colonne "+i+" est "

+nomColonne+" dont le nom de type Oracle est "

+nomType);

}

2019-2020 Bases de données 29

(30)

Interface PreparedStatement

Elle permet de transférer une seule fois le code SQL d’une requête au serveur de façon à en accélérer l’exécution lorsqu’on veut répéter plusieurs fois cette requête (un seule

« compilation » et un seul calcul d’un plan de requête)

Nom de classe : java.sql.PreparedStatement

Classe mère : java.sql.Statement

Sous-classe directe :java.sql.CallableStatement

Disponible depuis la version 1.1 du JDK

2019-2020 Bases de données 30

(31)

Exemple

2019-2020 Bases de données 31

Etape

numVoyage numVille numOrdre duree

Voyage

numVoyage nomVoyage nbMin

nbMax

typePension Ville

numVille nomVille numPays

Pays

numPays nomPays formalite vaccin

Tarif

numVoyage dateDeb prix

(32)

Exemple (2)

PreparedStatement pst = maConnexion.prepareStatement(

"select numvoyage from tarif

where datedeb > '01-07-2020‘ and prix < 1000");

ResultSet monResultat = pst.executeQuery();

while(monResultat.next()){

int numero = monresultat.getInt(1);

System.out.println(numero);

} ...

monResultat = pst.executeQuery();

32

2019-2020 Bases de données

(33)

Exemple (3)

PreparedStatement pst =

maConnexion.prepareStatement(

"select numvoyage from tarif

where datedeb > ? and prix < ?");

pst.setString(1, "01-07-2020");

pst.setInt(2, 1000);

ResultSet monResultat = pst.executeQuery();

while(monResultat.next()){

...

}

2019-2020 Bases de données 33

(34)

Exemple (en mise à jour)

PreparedStatement pst =

maConnexion.prepareStatement(

"update tarif set prix = prix + ? where numvoyage = ? and datedeb > ?");

for (int i = 0; i<10; i++){//10 fois update pst.setInt(2,saisieVoyage());

pst.setInt(1,saisieMajoration());

pst.setString(3,saisieDate());

int compteur = pst.executeUpdate();

System.out.println(compteur + " ligne(s) mise(s) à jour.");

}

pst.close();

34 Bases de données

2019-2020

(35)

PreparedStatement − Création

PreparedStatement nomstatement =

maconnexion.prepareStatement(requête)

2019-2020 Bases de données 35

(36)

PreparedStatement − Gestion des paramètres

Paramètrage :

nomstatement.setXXX(rang, valeur)

• Exemples : setAsciiStream(), setBigDecimal(), setBinaryStream(), setBoolean(), setByte(),

setBytes(), setDate(), setDouble() setFloat(), setInt(), setLong(), setNull(), setObject(),

setShort(), setString(), setTime(), setTimestamp(), setUnicodeStream()

2019-2020 Bases de données 36

(37)

executeQuery() pour une requête

executeUpdate() pour tous les autres ordres SQL

2019-2020 Bases de données 37

PreparedStatement

Exécution

(38)

Interface CallableStatement

Elle permet de faire appel à une

procédure ou à une fonction stockée dans la base de donnée

2019-2020 Bases de données 38

(39)

Exemple

Soit la fonction définie par

CREATE OR REPLACE FUNCTION entitule (numero IN voyage.numVoyage%TYPE)

RETURN voyage.nomVoyage%TYPE IS nom voyage.nomVoyage%TYPE;

BEGIN select nomvoyage into nom

FROM voyage where numvoyage = numero;

return nom;

END;

2019-2020 Bases de données 39

(40)

Exemple (2)

Soit la fonction définie par

CREATE OR REPLACE FUNCTION entitule (numero IN voyage.numVoyage%TYPE)

RETURN voyage.nomVoyage%TYPE IS ...

Donc numero sera de type INTEGER et la fonction renverra du VARCHAR2(60)

2019-2020 Bases de données 40

(41)

Exemple (appel à la fonction)

CallableStatement cst =

maConnexion.prepareCall("{? = call entitule(?)}");

cst.setInt(2,6);

cst.registerOutParameter(1,java.sql.Types.VARCHAR);

boolean retour = cst.execute();

String nom = cst.getString(1);

...

2019-2020 Bases de données 41

(42)

CallableStatement − Création

CallableStatement nomstatement =

maconnexion.prepareCall(appel)

Appel d’une fonction

{? = call nomfonction (?, ?, ...)}

Appel d’une procédure {call nomprocédure (?, ?, ...)}

2019-2020 Bases de données 42

(43)

CallableStatement

Gestion des paramètres

Paramètre d’entrée

nomstatement.setXXX(rang, valeur)

Paramètre de sortie

nomstatement.registerOutParameter(rang, valeur) nomstatement.getXXX(rang)

• Exemples : getBigDecimal(), getBoolean(),

getBytes(), getDate(), getDouble(), getFloat(), getInt(), getLong(), getString(), getTime(), getTimestamp()

2019-2020 Bases de données 43

(44)

nomstatement.execute()

2019-2020 Bases de données 44

CallableStatement

Exécution

(45)

Correspondances entre les types SQL et les types JAVA

CHAR, VARCHAR, LONGCHAR String

NUMERIC, DECIMAL java.math.BigDecimal

BIT boolean

TINYINT byte

SMALLINT short

INTEGER int

BIGINT long

REAL float

FLOAT, DOUBLE double

BINARY, VARBINARY, LONGVARBINARY byte[ ]

DATE java.sql.Date

TIME java.sql.Time

TIMESTAMP java.sql.Timestamp

2019-2020 Bases de données 45

Références

Documents relatifs

Jouer sur le curseur pour spécifier la valeur Jouer sur le curseur pour spécifier la valeur maximale à mi-hauteur des trames à utiliser maximale à mi-hauteur des trames à utiliser En

For example, suppose you declare the following method: void method throws Exc1, Exc2 // Exc1 and Exc2 extend Exception { try { /* Code that can throw Exc1,Exc2 */ } catch Exception

NOTA : Cas de « stop » : Prospero stopped to smoke (he stopped in order to smoke ; il s'est arrêté dans le but de/pour fumer) # Prospero stopped smoking (il s'est arrêté de

– Pilote: contient toutes les classes nécessaire pour communiquer avec une base de données}. – il faut utiliser la méthode forName de la classe Class

Projet de règlement déposé à la séance ordinaire du 1 er février 2021 Page 1 sur 5 PROJET DE RÈGLEMENT AUTORISANT LA RÉALISATION D’UN PROJET PILOTE CONCERNANT LA GARDE DE

Le kit destiné au programmeur, appelé avant JDK (Java Development Kit) et renommé depuis la version 1.2.2 en SDK (Standard Development Kit), est composé d’un JRE, d’un compilateur,

Les créations de postes étant difficilement envisageables, la politique de l’IUT en matière de personnel BIATSS s’est axée sur une meilleure distribution et

Pour utiliser un pilote JDBC d'Oracle sous JBUILDER, il faut rendre les classes de la librairie JDBC d'Oracle accessibles à votre programme JAVA.. L'exemple suivant utilise