jdbc

publicité
JDBC
Java Data Base Connectivity
Java DataBase Connectivity (JDBC)
 Cette API est développée par Sun en collaboration avec les grands
éditeurs de SGBD.
 Les tâches assurées par JDBC sont:
 Gestion des connexions et transactions
 Préparation de requêtes SQL
 Accès aisé aux résultats
 JDBC est une architecture “bas niveau”, qui est utilisée dans les
applications J2EE pour assurer les fonctions de persistance des
données.
2
Architecture dans Java EE
Les pilotes JDBC
 Il existe 4 types de pilote:
Etapes d’utilisation de JDBC
 Création d’une instance de pilote JDBC
 Définition de l’URL de connexion
 Création d’une connexion vers un SGBDR avec l’instance du pilote
 Création d’une ou +eurs instructions
 Exécution de la requête.
 Récupération et traitement des lignes du jeu de résultat
 Fermeture du jeu de résultat
 Fermeture et Déconnexion de la BD
Création d’une instance de pilote JDBC
import java.sql.*;
public class ExempleJDBC{
public static void main(String[] Args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception E) {
System.err.println("Pas de pilote !");
}
... connexion et utilisation de la base ...
}}
•L'appel à forName déclenche un chargement dynamique du pilote.
•Un programme peut utiliser plusieurs pilotes, un pour chaque base de données.
•Le pilote doit être accessible à partir de la variable d'environnement CLASSPATH.
Connexion à la BD
try {
String url = "jdbc:mysql://localhost/dbessai";
Connection conn = DriverManager.getConnection(url, "user", “pw");
... utilisation de la base ...
}catch (SQLException E) { System.err.println(E.getMessage());
}
Connexion BD MySql
Les paramètres à connaitre pour formater URL de connexion JDBC /
MySQL:
 Le nom de la machine ou s'exécute le SGBD MySQL : localhost (en
local) ;
 le numéro de port sur lequel le SGBD est à l'écoute : 3306
 le nom de la base de données à accéder : BdTest
 le login : root
 le mot de passe : [aucun]
Ainsi :
String url = "jdbc:mysql://localhost:3306/BdTest";
Connection con = DriverManager.getConnectio(url,"root","");
Exécution Instruction SQL
 Un objet Statement est ce que votre instruction SQL envoie
vers le SGBD.
 Vous créerez simplement un objet Statement ,
 Puis l'exécuterez, lui fournissant la méthode d'exécution
appropriée avec l'instruction SQL que vous voulez envoyer.
 Pour une instruction SELECT, la méthode à utiliser est
executeQuery.
 Pour les instructions visant à créer ou modifier des tables, la
méthode est executeUpdate.
Les requêtes en JDBC
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "SELECT Nom,Prenom,Age
FROM personne " + "ORDER BY age" );
while (rs.next())
{ System.out.println("Nom : " + rs.getString(1));
System.out.println("Prénom : " + rs.getString(2));
System.out.println("Age : " + rs.getString(3));
}
rs.close(); // Fermeture
st.close();
conn.close();
Récupération/ Lecture Résultat
 JDBC renvoie les résultats dans un objet ResultSet, donc, nous
avons besoin de déclarer une instance de la class ResultSet pour
contenir nos résultats. Le code qui suit déclare l'objet ResultSet rs
et lui assigne le résultat de notre requête :
ResultSet rs = stmt.executeQuery("SELECT * FROM TABLE1");
 La variable rs, qui est une instance de ResultSet, contient les lignes
 Pour pouvoir accéder aux champs, nous irons dans chaque ligne et
récupèrerons les valeurs selon leur type
 La méthode next déplace le curseur à la ligne suivante
 La méthode getType (du type approprié) pour accéder à une
valeur dans chaque colonne.
 Par exemple, si la colonne contient une valeur de type VARCHAR. La
méthode est getString. Pour une colonne type SQL FLOAT la
méthode pour accéder à ces valeurs est getFloat.
Récupération Résultat
La classe java.sql.ResultSet
Accès aux valeurs :
 Type getType( int );
 Type getType( String );
 boolean next();
Le Type peut être:
Byte
Short
Int
Long
Float
BigDecimal
Boolean
String
Bytes
Date
Time
TimeStamp
AsciiStream
UnicodeStream
BinaryStream
Object
Correspondance des types Java / SQL
SQL
Java
CHAR
VARCHAR
LONGVARCHAR
NUMERIC
DECIMAL
BIT
TINYINT
SMALLINT
INTEGER
BIGINT
REAL
FLOAT
DOUBLE
BINARY
VARBINARY
LONGVARBINARY
String
String
String
java.math.BigDecimal
java.math.BigDecimal
boolean
byte
short
int
long
float
double
double
byte[]
byte[]
byte[]
Déplacement dans un « Result Set »
 rs.first();
 rs.beforeFirst();
 rs.next();
 rs.previous();
 rs.afterLast();
 rs.absolute( n );
 rs.relative( n );
Insertion de lignes
Statement st = conn.createStatement();
int nb = st.executeUpdate( "INSERT INTO personne(Nom,Age) "
+ "VALUES ('" + nom + "', " + age + ")" );
System.out.println(nb + " ligne(s) insérée(s)");
st.close();
 Ce principe est aussi utilisable pour les instructions UPDATE et
DELETE.
Erreurs et warnings
 La classe java.sql.SQLException enrichit la classe java.lang.Exception:
 SQLState : description de l'erreur
 getNextException()
 La classe java.sql.SQLWarning enrichit la classe java.sql.SQLException:
 getWarnings() : Warning suivant (il réalise des appels répétés).
Gestion des transactions
 Le mode par défaut est « Auto Commit »:
 connexion.setAutoCommit(false);
 connexion.commit();
 connexion.rollback();
Modification d'un « Result Set »
 Modification
 rs.updateString("Nom", “Ben Salah");
 rs.updateInt("Age", 24);
 rs.updateRow();
 Destruction:
 rs.deleteRow();
Insertion de lignes:
 rs.moveToInsertRow();
 rs.updateString("Nom", “Ben Salah");
 rs.updateInt("Age", 24);
 rs.insertRow();
 rs.first();
Regroupement de plusieurs mise à jour:
connexion.setAutoCommit(false);
Statement st = connexion.createStatement();
st.addBatch("INSERT ...");
st.addBatch("INSERT ...");
int[] nb = st.executeBatch();
On peut combiner des « Prepared Statement » et des « Batch
updates ».
Les DataSource
 L'interface javax.sql.DataSource permet:
 d'obtenir une connexion JDBC,
 de gérer un pool de connexion,
 de faire disparaître les constantes (placées dans un annuaire
JNDI ou un fichier de configuration).
Les RowSet
 L'accès aux données est encapsulé dans un seul Bean:
javax.sql.rowset.CachedRowSet rs = new com.sun.rowset.CachedRowSetImpl();
rs.setUrl("jdbc:mysql://localhost/dbessai");
rs.setCommand("SELECT * FROM personne");
rs.setUsername(“fgfgf");
rs.setPassword("...");
rs.setConcurrency(ResultSet.CONCUR_UPDATABLE);
rs.execute();
while (rs.next())
System.out.println("Nom : " + rs.getString("nom")); rs.close();
 Il existe trois types de RowSet:
 JDBCRowSet (basé sur JDBC),
 CachedRowSet (déconnecté de la base),
 WebRowSet (échange basé sur des flux XML),
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Exemple1 .. JSP et JDBC </title> </head>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page language="java" import = "java.sql.*" %>
<body>
<table border = "1" width = "400« >
<tr> <td> ID EMP</td><td> Nom Employé</td></tr>
<%
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/bdemp";
Connection conn = DriverManager.getConnection(url, "root", "");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from employes");
while(rs.next()){
String eid = rs.getString("idemp");
String nom = rs.getString("nom");
%>
<tr>
<%
<td> <%= eid %> </td> <td><%= nom %></td></tr>
}
stmt.close();
conn.close(); %>
</table> </body>
</html>
 Il est possible d’utiliser la technologie JavaBeans entre
une page JSP et un beans pour obtenir une meilleure
séparation entre Modèle, Vue et Contrôleur (Model View
Controller – MVC).
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ page language="java" import ="<default package>.* ,java.sql.*" %>
<jsp:useBean id="empbean" class ="empQBean" scope="page" />
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Exempe 2 JSP JDBC Avec JavaBean</title> </head>
<body> <table border = "3" width = "100%">
<tr> <td> ID EMP</td><td> Nom Employé</td></tr>
<%
empbean.makeConnection();
if (empbean.getEmployes()){
while (empbean.getNextEmploye())
{ String eid = empbean.getColumn("idemp");
String nome = empbean.getColumn("nom");
%>
<tr><td> <%= eid %> </td> <td><%= nome %></td></tr>
<% }
}
empbean.takeDown(); %>
</table> </body></html>
import java.sql.*;
import java.io.*;
public abstract class sqlBean {
private String myDriver = "com.mysql.jdbc.Driver";
private String myURL = "jdbc:mysql://localhost:3306/bdemp";
protected Connection myconn;
public sqlBean() { }
public void makeConnection() throws Exception {
Class.forName(myDriver);
myconn = DriverManager.getConnection(myURL);
}
public abstract void cleanup() throws Exception;
public void takeDown() throws Exception {
cleanup();
myconn.close(); }
}
import java.sql.*;
public class empQBean extends sqlBean {
String myEmpSql = "select * from employes";
ResultSet rs = null;
Statement stmt = null;
public empQBean() {
super();
}
public boolean getNextEmploye() throws Exception {
return rs.next();
}
public String getColumn(String inCol) throws Exception {
return rs.getString(inCol);
}
public boolean getEmployes() throws Exception {
String myQuery = myEmpSql;
stmt = myconn.createStatement();
rs = stmt.executeQuery(myQuery);
return (rs != null);
}
public void cleanup() throws Exception {
stmt.close();
}
}
Téléchargement