Accueil > DynaResume > Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step15]

Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step15]


Dans le billet précédant [step14], nous avons récupéré les JARs (OSGifié) que nous allons avoir besoin pour mettre en place la couche DAO avec JPA. Dans ce billet nous allons créer et alimenter la base de données dynaresume qui contient une table T_USER constituée des colonnes suivantes :

  • USR_ID_N, entier qui est l’identifiant technique d’un utilisateur. Cette colonne est la clé primaire de la table. Les 2 bases H2 et Derby gérant le type IDENTITY (qui permet d’auto-incrémenter l’identifiant lors d’une insertion), nous typerons la colonne USR_ID_N avec IDENTITY.
  • USR_LOGIN_C, chaîne de caractères qui est le login de l’utilisateur.
  • USR_PASSWORD_C, chaîne de caractères qui est le mot de passe de l’utilisateur.

2 bases de données de type différent vont être créées et alimentées, pour cela nous allons :

  • dans le projet Eclipse Simple dynaresume-db, créer et alimenter via des scripts, 2 bases de données avec une Table T_USER :
    • création de la base dynaresume H2.
    • création de la base dynaresume Derby.
  • dans le projet Eclipse Java dynaresume-db-test, tester les 2 bases de données en utilisant les JARs H2 et Derby téléchargés dans le zip spring-target-platform-dao.zip du billet [step14].

Vous pouvez télécharger org.dynaresume_step15.zip qui contient les 2 projets expliqués dans ce billet :

dynaresume-db

Dans cette section nous allons créer le projet Simple Eclipse dynaresume-db qui contient les scripts de création et d’alimentation des bases H2 et Derby :

Comme vous pouvez le constater :

  • 2 bases de données sont utilisées, car dans la suite des billets nous montrerons comment il est simple d’utiliser avec JPA, 2 bases de données et enfin montrer comment on peut switcher d’une base de données à une autre au runtime (sans arrêter l’application) à l’aide de Spring DM (OSGi).
  • H2 et Derby ont été choisi car ce sont des bases de données Java qui peuvent être lancées en mode embarqué (« Embdeded »). Ce mode embarqué permet d’éviter de devoir installer la base de données. Il suffit que les JARs de la base de données soient présents dans le « ClassPath » pour que celles-ci fonctionnent.

H2

Dans cette section nous allons créer la base de données dynaresume pour la base H2 Database. Pour effectuer cela, nous allons créer :

La base de données H2 se créera dans la répertoire h2/db sous forme d’un fichier dynaresume.data.db.

Créez le répertoire h2 dans le projet dynaresume-db.

Lib

Copiez-collez le JAR com.springsource.org.h2-1.0.71.jar téléchargé dans le zip spring-target-platform-dao.zip du billet [step14] dans le repertoire h2/lib.

Ce JAR contient la classe org.h2.tools.RunScript qui permet de lancer des scripts SQL pour H2. Pour plus d’information voir la la section Upgrade, Backup, and Restore.

Scripts

Ici nous allons créer un fichier h2.cmd qui appellera le script de création h2schema.ddl et le script d’alimentation data.sql de la base H2. Créez le répertoire scripts dans le répertoire h2.

h2schema.ddl

Créez le fichier h2schema.ddl dans le répertoire h2/scripts comme suit :

create table T_USER (
        USR_ID_N IDENTITY not null,        
        USR_LOGIN_C varchar(50) not null,
        USR_PASSWORD_C varchar(50) not null,
        primary key (USR_ID_N)
    );

La colonne USR_ID_N est la clé primaire de la table T_USER et est typé avec IDENTITY pour s’auto-incrémenter lors d’une insertion d’un enregistrement dans la table.

data.sql

Créez le fichier data.sql dans le répertoire h2/scripts comme suit :

INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('angelo (H2)', '');
INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('djo (H2)', '');
INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('keulkeul (H2)', '');
INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('pascal (H2)', '');

REMARQUE : La colonne USR_ID_N n’est pas renseignée car elle est de type IDENTITY.

h2.cmd

Créez le fichier h2.cmd dans le répertoire h2/scripts comme suit :

java -cp ../lib/com.springsource.org.h2-1.0.71.jar org.h2.tools.RunScript -url jdbc:h2:../db/dynaresume -user sa -script h2schema.ddl
java -cp ../lib/com.springsource.org.h2-1.0.71.jar org.h2.tools.RunScript -url jdbc:h2:../db/dynaresume -user sa -script data.sql

Ce fichier commande permet d’executer les 2 scripts h2schema.ddl et data.sql en utilisant org.h2.tools.RunScript.

Launch

Pour lancer h2.cmd vous pouvez le lancer

Ligne de commande

Placez vous dans le répertoire ou se trouve le fichier h2.cmd :

cd YOUR_WORKSPACE/dynaresume-db/h2/scripts

Executez la commande h2.cmd :

h2.cmd

Ceci génère la base dynaresume avec une table T_USER alimentée, dans le fichier dynaresume-db/h2/db/dynaresume.data.db

Run (Program) Eclipse

REMARQUE : le zip org.dynaresume_step15.zip contient le launch (qui a été exporté) expliqué ci dessous dans dynaresume-db/launch/H2.launch.

Accédez au menu External Tools Configuration :

la fenêtre de dialogue External Tools Configuration s’ouvre, sélectionnez l’item Program :

Clic droit sur le bouton de la souris + New ajoute un launch de type Program. Renommez le ensuite en H2. Cliquez ensuite sur le bouton Browse Workspace (du groupe Location) pour sélectionner le fichier h2.cmd : :

Cette action ouvre la fenêtre de dialogue qui demande de sélectionner un fichier. Sélectionnez le fichier h2.cmd :

Cliquez sur OK, le champs Location se met à jour avec le chemin du fichier h2.cmd.
Il faut ensuite indiquer le répertoire de base de travail (comme lorsque l’on a effectué en ligne de commande via cd YOUR_WORKSPACE/dynaresume-db/h2/scripts). Pour cela cliquez sur le bouton Browse Workspace (groupe Working Directory) :

Ceci ouvre la fenêtre de dialogue de sélection de répertoire :

Sélectionnez le répertoire dynaresume-db/h2/scripts. Cliquez sur OK, le champs Working Directory se met à jour avec le répertoire scripts de H2:

Cliquez sur le bouton Run pour lancer la commande h2.cmd qui génère la base dynaresume H2 avec une table T_USER alimentée, dans le fichier dynaresume-db/h2/db/dynaresume.data.db.

Derby

Dans cette section nous allons créer la base de données dynaresume pour la base Apache Derby. Pour effectuer cela, nous allons créer :

La base de données Derby se créera dans la répertoire derby/db sous forme d’un répertoire dynaresume qui contient d’autres répertoires.

Créez le répertoire derby dans le projet dynaresume-db.

Lib

Je n’ai pas pu utiliser les JARs de Derby téléchargés dans le billet [step14] pour générer la base (comme ce qui a été effectué pour H2), car ceux ci ne contiennent pas les classes tools Derby qui permettent d’exécuter des scripts SQL. Pour cela j’ai téléchargé dans la page Apache Derby 10.5.3.0 Release le zip db-derby-10.5.3.0-bin.zip.

Après avoir dézippé db-derby-10.5.3.0-bin.zip, récupéré les JARs :

  • lib/derby.jar
  • lib/derbytools.jar

et copiez les dans le répertoire derby/lib (à créer) lib du projet eclipse dynaresume-db.

Scripts

Pour éxécuter des scripts Derby, l’outil intéractif SQL IJ (qui vient avec la distribution Derby) a été utilisé. Je me suis inspiré de 4.1. Using Derby from the command line (ij). Le JAR derbytools.jar fournit la classe org.apache.derby.tools.ij qui permet d’exécuter des scripts IJ.

derbyschema.ddl

Créez le fichier derbyschema.ddl dans le répertoire derby/scripts comme suit :

create table T_USER (
        USR_ID_N integer GENERATED ALWAYS AS IDENTITY (start with 1, increment by 1),        
        USR_LOGIN_C varchar(50) not null,
        USR_PASSWORD_C varchar(50) not null,
        primary key (USR_ID_N)
    );

La colonne USR_ID_N est la clé primaire de la table T_USER et est typé avec IDENTITY pour s’auto-incrémenter lors d’une insertion d’un enregistrement dans la table.

data.sql

Créez le fichier data.sql dans le répertoire derby/scripts comme suit :

INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('angelo (Derby)', '');
INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('djo (Derby)', '');
INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('keulkeul (Derby)', '');
INSERT INTO T_USER (USR_LOGIN_C, USR_PASSWORD_C) VALUES ('pascal (Derby)', '');

REMARQUE : La colonne USR_ID_N n’est pas renseignée car elle est de type IDENTITY.

derby.ij

Créez le fichier derby.ij dans le répertoire derby/scripts comme suit :

connect 'jdbc:derby:../db/dynaresume;create=true';

run 'derbyschema.ddl';
run 'data.sql';

exit;

Ce fichier IJ permet de se connecter à la base et d’appeler les 2 scripts derbyschema.ddl et data.sql.

derby.cmd

Créez le fichier derby.cmd dans le répertoire derby/scripts comme suit :

java -cp ../lib/derbytools.jar;../lib/derby.jar org.apache.derby.tools.ij derby.ij

Ce fichier permet d’appeler le script IJ derby.ij. Lancez derby.cmd (en ligne de commande ou avec Eclipse. Cette action génère la base dynaresume Derby avec une table T_USER alimentée, dans le répertoire dynaresume-db/derby/db/dynaresume.

dynaresume-db-test

Dans cette section nous allons tester nos 2 bases de données H2 et Derby en écrivant une classe Java de test pour chacune des bases de données. Cette classe de test se connectera à la base et affichera la liste des Users de la table T_USER. Nos tests utiliserons les 2 bases de données H2 et Derby qui doivent être copiés dans le répertoire C:/db.

Pour cela nous allons créer le projet Java dynaresume-db-test :

Créer le projet Java dynaresume-db-test.

H2 Test

Lib

Copiez la librairie spring-target-platform-dao/lib/h2/com.springsource.org.h2-1.0.71.jar du zip spring-target-platform-dao.zip dans le répertoire lib du projet dynaresume-db-test. Ajoutez le JAR lib/com.springsource.org.h2-1.0.71.jar au ClassPath du projet.

Classe DynaresumeH2Test

Dans le projet dynaresume-db-test créez la classe org.dynaresume.db.test.h2.DynaresumeH2Test comme suit :

package org.dynaresume.db.test.h2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DynaresumeH2Test {

	public static void main(String[] args) {
		Connection connect = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		try {
			// 1. Load SQL H2 Driver
			Class.forName("org.h2.Driver");
			// 2. Get SQL Connection from H2 Database stored into C:/db/h2/
			connect = DriverManager.getConnection(
					"jdbc:h2:C:/db/h2/dynaresume", "sa", "");
			// 3. Execute SQL query to get login from T_USER.
			statement = connect.prepareStatement("SELECT * from T_USER");
			resultSet = statement.executeQuery();
			// 4. Display result of SQL Query (login of T_USER)
			while (resultSet.next()) {
				
				long id = resultSet.getLong("USR_ID_N");
				String login = resultSet.getString("USR_LOGIN_C");
				String password = resultSet.getString("USR_PASSWORD_C");

				System.out.println("User [id=" + id + ", login=" + login
						+ ", password=" + password + "]");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				if (statement != null) {
					statement.close();
				}
				if (connect != null) {
					connect.close();
				}
			} catch (Exception e) {

			}
		}
	}

}

Si vous lancez cette classe, avant d’avoir mis la base de données dynaresume H2 dynaresume.data.db dans le répértoire C:/db/h2/, vous aurez l’erreur suivante :

org.h2.jdbc.JdbcSQLException: Table T_USER not found; SQL statement:
SELECT * from T_USER [42102-71]
at org.h2.message.Message.getSQLException(Message.java:92)
...

Copiez-collez la base H2 dynaresume.data.db du répértoire YOUR_WORKSPACE/dynaresume-db/h2/db dans dans le répertoire C:/db/h2. Relancez et la console doit afficher la liste des logins des Users avec le préfix (H2) :

User [id=1, login=angelo (H2), password=]
User [id=2, login=djo (H2), password=]
User [id=3, login=keulkeul (H2), password=]
User [id=4, login=pascal (H2), password=]

Derby Test

Lib

Copiez les librairies com.springsource.org.apache.derby-10.5.1000001.764942.jar (base Derby) et com.springsource.org.apache.derby.client-10.5.1000001.764942.jar (Client Derby) du répertoire spring-target-platform-dao/lib/derby/ du zip spring-target-platform-dao.zip dans le répertoire lib du projet dynaresume-db-test. Ajoutez les 2 JARs au ClassPath du projet.

Classe DynaresumeDerbyTest

Dans le projet dynaresume-db-test créez la classe org.dynaresume.db.test.derby.DynaresumeDerbyTest comme suit :

package org.dynaresume.db.test.derby;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DynaresumeDerbyTest {

	public static void main(String[] args) {
		Connection connect = null;
		PreparedStatement statement = null;
		ResultSet resultSet = null;
		try {
			// 1. Load SQL Derby Driver
			Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
			// 2. Get SQL Connection from H2 Database stored into C:/db/derby/
			connect = DriverManager
					.getConnection("jdbc:derby:C:/db/derby/dynaresume");
			// 3. Execute SQL query to get login from T_USER.
			statement = connect.prepareStatement("SELECT * from T_USER");
			resultSet = statement.executeQuery();
			// 4. Display result of SQL Query (login of T_USER)
			while (resultSet.next()) {

				long id = resultSet.getLong("USR_ID_N");
				String login = resultSet.getString("USR_LOGIN_C");
				String password = resultSet.getString("USR_PASSWORD_C");

				System.out.println("User [id=" + id + ", login=" + login
						+ ", password=" + password + "]");

			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				if (statement != null) {
					statement.close();
				}
				if (connect != null) {
					connect.close();
				}
			} catch (Exception e) {

			}

		}

	}

}

Si vous lancez cette classe, avant d’avoir mis la base de données dynaresume Derby dans le répértoire C:/db/derby/, vous aurez l’erreur suivante :

java.sql.SQLException: Database 'C:/db/derby/dynaresume' not found.
at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
...

Copiez-collez la base Derby, autrement dit le répértoire YOUR_WORKSPACE/dynaresume-db/derby/db/dynaresume dans dans le répertoire C:/db/derby. Relancez et la console doit afficher la liste des logins des Users avec le préfix (Derby) :

User [id=1, login=angelo (Derby), password=]
User [id=2, login=djo (Derby), password=]
User [id=3, login=keulkeul (Derby), password=]
User [id=4, login=pascal (Derby), password=]

Conclusion

Dans ce billet nous avons initialisé les 2 bases H2 et Derby via des scripts. Ces 2 bases peuvent être lancés en mode embarqué (dans un contexte OSGi, les JARs récupérès fonctionnent aussi). Dans le prochain billet nous allons mettre en place JPA en utilisant ces 2 bases de données.

Vous pouvez lire le billet suivant [step16].

Publicité
Catégories :DynaResume Étiquettes : ,

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :