Intégration aux bases de données
CHAPITRE 7 3
fournir les services de nommage et de localisation. JNDI permet de séparer le code de l’appli-
cation des détails concernant la base de données, tels que le pilote, le nom d’utilisateur, le mot
de passe et l’URI de la connexion. Pour créer une connexion à une base de données en utili-
sant l’interface JNDI, on spécifie un nom de ressource qui correspond à une entrée dans une
base de données ou un service de nommage, pour recevoir les informations nécessaires à
l’établissement de la connexion. Cela protège le code JSP et ses composants des modifications
pouvant être apportées à la configuration de la base. Pour en savoir plus sur l’utilisation de
JNDI, reportez-vous au site de Sun à l’adresse http://java.sun.com/products.jndi
. Voici un exemple
de création d’une connexion à partir d’une source de données définie dans le registre JNDI :
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/DBVentes");
Connection con = ds.getConnection("username", "password");
Pour dissocier davantage le code JSP de l’accès à la base et rendre l’accès encore plus simple,
il est possible d’utiliser des balises personnalisées, qui utilisent JNDI pour l’accès à des
ressources nommées – comme ce qui se fait dans ColdFusion et d’autres langages à balises.
1.2. Les instructions préparées (
PreparedStatement
)
Les instructions préparées, très similaires à des procédures stockées, sont des modèles de
requêtes SQL réutilisables avec des paramètres différents à chaque exécution. La procédure
consiste pour l’essentiel à créer la requête, qui peut être tout type d’instruction SQL, sans
définir les valeurs de certaines variables. Les valeurs manquantes sont spécifiées avant
l’exécution de la requête, qui peut être réexécutée autant de fois que nécessaire. Les instruc-
tions préparées sont créées à partir d’un objet
Connection
, comme des objets
Statement
normaux. En SQL, les valeurs des variables à spécifier lors de l’exécution sont représentées
par un point d’interrogation (
?
) :
String query = "SELECT * FROM GAME_RECORDS WHERE SCORE > ? AND TEAM = ?";
PreparedStatement statement = connection.prepareStatement(query);
L’objet
PreparedStatement
prend en charge des méthodes d’affectation de valeur de para-
mètre, correspondant chacune à un type de données particulier,
int
,
long
,
String
, etc. Elles
prennent deux paramètres, d’une part l’indice du paramètre à spécifier et, d’autre part, la
valeur à lui affecter. Les valeurs d’indice commencent à 1 et non à 0. Dans notre cas, pour
obtenir tous les scores supérieurs à 10 000 dans l’équipe «Gold», on initialisera les valeurs
de paramètres de la requête avec les instructions suivantes, avant de l’exécuter :
statement.setInt(1, 10000); // Score
statement.setString(2, "Gold"); // Nom de l’équipe
ResultSet results = statement.executeQuery();
Une fois créée, l’instruction préparée peut être exécutée plusieurs fois avec différentes valeurs
de paramètres. Il n’est pas nécessaire de créer d’instance nouvelle de la procédure stockée tant
que la requête reste analogue. Plusieurs requêtes peuvent ainsi être exécutées sans créer
d’objet
Statement
. Une instruction préparée peut même être utilisée par différents composants
d’une application ou par différents utilisateurs d’une servlet. En outre, le moteur de la base de
données n’analyse l’instruction SQL qu’une seule fois.
En outre, les instructions préparées permettent le passage de paramètres
via
un composant
Java plutôt que par un codage littéral. Dans l’exemple suivant, le composant Java
userBean
,