Vous êtes sur la page 1sur 45
Java Data Base Connectivity 1

Java Data Base Connectivity

Connexion aux bases de données

Connexion aux bases de données Rappels API JDBC Pilotes JDBC Connexion ResultSet Requêtes interprétées Requêtes
Rappels API JDBC Pilotes JDBC Connexion ResultSet Requêtes interprétées Requêtes préparées
Rappels
API JDBC
Pilotes JDBC
Connexion
ResultSet
Requêtes interprétées
Requêtes préparées

Modélisation des données

Modélisation des données Création d'un schéma entités/associations Entités : ● identifiables ( notion de

Création d'un schéma entités/associations

Entités :

identifiables ( notion de clé)

pertinente pour l'application

caractérisées par des propriétés (attributs)

Représentation graphique

OMT, Merise, UML

Schéma relationnel

Schéma relationnel schéma entité/association A A B attr B s c h é m a r

schéma entité/association

A

A

BSchéma relationnel schéma entité/association A A attr B s c h é m a r e

attrSchéma relationnel schéma entité/association A A B B s c h é m a r e

B

schéma relationnel

- tables A et B

- la clé de A devient un attribut de B ( clé étrangère)é m a r e l a t i o n n e l - tables

- tables A et B

- table AB pour l'association

avec clé=(clé A,clé B)étrangère) - tables A et B - table AB pour l'association - attribut de l'association =

- attribut de l'association = attribut de la table AB

Mysql

Mysql Types mysql : CHAR(n) INTEGER VARCHAR(n) DECIMAL(m,n) DATE TIME DATETIME TEXT chaîne de longueur n
Mysql Types mysql : CHAR(n) INTEGER VARCHAR(n) DECIMAL(m,n) DATE TIME DATETIME TEXT chaîne de longueur n

Types mysql :

CHAR(n)

INTEGER

VARCHAR(n)

DECIMAL(m,n)

DATE

TIME

DATETIME

TEXT

chaîne de longueur n entier chaîne de longueur <=n m= longueur partie entière, n=lg partie décimale jour, mois, an heure, minutes et secondes (temps sur 24h) date et horaire texte de longueur quelconque

Serveur de bases de données Relationnelles SQL

Expression des contraintes

DEFAULT val NOT NULL

val = valeur par défaut valeur obligatoire

Clés

PRIMARY KEY( num) l'attribut num est la clé primaire FOREIGN KEY(idad) REFERENCES Personne la clé étrangère idad référence la clé primaire de la table Personne

Correspondances des types de données SQL/Java

Correspondances des types de données SQL/Java Type SQL Type Java Méthode getter CHAR VARCHAR String

Type SQL

Type Java

Méthode getter

CHAR VARCHAR

String

getString()

INTEGER

int

getInt()

TINYINT

byte

getByte()

SMALLINT

short

getShort()

BIGINT

long

getLong()

BIT

boolean

getBoolean()

REAL

float

getFloat()

FLOAT DOUBLE

double

getDouble()

NUMERIC DECIMAL

java.math.BigDecimal

getBigDecimal()

DATE

java.sql.Date

getDate()

TIME

java.sql.Time

getTime()

TIMESTAMP

java.sql.Timestamp

getString()

SQL

SQL FROM table, où condition est une expression sur les attributs des tables du FROM les

FROM table,

condition est une expression sur les attributs des tables du FROM

les opérateurs applicables sont :

SELECT attr,

WHERE condition

opérateurs arithmétiques : +,*,-,

opérateurs relationnels : <,>,>=,

opérateurs logiques : AND, NOT, OR

,!=

BETWEEN, IN, LIKE caractères joker

'_' remplace n'importe quel caractère

'%' remplace n'importe quelle chaîne de caractères

Destruction

DELETE FROM table WHERE condition

Modification

UPDATE table SET attr1=val1,Ai=vali,

WHERE condition

EXEMPLES

Dijon

1500€

05-Jan-2009

Lyon

2400€

21-Jan-2009

nom

ventes

date

Dijon

1500€

05-Jan-2009

Chalon

400€

09-Jan-2009

nom

ventes

date

SELECT * FROM Boutique WHERE nom IN ('Dijon','Lyon')

FROM Boutique WHERE nom IN ('Dijon','Lyon') SELECT * FROM Boutique WHERE Date BETWEEN

SELECT * FROM Boutique WHERE Date BETWEEN '06-Jan-2009' AND '11-Jan-2009'

Date BETWEEN '06-Jan-2009' AND '11-Jan-2009' SELECT * FROM Boutique WHERE nom LIKE '%ON%' nom

SELECT * FROM Boutique WHERE nom LIKE '%ON%'

SELECT * FROM Boutique WHERE nom LIKE '%ON%' nom ventes date Dijon 1500€ 05-Jan-2009

nom

ventes

date

Dijon

1500€

05-Jan-2009

Chalon

400€

09-Jan-2009

Lyon

2400€

21-Jan-2009

SELECT nom FROM Boutique WHERE ventes > 1000 OR (ventes < 500 AND ventes > 275)

Introduction à JDBC

Introduction à JDBC Pour les applications web utilisant une ou plusieurs bases de données, les servlets

Pour les applications web utilisant une ou plusieurs bases de données, les servlets et l'API JDBC offrent une solution :

efficace, la connexion est maintenue durant tout le cycle de vie de l'application

flexible, l'accès à une base de données dépend peu de son fournisseur. Il est facile de porter une application vers une base de données d'un autre fournisseur

Principe de fonctionnement de JDBC

Principe de fonctionnement de JDBC Permet à un programme Java d'interagir localement ou à distance avec

Permet à un programme Java d'interagir localement ou à distance

un programme Java d'interagir localement ou à distance avec une base de données relationnelle Fonctionne selon

avec une base de données relationnelleun programme Java d'interagir localement ou à distance Fonctionne selon un principe client/serveur client = le

Fonctionne selon un principe client/serveur

client = le programme Javarelationnelle Fonctionne selon un principe client/serveur serveur = la base de données Principe le programme Java

serveur = la base de donnéesselon un principe client/serveur client = le programme Java Principe le programme Java ouvre une connexion

Principe

le programme Java ouvre une connexion

le programme Java ouvre une connexion

il envoie des requêtes SQL

il envoie des requêtes SQL

il récupère les résultats

il récupère les résultats

le programme Java ouvre une connexion il envoie des requêtes SQL il récupère les résultats il
il ferme la connexion

il ferme la connexion

Architecture 3 tiers

Architecture 3 tiers utilisateur couche présentation interface web couche métier (domaine) couche
utilisateur
utilisateur

couche

présentation

interface

web

3 tiers utilisateur couche présentation interface web couche métier (domaine) couche d'accès aux
3 tiers utilisateur couche présentation interface web couche métier (domaine) couche d'accès aux

couche

métier

(domaine)

présentation interface web couche métier (domaine) couche d'accès aux données BD les trois couches

couche

d'accès

aux

données

métier (domaine) couche d'accès aux données BD les trois couches sont rendues indépendantes grâce à
BD
BD

les trois couches sont rendues indépendantes grâce à l'utilisation d'interfaces Java

API JDBC

API JDBC l'API JDBC se trouve dans le paquetage java.sql l'API JDBC est constituée d'un ensemble

l'API JDBC se trouve dans le paquetage java.sql

l'API JDBC est constituée d'un ensemble d'interfaces pour interagir avec des bases de données

l'API JDBC ne fournit donc aucune implémentation des comportements spécifiés par les interfaces

l'API JDBC permet d'exécuter des instructions SQL et de récupérer les résultats

La version la plus récente de l'API est la version 3.0

Pilotes JDBC (1/2)

Pilotes JDBC (1/2) Le pilote JDBC a pour rôle de permettre l'accès à un système de

Le pilote JDBC a pour rôle de permettre l'accès à un système de bases de données particulier. Il gère le détail des communications avec un type de SGBD

A une API JDBC correspond plusieurs implémentations selon les fournisseurs (un type de driver par SGBD Oracle, Sybase, Access, Il en existe pour la plupart des SGBD relationnels driver par SGBD Oracle, Sybase, Access, Il en existe pour la plupart des SGBD relationnels

).

Le pilote implémente l'interface java.sql.Driver java.sql.Driver

Il existe un driver générique JDBC-ODBC pour toutes les données accessibles par ODBC driver générique JDBC-ODBC pour toutes les données accessibles par ODBC

- SGBD : MS Access, SQL Server, Oracle, dBase,

- tableurs : Excel,

- tout autre application conforme ODBC

Gestionnaire de pilotes

DriverManager

Gestionnaire de pilotes DriverManager DriverManager est une classe , gestionnaire de tous les drivers chargés par

DriverManager est une classe, gestionnaire de tous les drivers chargés par un programme Java

Chaque programme Java charge le (ou les) drivers dont il a besoin

L'enregistrement des pilotes est automatique

Java et les BD

Java et les BD Connexion Connexion application Gestionnaire Gestionnaire de de pilotes pilotes Pont Pont JDBC_ODBC
Connexion Connexion application
Connexion Connexion
application
Java et les BD Connexion Connexion application Gestionnaire Gestionnaire de de pilotes pilotes Pont Pont JDBC_ODBC
Gestionnaire Gestionnaire de de pilotes pilotes
Gestionnaire Gestionnaire de de pilotes pilotes
application Gestionnaire Gestionnaire de de pilotes pilotes Pont Pont JDBC_ODBC JDBC_ODBC Pilote Pilote Sybase Sybase BD
Pont Pont JDBC_ODBC JDBC_ODBC
Pont Pont JDBC_ODBC JDBC_ODBC
de de pilotes pilotes Pont Pont JDBC_ODBC JDBC_ODBC Pilote Pilote Sybase Sybase BD Oracle BD ODBC
de de pilotes pilotes Pont Pont JDBC_ODBC JDBC_ODBC Pilote Pilote Sybase Sybase BD Oracle BD ODBC
de de pilotes pilotes Pont Pont JDBC_ODBC JDBC_ODBC Pilote Pilote Sybase Sybase BD Oracle BD ODBC
Pilote Pilote Sybase Sybase
Pilote Pilote Sybase Sybase
BD Oracle
BD
Oracle
de de pilotes pilotes Pont Pont JDBC_ODBC JDBC_ODBC Pilote Pilote Sybase Sybase BD Oracle BD ODBC
de de pilotes pilotes Pont Pont JDBC_ODBC JDBC_ODBC Pilote Pilote Sybase Sybase BD Oracle BD ODBC
BD ODBC
BD
ODBC
BD Sybase
BD
Sybase

Connexion à une base de données

Connexion à une base de données Disposer de l'URL d'un pilote pour le SGBD com:mysql:jdbc:Driver

Disposer de l'URL d'un pilote pour le SGBD com:mysql:jdbc:Driver Sun:jdbc:odbc:JdbcOdbcDriver jdbc:sqlite

Charger le pilote Class.forName("com:mysql:jdbc:Driver"); // création d'une instance du pilote // enregistrement automatique auprès du DriverManager

Etablir l'URL (protocole) de la base String dbUrl="jdbc:mysql://localhost:3306/maBD"; String dbUrl="jdbc:sqlite:mesdata/mesbds/mags.sqlite";

Ouvrir la connexion : le DriverManager choisit le pilote approprié à cette URL parmi l'ensemble des pilotes disponibles. Connection dbcon = DriverManager.getConnection(dbUrl,user,password); Connection dbcon = DriverManager.getConnection(dbUrl);

16

Code de connexion : exemple (1/2)

Code de connexion : exemple (1/2) try { //Déclaration du driver : Class.forName("com.mysql.jdbc.Driver");

try { //Déclaration du driver :

Class.forName("com.mysql.jdbc.Driver"); //Url de connexion String dbUrl="jdbc:mysql://localhost:3306/laboBD"; //Profil/mot de passe String user = "root"; String password = "19AB5"; //connexion à la base dbcon = DriverManager.getConnection(dbUrl,user,password);

}

Code de connexion : exemple (2/2)

Code de connexion : exemple (2/2) catch ( ClassNotFoundException e ){ // erreur de chargement du

catch( ClassNotFoundException e ){ // erreur de chargement du pilote

}

catch( SQLException e ){

// erreur d'obtention de la connexion

}

finally{ // fermeture de la connexion pour libérer

// les ressources de la BD try{

if (dbcon!=null) dbcon.close();

}

catch(SQLException e){

}

}

Sqlite : connexion

Sqlite : connexion Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConnection

Class.forName("org.sqlite.JDBC");

Connection conn = DriverManager.getConnection ("jdbc:sqlite:mesdata.mesbds.magss.sqlite");

Fermeture de la connexion

conn.close();

3 types de requêtes

3 types de requêtes interface Statement requêtes interprétées à chaque exécution interface PreparedStatement

interface

Statement

interface Statement
3 types de requêtes interface Statement requêtes interprétées à chaque exécution interface PreparedStatement

requêtes interprétées à chaque exécution

interface

PreparedStatement

interface PreparedStatement
à chaque exécution interface PreparedStatement interface CallableStatement requêtes précompilées

interface

CallableStatement

interface CallableStatement

requêtes

précompilées

requêtes stockées dans la base

L'interface ResultSet

L'interface ResultSet Un objet de type ResultSet est une table représentant le résultat d'une requête à

Un objet de type ResultSet est une table représentant le résultat d'une requête à une base de données

Le nombre de lignes du tableau peut être nul.

Les données de la table sont accessibles ligne par ligne grâce à un curseur

Un resultSet gère un curseur sur la ligne courante de la table des données satisfaisant aux conditions de la requête.

Exécution d'une requête SQL de type Statement (1/2)

Exécution d'une requête SQL de type Statement (1/2) ● Le type de résultat obtenu dépend de

Le type de résultat obtenu dépend de la manière dont on souhaite manipuler le ResultSet

3 constantes de types :

TYPE_FORWARD_ONLY ( le curseur se déplace uniquement vers l'avant ) TYPE_SCROLL_INSENSITIVE ( le curseur se déplace en avant et en arrière mais le Resultset est insensible aux modifications apportées à la BD durant le traitement) TYPE_SCROLL_SENSITIVE ( le curseur se déplace en avant et en arrière mais les changements faits à la BD durant le traitement sont reflétés dans le ResultSet)

2 constantes de concurrence :

CONCUR_READ_ONLY ( les données du Resultset ne peuvent pas être modifiées) CONCUR_UPDATABLE ( des modifications de la BD peuvent être effectuées via le Resultset )

Exemple

Exemple ● Créer un objet de la classe java.sql.Statement Statement stmt = dbcon.createStatement(

Créer un objet de la classe java.sql.Statement

Statement stmt = dbcon.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

// indique que le ResultSet est scrollable et non // modifiable. // ResultSet.CONCUR_UPDATABLE indiquerait // qu'un seul utilisateur à la fois peut modifier // la donnée

Statement stmt = dbcon.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); // lorsqu'on apporte un changement au ResultSet, on peut y // accéder par la suite car le type est "scrollable" et on peut // récupérer sa valeur car le type est "SENSITIVE"

// récupérer sa valeur car le type est "SENSITIVE" Pour que les modifications apportées au Resultset

Pour que les modifications apportées au Resultset prennent effet dans la base, il faut appliquer les méthodes updateRow

23

Sqlite : création

Sqlite : création Statement stat = conn.createStatement(); stat.executeUpdate("drop table if exists magasins;");

Statement stat = conn.createStatement();

stat.executeUpdate("drop table if exists magasins;");

stat.executeUpdate("create table magasins (id, magasin,produit,prix);");

Exécution d'une requête SQL de type Statement (2/2)

Exécution d'une requête SQL de type Statement (2/2) Par défaut, le ResultSet n'est ni scrollable, ni

Par défaut, le ResultSet n'est ni scrollable, ni modifiable Statement stmt = dbcon.createStatement();

dbcon.createStatement(TYPE_FORWARD_ONLY,

CONCUR_READ_ONLY);

Construire la requête SQL Soit la table personne(nom,prenom,age) String reqSQL = "select * from personne";

Exécuter la requête ResultSet rs = stmt.executeQuery( reqSQL );

Exploiter les résultats d'une requête

(1/5)

Exploiter les résultats d'une requête (1/5) A la création du ResultSet , le curseur est placé

A la création du ResultSet, le curseur est placé avant la première ligne (N°1).

Pour le déplacer, on dispose des méthodes :

next() déplacement d'une ligne en avant

previous() déplacement d'une ligne en arrière

first() déplacement vers la première ligne

last() déplacement vers la dernière ligne

beforeFirst() déplacement avant la première ligne. Si le ResultSet est vide, cela n'a aucun effet.

afterLast() déplacement après la dernière ligne. Si le ResultSet est vide, cela n'a aucun effet.

relative(int i) déplace de i lignes par rapport à la position courante

absolute(int i) déplace le curseur vers la i-ème ligne

26

Exploiter les résultats d'une requête

(2/5)

Exploiter les résultats d'une requête (2/5) Déplacement absolu absolute( int i) i>0 déplacement vers la

Déplacement absolu absolute( int i) absolute( int i)

i>0 déplacement vers la ligne numéro i

rs.absolute(1) => déplacement vers la ligne 1

i<0 déplacement à partir de la fin rs.absolute(-1) => déplacement sur la dernière ligne rs.absolute(-3)=> si 30 lignes, déplacement vers ligne 28

Déplacement relatif relative( int i) On spécifie le nombre de déplacements à partir de la ligne courante relative( int i) On spécifie le nombre de déplacements à partir de la ligne courante

i>0 => déplacements en avant i<0 => déplacements en arrière

rs.absolute(4); // curseur sur la 4ème ligne rs.relative(-3); // curseur sur la première ligne rs.relative(2); // curseur sur la 3ème ligne

Exploiter les résultats d'une requête

(3/5)

Exploiter les résultats d'une requête (3/5) On récupère le contenu d'une ligne du ResultSet colonne par

On récupère le contenu d'une ligne du ResultSet colonne par colonne ResultSet colonne par colonne

Les méthodes d'accès sont construites sur le modèle : getXXX (XXX étant un type primitif ou String ) getXXX (XXX étant un type primitif ou String)

La colonne est spécifiée soit par son nom, soit par son numéro (la première colonne est numérotée 1)modèle : getXXX (XXX étant un type primitif ou String ) par son nom String getString(String

par son nom String getString(String nomAttribut) float getFloat(String nomAttribut)

par le numéro de la colonne qui lui correspond String getString(int indexColonne) float getFloat(int indexColonne)

idem pour les int, double, long, boolean, Object

Exploiter les résultats d'une requête

(4/5)

Exploiter les résultats d'une requête (4/5) Pour obtenir le n° de la ligne courante int getRow()

Pour obtenir le n° de la ligne courante int getRow() int getRow()

rs.absolute(5);

int i = rs.getRow(); // i=5

Pour tester la position dans le Resultset isFirst, isLast, isBeforeFirst, isAfterLast. Resultset isFirst, isLast, isBeforeFirst, isAfterLast.

if (rs.isAfterLast() == false) { rs.afterLast(); }

Exploiter les résultats d'une requête

(4/5)

Exploiter les résultats d'une requête (4/5) String reqSQL = "select * from personne"; ResultSet rs =

String reqSQL = "select * from personne"; ResultSet rs = stmt.executeQuery( reqSQL ); while (rs.next()){ String prenom = rs.getString("prenom"); int age = rs.getInt("age");

}

Sqlite : interrogation

Sqlite : interrogation ResultSet rs = stat.executeQuery ("select * from magasins;"); while (rs.next()) {

ResultSet rs = stat.executeQuery ("select * from magasins;");

while (rs.next()) { System.out.println("magasin = " + rs.getString("magasin"));

System.out.println("produit = " + rs.getString("produit"));

System.out.println("prix = " + rs.getString("prix"));

}

rs.close();

Mises à jour de table (1/2)

Mises à jour de table (1/2) Il est préférable que le ResultSet soit scrollable lors d'une

Il est préférable que le ResultSet soit scrollable lors d'une mise à jour Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

Pour mettre à jour, 2 méthodes:

updateXXX avec 2 paramètres (nom et valeur de la colonne) updateRow() rendre effective la mise à jour

Mises à jour de table (2/2)

Mises à jour de table (2/2) Nom Prénom Age Meyer René 54 ->37 Legrand Léa 18

Nom

Prénom

Age

Meyer

René

54->37

Legrand

Léa

18

Dupont

Marcel->Robert

43

String reqSQL = "select * from personne"; ResultSet rs = stmt.executeQuery( reqSQL );

rs.next();

rs.updateInt("Age",37);

rs.last();

rs.updateString("Prénom","Robert");

rs.updateRow();

L'interface ResultSetMetaData

L'interface ResultSetMetaData Permet d'obtenir la description du contenu du ResultSet ResultSetMetaData metaData

Permet d'obtenir la description du contenu du ResultSet ResultSetMetaData metaData = rs.getMetaData();

A partir de cette information, obtenir le nombre de colonnes du résultat int nbCols = metaData.getColumnCount();

Obtenir le nom de la colonne connaissant son indice (à partir de 1) String nomCol = metaData.getColumnName( int i );

Exemple

Exemple ResultSet rs = stmt.executeQuery( "SELECT * FROM personne" ); StringBuffer resultat = new

ResultSet rs = stmt.executeQuery( "SELECT * FROM personne" ); StringBuffer resultat = new StringBuffer(); ResultSetMetaData metaData = rs.getMetaData(); int nbCols = metaData.getColumnCount(); for ( int i=1;i<=nbCols;i++ ) resultats.append( metaData.getColumnName( i )+"\t" ); resultats.append( "\n" ); while ( rs.next() ){ for ( int i=1;i<=nbCols;i++ ) // pour simplifier, chaque donnée est du type Object // sinon le type de la valeur est obtenu par getColumnType resultats.append( rs.getObject( i )+"\t" ); resultats.append( "\n" );

}

Requêtes préparées

Requêtes préparées L'exécution de chaque requête à une BD nécessite 4 étapes : analyse compilation

L'exécution de chaque requête à une BD nécessite 4 étapes :Requêtes préparées analyse compilation optimisation Exécution Pour des requêtes identiques, les 3 premières étapes

de chaque requête à une BD nécessite 4 étapes : analyse compilation optimisation Exécution Pour des

analyse

compilationde chaque requête à une BD nécessite 4 étapes : analyse optimisation Exécution Pour des requêtes

optimisationà une BD nécessite 4 étapes : analyse compilation Exécution Pour des requêtes identiques, les 3

ExécutionBD nécessite 4 étapes : analyse compilation optimisation Pour des requêtes identiques, les 3 premières étapes

Pour des requêtes identiques, les 3 premières étapes n'ont pas à être effectuées de nouveau.4 étapes : analyse compilation optimisation Exécution Avec la notion de requête préparée, les 3 premières

Avec la notion de requête préparée, les 3 premières étapes ne sont effectuées qu'une seule fois.étapes n'ont pas à être effectuées de nouveau. JDBC propose l'interface PreparedStatement qui dérive

JDBC propose l'interface PreparedStatement qui dérive de l'interface Statement pour modéliser cette notion. PreparedStatement qui dérive de l'interface Statement pour modéliser cette notion.

Exécution d'une requête SQL de type PreparedStatement

Exécution d'une requête SQL de type PreparedStatement Avec l'interface Statement , on écrivait : Statement

Avec l'interface Statement, on écrivait :

Statement smt = dbcon.createStatement(); ResultSet rs = smt.executeQuery("SELECT * FROM personne" );

Avec l'interface PreparedStatement, on écrit :

PreparedStatement pSmt = dbcon.prepareStatement("SELECT * FROM personne" ); ResultSet rs = pSmt.executeQuery();

On voit que la requête est préparée à l'avance et n'est donc pas transmise en argument au moment de l'exécution ( executeQuery()).

Exécution d'une requête SQL de type PreparedStatement

Exécution d'une requête SQL de type PreparedStatement Pour préparer des requêtes paramétrées de la forme :

Pour préparer des requêtes paramétrées de la forme :

SELECT nom FROM Personnes WHERE age > ? AND adresse = ? On utilise les PreparedStatement avec les méthodes setType(numéroDeLArgument, valeur) Type représente le type de l'argument numéroDeLArgument représente le numéros de l'argument (commençant à 1 dans l'ordre d'apparition dans la requête). valeur représente la valeur qui lui est associée

Exemple :

PreparedStatement pSmt = dbcon.prepareStatement ("SELECT nom FROM Personne WHERE age > ? AND prenom=?" ); pSmt.setInt(1, 22); pSmt.setString(2, "Adrien"); ResultSet rs = pSmt.executeQuery();

Exécution d'une requête SQL de type PreparedStatement

Exécution d'une requête SQL de type PreparedStatement PreparedStatement psmt = dbcon.prepareStatement( "update

PreparedStatement psmt = dbcon.prepareStatement(

"update personne set nom = ? where prenom like ?");

psmt.setString(1, "Bauer");

psmt.setString(2, "René");

int i = psmt.executeUpdate():

On a changé en Bauer le nom de la personne dont le prénom est René

La valeur retournée par executeUpdate() est le nombre de lignes mises à jour

Sqlite : insertion

Sqlite : insertion PreparedStatement prep = conn.prepareStatement( "insert into magasins (magasin,produit,prix) values

PreparedStatement prep = conn.prepareStatement( "insert into magasins (magasin,produit,prix) values (?, ?, ?);");

prep.setString(1, "fdk"); prep.setString(2, "cafe"); prep.setFloat(3, 0.40f); prep.addBatch(); prep.setString(1, "fdk"); prep.setString(2, "soda"); prep.setFloat(3, 1.10f); prep.addBatch(); prep.setString(1, "fdk"); prep.setString(2, "barres"); prep.setFloat(3, 0.90f); prep.addBatch(); conn.setAutoCommit(false); prep.executeBatch(); conn.setAutoCommit(true);

Procédures stockées (1/2)

Procédures stockées (1/2) ● Les procédures stockées permettent d'embarquer du code procédural directement dans

Les procédures stockées permettent d'embarquer du code procédural directement dans la base

Elles exécutent une ou plusieurs requêtes SQL

Intérêt :

Elles sont précompilées

Ne nécessitent pas de trafic réseau

JDBC utilise la classe java.sql.CallableStatement

Syntaxe d'appel des procédures stockées

{call nom-proc-stokée(?,?)}

{?=call nom-proc-stokée(?,?)} // retour d'une valeur

// procédure sans résultat

Procédures stockées (2/2)

Procédures stockées (2/2) CallableStatement cstmt = dbcon.prepareCall("{call nom-proc-stokée(?,?)}");

CallableStatement cstmt = dbcon.prepareCall("{call nom-proc-stokée(?,?)}");

cstmt.registerOutParameter(2,java.sql.Types.FLOAT);

// indique que le second paramètre donne le résultat

cstmt.setInt(1,ID);

// fixe la donnée en entrée

cstmt.execute();

//exécute la procédure stockée System.out.println("Solde : " +cstmt.getFloat(2);

// affiche le résultat de l'exécution de la procédure // stockée figurant dans le second paramètre

Exercice

Exercice ● Soit une BD de nom " mags ", constituée de la seule table magasins

Soit une BD de nom " mags ", constituée de la seule table magasins :

(ID, magasin, produit, prix)

Cette BD est accessible avec les identifiants (" root ", " 2dwsk8 ")

Inutile pour sqlite

Ecrire le morceau de code Java permettant d'afficher le résultat de la requête : " liste des produits dont le prix est inférieur à 50€ " sous la forme :

produit prix

On utilisera pour cela les requêtes préparées de JDBC

Compléter le code pour modifier la table afin de ramener les prix de 50€ à 49,95€

43

Utilisation de sqlite

SQLite : gestionnaire de BD sans nécessité d'un serveur de BD

Télécharger le pilote JDBC pour SQLite : sqlitejdbc-v056.jar

Sous firefox, télécharger et installer le add-on :

● Sous firefox, télécharger et installer le add-on :

Sous firefox, lancer le manager (menu outils)

Entrer le nom de la BD

Connecter la BD

Créer les tables

Insérer les valeurs

Exporter une BD Mysql

Exporter une BD Mysql Sous wamp, il faut exporter la base pour obtenir le script sql

Sous wamp, il faut exporter la base pour obtenir le script sql correspondant On ajoute ensuite une ligne qui permet de vérifier l'existence d'une Base de même nom

DROP DATABASE IF EXISTS `tp`;

CREATE DATABASE `tp` DEFAULT CHARACTER SET latin1 COLLATE

latin1_swedish_ci;

USE `tp`; CREATE TABLE `personne` (`nom` varchar(20) NOT NULL default '',`prenom` varchar(20) NOT NULL default '',`age` tinyint(4) NOT NULL default '0',PRIMARY KEY (`nom`,`prenom`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `personne` VALUES ('Meyer', 'Luc', 30); INSERT INTO `personne` VALUES ('Dupont', 'René', 40);

Il suffit d'enregistrer le script dans un fichier sur votre clé usb

ATTENTION : chaque commande sql est situé sur une seule ligne