Nous trouvons dans la plupart des architectures distribuées un ou plusieurs SGBD ( Système de Gestion de Base de Données ). Pour effectuer des requêtes dans ces bases, nous disposons de deux technologies principales:
Les drivers JDBC qui sont des classes généralement spécialisées à une SGBD voire à une version de cet SGBD (comme Oracle 8i ). Ces drivers peuvent communiquer avec la base dans une communication client-serveur classique et spécifique au SGBD. Dans le cas d'Oracle, le JDBC est une sorte d'émulation du protocole Sqlnet. Les classes JDBC Oracle 8i sont fournies par Oracle.
Les drivers ODBC/JDBC ou "pont ODBC/JDBC" . Une couche supplémentaire - l'ODBC - est placée entre le driver JDBC et la base . Le JDBC communique avec l'interface ODBC et non directement avec la base. L'intérêt réside dans la caractère standard de l'ODBC qui est utilisé dans les SGBD comme Microsoft SQLServer ou Microsoft Access.
Ces différents drivers permettent d'accéder indifféremment à la plupart des SGBD.
Dans cet exemple commenté, nous allons effectuer un requête simple : 'select sysdate from dual;' dans une instance Oracle en utilisant le driver fourni par oracle. Cet exemple est très simple car la requête ne renvoie qu'une seule ligne et une seule colonne.
Le package java.sql comprend la classe DriverManager qui gère les drivers. En standard, java.sql possède un driver fourni par Sun. Dans notre cas, nous allons charger le driver d'Oracle pour Oracle 8i. Pour utiliser un nouveau driver, il faut l'enregistre par la méthode statique DriverManager.registerDriver(Driver)
Pour obtenir l'objet Driver en argument de registerDriver, nous allons charger le driver fourni par Oracle et s'appelant oracle.jdbc.OracleDriver.class puis nous allons en créer une instance.
Class cOracleDriver=Class.forName("oracle.jdbc.OracleDriver");
Remarque: La méthode forName() renvoie un objet Class et est utilisée lorsque le nom de la classe à utiliser n'est pas connu par avance.
Puis nous instancions un objet Driver :
Driver dOracleDriver=cOracleDriver.newInstance();
La méthode newInstance() renvoie une instance sur la classe.
Remarque: Nous utilisons cette méthode d'obtention d'un objet pour trois raisons:
Le driver à utiliser peut être un paramètre de l'application et sélectionné par l'utilisateur. Dans ce cas, nous savons qu'un type Driver doit être instancié mais pas lequel.
Le chargement d'une classe par un forName() est souvent plus rapide que dans un new().
Nous donnons ainsi un exemple dans ce tutorial d'une obtention d'objet via forName() et newInstance().
Cependant, si nous connaissons à l'avance la base et le driver à utiliser, il suffira de faire:
Driver dOracleDriver=new OracleDriver(); à condition d'avoir fait un import de oracle.jdbc.*;
DriverManager.registerDriver(dOracleDriver);
Connection cConnection=DriverManager.getConnection("url","user","pwd");
Les arguments sont tous des chaînes de caractères. Le String 'url' est normalisé. Pour une connexion JDBC Oracle via le thin driver c'est-à-dire le driver léger, le 'connection string' sera:
"jdbc:oracle:thin:@[ip]:[port]:[nom de l'instance]"
Pour une connexion via pont ODBC/JDBC:
"jdbc:odbc:@[ip]:[port]:[nom de l'instance]"
L'objet Statement gère les requêtes et les accès au SGBD.
Statement sStat=cConnection.createStatement();
ResultSet rsResult=sStat.executeQuery("requete");
La requête est contenue dans une chaîne de caractère sans ';'
Le ResultSet qui est une énumération est positionné à sa première valeur puis son contenu est affiché pour une colonne donnée. Ainsi, par la méthode rsResult.next(), nous explorons les lignes et la méthode getObject(index) permet d'explorer les valeurs dans les colonnes pour une ligne donnée. Dans notre exemple très simple, nous n'aurons qu'une ligne et qu'une colonne.
rsResult.next();
System.out.println(rsResult.getObject(1));
La première colonne du ResultSet est à l'index un et non zéro.
C'est indispensable pour effectuer les requêtes suivantes.
rsResult.close();
import
java.sql.*;
import oracle.jdbc.driver.*;
class TestJDBC{
String sQuery;
TestJDBC(){
this.sQuery="select sysdate from dual";
Statement sStat=null;
Connection cCon=null;
try{
Class
cDriverOracle=Class.forName("oracle.jdbc.driver.OracleDriver");
Driver
dDriverOracle=(java.sql.Driver)cDriverOracle.newInstance();
DriverManager.registerDriver(dDriverOracle);
cCon=DriverManager.getConnection("jdbc:oracle:thin:@10.31.12.14:1521:ORCL","scott","tiger");
}
catch(Exception
e){
System.out.println("--Pbm en chargeant le driver JDBC
oracle--");
e.printStackTrace();
}
try{
sStat=cCon.createStatement();
ResultSet rs=sStat.executeQuery(sQuery);
rs.next();
System.out.println("Resultat requete:
"+rs.getObject(1));
sStat.close();
}
catch(Exception
sqlE){
System.out.println("La Requête n'a pas
abouti");
sqlE.printStackTrace();
}
}
public static
void main(String[] sArgs){
TestJDBC tj=new TestJDBC();
}
}
Tutorial SUN:
http://developer.java.sun.com/developer/onlineTraining/Database/JDBCShortCourse/index.html