ibatis SQL Maps Tutoriel

Documents pareils
Application web de gestion de comptes en banques

Construction d'une application MVC distribuée avec Spring Remoting. Partie 1 : HttpInvoker, Hessian, Burlap, RMI

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Création d une application JEE

Tutoriel d installation de Hibernate avec Eclipse

OpenPaaS Le réseau social d'entreprise

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Introduction à JDBC. Accès aux bases de données en Java

Java DataBaseConnectivity

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Notes de cours : bases de données distribuées et repliquées

1. Base de données SQLite

Compte Rendu d intégration d application

1. Installation d'un serveur d'application JBoss:

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

La base de données XML exist. A. Belaïd

TP Programmation Java / JDBC / Oracle

Paginer les données côté serveur, mettre en cache côté client

Chapitre 2. Classes et objets

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Création et Gestion des tables

I4 : Bases de Données

CREATION WEB DYNAMIQUE

Généralités sur le Langage Java et éléments syntaxiques.

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Compétences Business Objects

Alfstore workflow framework Spécification technique

Programmation d application Bases de données avec Java

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Premiers Pas en Programmation Objet : les Classes et les Objets

Cours Bases de données 2ème année IUT

ADO.NET. Ado.net propose deux modes d'accès, le mode connecté et le mode déconnecté.

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

TP3 : Creation de tables 1 seance

Olivier Mondet

Gestion du service des enseignements

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Accès aux bases de données

Bases de données relationnelles

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

SQL Historique

Bases de Données relationnelles et leurs systèmes de Gestion

Historisation des données

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Projet Java EE Approfondi

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

RMI le langage Java XII-1 JMF

Les BASES de DONNEES dans WampServer

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Stockage du fichier dans une table mysql:

Gestion du cache dans les applications ASP.NET

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Développement Web - Object Relational Mapping and Hibernate

Auto-évaluation Programmation en Java

TP Contraintes - Triggers

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Applet pour visualiser les variables «automate» notifiées

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

La réplication sous SQL Server 2005

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

PHP 5. La base de données MySql. A. Belaïd 1

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Raja Bases de données distribuées A Lire - Tutoriel

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Le Langage De Description De Données(LDD)

contact@nqicorp.com - Web :

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Langage SQL : créer et interroger une base

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Une introduction à la technologie EJB (2/3)

Chapitre 1 : Introduction aux bases de données

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

I. MySQL : Serveur et SGBD

Installation / configuration des applications PreInscription et Inscription Web Ajax

Chapitre 10. Architectures des systèmes de gestion de bases de données

Création d objet imbriqué sous PowerShell.

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Héritage presque multiple en Java (1/2)

Un ordonnanceur stupide

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Cours: Administration d'une Base de Données

Transcription:

ibatis SQL Maps Tutoriel Pour SQL Maps Version 2.0 15 Mai 2006 Traduction française de Julien Lafontaine (julienlafontaine2006@gmail.com)

Introduction Ce tutoriel vous guidera à travers les différentes étapes d'une utilisation classique de SQL Maps. Vous trouverez plus d'informations concernant les sujets abordés ci dessous dans le Guide du développeur SQL Maps, disponible à l'adresse suivante : http://ibatis.apache.org Préalables à l'utilisation de SQL Maps Le framework SQL Maps est très tolérant vis à vis des modèles de base de données ou même des modèles objet mal conçus. Il est malgré tout recommandé de concevoir le modèle de sa base de données (normalisation) ainsi que son modèle objet dans les règles de l'art. Cela vous garantira de bonnes performances et une conception propre. Commençons par nous pencher sur les éléments avec lesquels nous allons travailler. Quels sont les objets métiers? Quelles sont les tables de la base de données? Quelles relations existe-t-il entre eux? Pour notre premier exemple, considérons la classe Person obéissant à la convention JavaBean. Person.java package examples.domain; //imports sous-entendus. public class Person { private int id; private String firstname; private String lastname; private Date birthdate; private double weightinkilograms; private double heightinmeters; public int getid () { return id; public void setid (int id) { this.id = id; //les autres getters et setters ont été omis par manque de place Comment mapper cette classe sur notre base de données? SQL Maps n'impose aucune relation particulière entre classes java et tables de la base de données. Il est tout à fait possible d'avoir un mapping du type une table par classe, plusieurs tables par classe ou encore plusieurs classes par table. Puisque vous disposez de toute la puissance d'expression du SQL, il y a très peu de restrictions. Pour cet exemple, nous utiliserons la table suivante qui est tout à fait adaptée à un mapping du type une classe par table: Person.sql CREATE TABLE PERSON( PER_ID NUMBER (5, 0) NOT NULL, PER_FIRST_NAME VARCHAR (40) NOT NULL, PER_LAST_NAME VARCHAR (40) NOT NULL, PER_BIRTH_DATE DATETIME, PER_WEIGHT_KG NUMBER (4, 2) NOT NULL, PER_HEIGHT_M NUMBER (4, 2) NOT NULL, PRIMARY KEY (PER_ID) ) 2

Le fichier de configuration SQL Maps Maintenant que nous nous sommes familiarisés avec les classes et les tables avec lesquelles nous allons travailler, intéressons nous au fichier de configuration SQL Maps. Ce fichier fait office de configuration de base pour notre implémentation de SQL Maps. Le fichier de configuration est un fichier XML. Par l'intermédiaire de ce fichier nous allons configurer les propriétés internes du framework, les DataSources JDBC et le mapping SQL. Cela permet de centraliser la configuration des DataSources quelque soit leur nombre ou leur implémentation. Le framework gère différentes implémentations de DataSource : SimpleDataSource d'ibatis, Jakarta DBCP (Commons), ainsi que tous les DataSources auxquels on peut accéder via un contexte JNDI (typiquement au sein d'un serveur d'application). Tout cela est décrit en plus détail dans le Guide du développeur. La structure de ce fichier est très simple, dans le cas de l'exemple ci-dessus le fichier de configuration pourrait ressembler à cela: Exemple sur la page suivante 3

SqlMapConfigExample.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.apache.org//dtd SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <!-- Assurez vous de toujours utiliser l'en-tête XML ci dessus! --> <sqlmapconfig> <!-- On peut faire référence aux propriétés (nom=valeur) du fichier ci-dessous depuis le fichier de configuration (ex: ${driver. Ce fichier est optionnel. Le chemin est relatif au classpath. --> <properties resource="examples/sqlmap/maps/sqlmapconfigexample.properties" /> <!-- Ces paramètres permettent de configurer SqlMaps, ils concernent principalement la gestion des transactions. Ils sont optionnels (reportez vous au guide du développeur pour plus d'informations). --> <settings cachemodelsenabled="true" enhancementenabled="true" lazyloadingenabled="true" maxrequests="32" maxsessions="10" maxtransactions="5" usestatementnamespaces="false" /> <!-- Les alias vous permettent de faire référence à une classe en utilisant un nom court à la place du nom complet de la classe (nom + package). --> <typealias alias="order" type="testdomain.order"/> <!-- Configure un datasource utilisé par SQL Map, basé sur l'implémentation SimpleDataSource. Notez l'utilisation des propriétés contenues dans le fichier de propriétés ci-dessus --> <transactionmanager type="jdbc" > <datasource type="simple"> <property name="jdbc.driver" value="${driver"/> <property name="jdbc.connectionurl" value="${url"/> <property name="jdbc.username" value="${username"/> <property name="jdbc.password" value="${password"/> </datasource> </transactionmanager> <!-- Identifie tous les fichiers XML SQL Maps à charger. Notez que les chemins sont relatifs au classpath. Pour le moment il n'y en a qu'un --> <sqlmap resource="examples/sqlmap/maps/person.xml" /> </sqlmapconfig> 4

SqlMapConfigExample.properties # Ceci est un fichier de propriétés qui permet de simplifier la configuration automatique du fichier # de configuration de SQL Maps (ex: via l'utilisation d'ant, d'un outil d'intégration continue etc.) # Les valeurs suivantes peuvent être utilisées comme valeurs des propriétés dans le fichier ci- # dessus (ex: ${driver ) # L'utilisation d'un fichier de propriétés comme celui-ci est complètement optionnelle. driver=oracle.jdbc.driver.oracledriver url=jdbc:oracle:thin:@localhost:1521:oracle1 username=jsmith password=test 5

Le(s) fichier(s) SQL Maps Maintenant que nous avons un DataSource et que notre fichier de configuration est prêt, il nous faut écrire le fichier SQL Maps lui même. Il contient le code SQL ainsi que les mappings pour les objets paramètre et résultat (entrée et sortie respectivement). Continuons avec notre exemple, et construisons un fichier SQL Map pour la classe Person et la table PERSON. Nous commencerons par la structure générale d'un document SQL avec une simple requête de type SELECT: Person.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.apache.org//dtd SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlmap namespace="person"> <select id="getperson" resultclass="examples.domain.person"> SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# </select> </sqlmap> L'exemple ci-dessus est en fait le type de fichier SQL Map le plus simple qui soit. Il tire partie d'une des fonctionnalités du framework SQL Maps qui consiste à mapper les colonnes d'un ResultSet sur les propriétés d'un JavaBean (ou les entrées d'une Map etc.) lorsque elles ont le même nom. La chaîne #value# est un paramètre d'entrée. L'utilisation de value implique que l'on utilise un objet enveloppe associé à un type primitif (ex: Integer pour int, Long pour long, etc...). Cette approche est très simple mais elle comporte des limitations. Il est par exemple impossible de spécifier le type des colonnes (si cela est nécessaire) ou de charger automatiquement des données associées (propriétés complexes). Cette approche a également un impact sur les performances dans la mesure où elle nécessite de manipuler l'objet ResultSetMetaData. L'utilisation d'un resultmap permet de s'affranchir de ces limitations. Mais pour le moment nous privilégierons la simplicité. Il est toujours possible de changer d'approche plus tard (sans avoir à changer le code java). La plupart des applications utilisant une base de données ne se contentent pas de lire dans cette base de données, elles doivent aussi la modifier. Nous venons de voir à quoi ressemble le mapping d'une simple requête de type SELECT, mais qu'en est il des requêtes INSERT, UPDATE et DELETE? La bonne nouvelle c'est que ce n'est pas très différent. Ajoutons, dans le fichier SQL Map de la classe Person, les requêtes manquantes pour disposer d'un jeu complet de commandes nous permettant de charger et de modifier les données. 6

Person.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.apache.org//dtd SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlmap namespace="person"> <!-- Utilisation d'un objet enveloppe associé au type primitif (ex: Integer pour int, Long pour long etc...) comme paramètre, et mapping automatique du résultat de la requête sur les propriétés de l'objet Person --> <select id="getperson" parameterclass= int resultclass="examples.domain.person"> SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# </select> <!-- Utilisation des propriétés de l'objet Person (JavaBean) comme paramètres de la requête. Chaque paramètre entouré par le caractère dièse (ex: #id#) est une propriété du Bean.--> <insert id="insertperson" parameterclass="examples.domain.person"> INSERT INTO PERSON (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) VALUES (#id#, #firstname#, #lastname#, #birthdate#, #weightinkilograms#, #heightinmeters#) </insert> <!-- Utilisation des propriétés de l'objet Person (JavaBean) comme paramètres de la requête. Chaque paramètre entouré par le caractère dièse (ex: #id#) est une propriété du Bean.--> <update id="updateperson" parameterclass="examples.domain.person"> UPDATE PERSON SET PER_FIRST_NAME = #firstname#, PER_LAST_NAME = #lastname#, PER_BIRTH_DATE = #birthdate#, PER_WEIGHT_KG = #weightinkilograms#, PER_HEIGHT_M = #heightinmeters# WHERE PER_ID = #id# </update> <!-- Utilisation de la propriété id de l'objet Person (JavaBean) comme paramètre de la requête. Chaque paramètre entouré par le caractère dièse (ex: #id#) est une propriété du Bean.--> <delete id="deleteperson" parameterclass="examples.domain.person"> DELETE PERSON WHERE PER_ID = #id# </delete> </sqlmap> 7

Programmation avec le Framework SQL Map Maintenant que nous en avons fini avec la configuration et le mapping, il ne nous reste plus qu'à écrire le code Java. La première étape est la configuration de SQL Map. C'est très simple, il suffit de charger le fichier XML de configuration que nous venons de créer. On peut utiliser la classe Ressource fournie avec le framework afin de simplifier le chargement de ce fichier. String resource = com/ibatis/example/sqlmap-config.xml ; Reader reader = Resources.getResourceAsReader (resource); SqlMapClient sqlmap = SqlMapClientBuilder.buildSqlMapClient(reader); L'objet SqlMapClient est un objet service à durée de vie longue et sûr vis a vis des threads (thread safe). Pour chaque application s'exécutant vous n'avez besoin de l'instancier/configurer qu'une seule fois. Il peut donc être judicieux d'en faire un membre statique d'une classe de base (classe DAO de base par exemple), ou si vous préférer qu'il soit configurer de manière plus centrale et accessible plus globalement, vous pouvez le stocker dans une classe utilitaire que vous aurez développée vous même. Voici à quoi cette classe pourrait ressembler: public MyAppSqlConfig { private static final SqlMapClient sqlmap; static { try { String resource = com/ibatis/example/sqlmap-config.xml ; Reader reader = Resources.getResourceAsReader (resource); sqlmap = SqlMapClientBuilder.buildSqlMapClient(reader); catch (Exception e) { // Si une erreur survient à cet endroit, quelle qu'en soit la raison elle ne sera pas récupérable. // Il faut donc que l'application signale clairement le problème. // Il est important de tracer ces exceptions et de les lever de nouveau afin de mettre // immédiatement le problème en évidence. e.printstacktrace(); throw new RuntimeException( Erreur durant l'initialisation de MyAppSqlConfig. Cause: +e); public static SqlMapClient getsqlmapinstance () { return sqlmap; Chargement d'objets depuis la base de données Maintenant que l'instance de SqlMap est initialisée et facilement accessible, nous pouvons enfin l'utiliser. Commençons par charger un objet Person depuis la base de données. (Pour cet exemple supposons que nous ayons 10 enregistrements dans la table PERSON dont les identifiants PER_ID vont de 1 à 10). Pour charger un objet Person depuis la base de données, nous avons seulement besoin d'une instance de SqlMap, du nom du mapping de la requête et de l'identifiant de l'enregistrement que nous voulons récupérer. Essayons de charger l'objet Person numéro 5. SqlMapClient sqlmap = MyAppSqlMapConfig.getSqlMapInstance(); // définie ci-dessus Integer personpk = new Integer(5); Person person = (Person) sqlmap.queryforobject ( getperson, personpk); 8

Ecriture d'objets dans la base de données Maintenant que nous disposons d'un objet Person chargé depuis la base de données. Essayons de modifier quelques informations. Nous allons changer la taille et le poids de cette Person. person.setheightinmeters(1.83); // objet Person chargé plus haut person.setweightinkilograms(86.36); sqlmap.update( updateperson, person); Il est tout aussi simple de supprimer une Person sqlmap.delete ( deleteperson, person); Insérer un nouvelle Person ce fait de manière similaire Person newperson = new Person(); newperson.setid(11); newperson.setfirstname( Clinton ); newperson.setlastname( Begin ); newperson.setbirthdate (null); newperson.setheightinmeters(1.83); newperson.setweightinkilograms(86.36); sqlmap.insert ( insertperson, newperson); Et voilà ce n'est pas plus compliqué que ça! // Il est généralement préférable d'obtenir un identifiant depuis une // séquence ou un table spécifique Etapes suivantes C'est la fin de ce petit tutoriel. Le guide du développeur SQL Maps 2.0, ainsi que JPetStore 4 (un exemple complet d'application basée sur Jakarta Struts, ibatis DAO 2.0 et SQL Maps 2.0) sont disponibles à l'adresse suivante http://ibatis.apache.org. 9

CLINTON BEGIN ET JULIEN LAFONTAINE NE FOURNISSENT AUCUNE GARANTIE, EXPLICITE OU IMPLICITE, QUANT AUX INFORMATIONS CONTENUES DANS CE DOCUMENT. 2004 Clinton Begin. Tous droits réservés. ibatis et le logo ibatis sont des marques déposée par Clinton Begin. Les noms des entreprises et des produits mentionnés dans ce document peuvent être des marques déposées par leurs propriétaires respectifs. 10