Comment accéder à la base de données Access ?

Nous commencerons à nouveau la suite d’aujourd’hui en téléchargeant la version actuelle des codes source pour l’épisode actuel de la série, idéalement en utilisant Mercurial :
$ hg pull $ hg en haut « 3e épisode » Alternativement, vous pouvez les télécharger sous forme d’archive bzip2 via le web.
A voir aussi : Les nouvelles innovations en matière d'applications de productivité pour un bureau efficace
Plan de l'article
- Connexions gérées par conteneurs
- Méthodes de travail avec la base de données
- Notre base de données
- VENIR TABLE ( id entier NON NULL DEFAULT nextval (‘businesses_seq’። regclass), caractère nazev variable (255) PAS NULL, date de l’horodatage avec le fuseau horaire DEFAULT now (), CONTRAINTE entrepreneur_pk PRIMAIRE K ) AVEC ( OIDS=FALSE ) ; MODIFIER LE PROPRIÉTAIRE DE L’ENTREPRISE TABLE À NEKRAK ACCORDER TOUT SUR LA TABLE Enterprise à nekurak GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE Enterprise TO neku Quelques mots à la sécurité
- Marques JSP
- jdbc/nekurak javax.sql.DataSource Conteneur Connexion JDBC personnalisée
- La conclusion
- Liens
Connexions gérées par conteneurs
À partir d’autres langues, vous pouvez être utilisé pour établir des connexions de base de données directement dans l’application — entrez nom, mot de passe, adresse IP du serveur, connexion… Vous pouvez pratiquer cette approche en Java, bien sûr, aussi, mais le plus intéressant est de laisser ce travail ennuyeux sur le serveur d’applications (conteneur). Ceci est particulièrement pratique pour deux raisons :
- Pooling de connexions
- Configuration minimale ou zéro de l’application
L’ établissement d’un lien de base de données présente toujours des frais généraux — en plus de l’établissement d’une connexion TCP, vous devez vérifier le nom et le mot de passe et allouer certaines ressources à l’utilisateur sur le côté de la base de données — ce qui vaut le coup de temps et effectuez ces étapes chaque fois que vous chargez la page bloquant inutilement. Par conséquent, le soi-disant pool de connexions — un « pool » est créé dans lequel les connexions de base de données attendent jusqu’à ce que quelqu’un (l’application) en ait besoin. Au lieu de créer une connexion, l’application la demande à partir du pool et quand elle n’en a plus besoin, elle ferme la connexion. Cependant, il n’y aura pas de résiliation réelle de la connexion avec la base de données, mais seulement la renvoyer au « pool ». Les connexions sont recyclés ici, mais du point de vue de l’application, le processus est transparent.
A lire également : Quel fauteuil choisir pour le télétravail ?
Nous faisons à la fois des connexions de base de données et des paramètres de pool (taille, etc.) au niveau du serveur d’applications et nous n’avons plus à nous en soucier dans l’application. Ce qui est bien, c’est que nous puissions compiler l’application une fois (comme .war) et selon que nous la déployons sur, par exemple, un serveur de test ou un serveur d’exploitation, elle se connectera à la base de données pertinente — il n’est pas nécessaire de la configurer manuellement séparément. Une fois défini un pool de bases de données peut utiliser plusieurs applications en même temps.
Vous vous demandez probablement comment l’application « pool » trouve afin qu’elle puisse demander une connexion à partir d’elle. Pour ce faire, le soi-disant JNDI, qui est un service de noms utilisé en Java. De manière très simple, dans le serveur d’applications, nous définissons le nom JNDI (par exemple jdbc/nekurak) pour notre pool et l’application le verra par ce nom.
Réglage de Glassfishe
Le serveur d’applications ne peut pas fonctionner lui-même avec des bases de données comme PostgreSQL ou MySQL — nous devons d’abord installer un pilote JDBC que nous téléchargeons à partir de nos pages SGBD. C’est un peu de travail, mais d’un autre côté, il n’y a pas de problème de connexion à n’importe quelle base de données – les pilotes JDBC existent pour pratiquement n’importe quoi. Nous plaçons le fichier .jar avec le pilote JDBC (par exemple postgresql-8.4-701.jdbc4.jar) dans le dossier glassfish/domains/domain1/lib/ext dans notre installation Glassfishe et le redémarrons. Notre application utilise PostgreSQL, mais si vous avez une autre base de données préférée (MySQL…), créez simplement les mêmes tables dedans – au moins l’exemple d’aujourd’hui fonctionnera.
Grâce à l’interface web, nous créons un « pool de connexion » d’abord – comme « Type de ressource » nous choisissons javax.sql.ConnectionPoolDataSource et entrez les données nécessaires : nom, mot de passe, port et serveur de base de données.
En utilisant le bouton Ping, nous pouvons tester que nous avons créé le « Pool de connexion » correctement. Par la suite, dans « Ressources JDBC », nous attribuons le nom JNDI jdbc/nekurak au pool créé.
Méthodes de travail avec la base de données
Comme c’est le cas dans le monde de Java, il existe plusieurs chemins vers une destination. Ainsi, il existe plusieurs façons de travailler avec la base de données dans l’application.
- Balises JSP — dans la bibliothèque standard, nous avons un ensemble de balises disponibles pour travailler avec SQL. Importez simplement l’espace de noms approprié et nous pouvons accéder au directement à partir de la page JSP.
- Connexion JDBC personnalisée — Nous créons une couche DAO (un ensemble de classes) et travaillons avec des connexions JDBC.
- Cadre étranger — si au point précédent nous avions l’impression d’inventer la roue à nouveau, nous pourrions utiliser des cadres prêts à l’emploi comme Spring et son JDBCTemplate.
- ORM — un niveau d’abstraction encore plus élevé est le mappage relationnel objet – par exemple Hibernate ou une autre implémentation JPA. Dans ce cas, nous arrêtons d’utiliser SQL et travaillons avec le langage JPQL.
Il existe une autre option : contourner les services offerts par le serveur d’applications et diriger la connexion à la base de données dans l’application. Cette méthode est possible, mais nous nous préparerons pour les avantages susmentionnés. Nous pouvons donc le rejeter — mais les quatre autres moyens sont légitimes et ont tous leurs avantages et inconvénients — il est toujours nécessaire de tenir compte de conditions et de besoins spécifiques. application.
Au moins souvent, nous utilisons des balises JSP SQL — elles s’adaptent même aux applications très simples ou à usage unique — le principal inconvénient est l’incapacité d’insérer la logique d’application — la couche d’application est complètement manquante et les données se déplacent directement de la base de données à la couche de présentation. D’autre part, leur utilisation est la plus simple et la moins laborieuse. Aujourd’hui, nous allons examiner les deux premières options pour accéder à la base de données.
Notre base de données
Dans le travail d’aujourd’hui, nous pouvons faire avec une base de données très simple — elle contient une seule table avec trois colonnes.
VENIR TABLE ( id entier NON NULL DEFAULT nextval (‘businesses_seq’። regclass), caractère nazev variable (255) PAS NULL, date de l’horodatage avec le fuseau horaire DEFAULT now (), CONTRAINTE entrepreneur_pk PRIMAIRE K ) AVEC ( OIDS=FALSE ) ; MODIFIER LE PROPRIÉTAIRE DE L’ENTREPRISE TABLE À NEKRAK ACCORDER TOUT SUR LA TABLE Enterprise à nekurak GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE Enterprise TO neku Quelques mots à la sécurité
Lors de la création d’applications sûres, vous devez adhérer au concept de droits minimaux. Cela signifie que l’entité ne devrait avoir que les privilèges dont elle a réellement besoin pour ses activités — pas plus. Exemple : Votre application doit-elle supprimer des enregistrements d’une table de journaux ? Non ? Pourquoi a-t-il alors le droit de SUPPRIMER ? L’application doit-elle montrer les mots de passe des utilisateurs quelque part ? Non ? Pourquoi a-t-il droit à SELECT alors ? Le mot de passe peut être vérifié à l’aide d’une procédure ou d’une fonction stockée — son paramètre sera un nom et un mot de passe, et la valeur renvoyée sera true ou false.
Aussi paranoïaque que vous puissiez trouver cette approche, il est bon de la suivre. Même la meilleure application peut contenir des erreurs, et il est souhaitable de minimiser les pertes au cas où un attaquant accède à un lien de base de données – à moins qu’il n’arrive à des données sensibles (par exemple les mots de passe des utilisateurs) ou qu’il ne soit pas en mesure de supprimer des enregistrements importants du journal, ce sont des points positifs pour vous et d’atténuer les conséquences d’un incident de sécurité. Par conséquent, il est approprié que le propriétaire de la base de données/du schéma soit un utilisateur différent de celui sous lequel l’application se connecte — uniquement les droits dont elle a besoin alloués.
Marques JSP
Dans ce cas, nous n’avons pas besoin de créer de classes en Java, et nous travaillons avec des bases de données SQL directement dans la page JSP. La bibliothèque requise des marques a un espace de noms http://java.sun.com/jsp/jstl/sql.
Nous mettons une simple requête SQL et chargeons le résultat dans la variable entreprises (comme un objet implémentant javax.servlet.jsp.jstl.sql.Result).
SELECT * DE L’entreprise Nous listerons ensuite le résultat sous la forme d’une liste :
Dans les requêtes, nous pouvons utiliser les paramètres :
Vous pouvez trouver l’exemple complet dans le fichier sql-znacky.jsp. En utilisant les balises JSP, nous pouvons également effectuer des opérations DML (voir) ou utiliser des transactions (en enveloppant le bloc dans). Trop de magie à faire avec elle cependant ne donnera pas.
Comme on peut le voir, le plus grand avantage de cette approche — la simplicité — est aussi son grand inconvénient. Nous perdons les avantages d’une architecture en couches, et très bientôt elle s’arrêtera assez – nous n’utiliserons probablement pas les balises pour travailler avec la base de données dans une application réelle, mais dans certains prototypes, elles pourraient vous convenir.
Remarque : lorsque vous utilisez des balises JSP SQL, vous devez spécifier la source avec laquelle nous travaillerons dans le fichier web.xml :
jdbc/nekurak javax.sql.DataSource Conteneur Connexion JDBC personnalisée
Revenons donc au concept original où la page JSP ne se soucie que de la présentation et les données sont fournies par beana (classe java EnterpriseWeb). Nous allons créer une couche de données qui sera composée d’une seule classe EntrepreneAO pour le moment. Dans la couche DAO, nous concentrons tout le code lié au travail de base de données et ne lui permettons pas de se répandre dans le reste de l’application – il devrait abstraire du fait que la couche DAO fonctionne avec une base de données relationnelle — les données peuvent également provenir d’un service Web ou d’un système de fichiers.
SQL dans des fichiers séparés
Nous pouvons écrire des instructions SQL directement au code en Java (par exemple, en tant que constantes), mais j’envisage de distinguer tout le code SQL dans des fichiers XML séparés comme plus approprié. L’avantage est que des modifications mineures aux requêtes SQL ou à d’autres paramétrisations peuvent également être effectuées par un non-programmeur (par exemple, un administrateur de serveur) et qu’il n’est pas nécessaire de compiler l’application. En outre, vous avez une vue d’ensemble de ce que le SQL contient votre application – tout ce que SQL est au même endroit et ne se répartit pas entre l’autre code java. La classe SuperDAO (que vous pouvez également utiliser comme bibliothèque de ressources séparée) s’occupe du chargement des valeurs à partir de fichiers XML.
Les fichiers XML sont nommés de la même manière que la classe appropriée, par exemple PodnikDAO.java aura ses requêtes SQL dans le fichier Entreprene.sql.xml et n’importe quel fichier autres propriétés dans PodnikDAO.xml. Les fichiers XML ont cette structure :
De cette façon, nous pouvons écrire même des requêtes SQL complexes à plusieurs lignes — plus clairement que dans la source en Java. L’écriture s correspond si la requête SQL contient par exemple des comparaisons (parenthèses nettes). Si cette approche ne vous convient pas, ou semble surdimensionnée pour votre application, rien ne vous empêche d’écrire du SQL directement dans du code en Java.
Différence sur Javase
Nous travaillons avec la base de données ici comme nous sommes habitués à partir de la plate-forme standard, la seule différence est que nous ne créons pas la connexion JDBC manuellement dans l’application, mais nous l’obtenons par javax.naming.InitialContext et nom JNDI — voir la méthode getUnited () de la classe NekurakSuperDao.
La méthode de récupération de toutes les entreprises de la base de données ressemble à ceci :
collection publique getBusinesses () { Connexion db = getLinked () ; PreparedStatement ps = null ; ResultSet rs = null ; essayez { ps = db.PrepareStationement (getSQL (SQL.SELECT_VSECHNY)) ; rs = ps.ExecuteQuery () ; Conséquence de collecte = nouveau ArrayList () ; while (rs.next ()) { vant.add (nouvelle entreprise (RS.GetInt (« id »), rs.getString (« nazev »)) ; } conséquence de retour ; } capture (Exception e) { log.log (Level.Severe, « Erreur lors de l’acquisition d’entreprises. », (e) ; retour null ; } enfin { zavri (db, ps, rs) ; } } La méthode de stockage de l’entreprise (Enterprise p) est formée de la même manière (voir classe EntrepreneAO).
Comme vous pouvez le voir, même le simple chargement d’enregistrements à partir d’une base de données comporte un peu de code ennuyeux (prendre des exceptions, mapper des sessions aux objets…). D’autre part, cela peut ne pas nous déranger autant parce que tout ce code non nutritif est affecté à la couche de données, alors que dans les couches supérieures de l’application, nous pouvons avoir une logique métier propre et épurée.
Remarque : la conception de la couche de données a tendance à être encore plus complexe — nous pouvons séparer l’implémentation et l’interface DAO et utiliser la fabrique de modèles de conception… mais je crains qu’une conception plus robuste ne dépasse les besoins d’une application web simple – parfois il est préférable de faire les choses plus facilement, surtout quand nous pouvons refactoriser le code et ajouter plus de couches si nécessaire.
La conclusion
Dans le travail d’aujourd’hui, nous avons appris à créer un pool de connexions de base de données dans le serveur d’applications et à expliquer comment cela fonctionne. Nous nous sommes montrés la façon la plus simple de travailler avec une base de données (tags JSP) et celle un peu plus complexe (couche DAO). La prochaine fois, nous examinerons les deux autres façons d’accéder à la base de données, ce qui nous permettra d’économiser suffisamment de travail, mais d’en faire beaucoup. Et surtout n’oubliez pas que le logiciel d’écriture devrait être amusant.
Liens
- Patterns J2EE Core — Objet d’accès aux données — Blue Print from Sun sur le modèle de conception DAO.
- PostgreSQL JDBC — le pilote permettant d’accéder à la base de données à partir de Java.
- MySQL JDBC — Pilote de base de données d’accès à la base de données de Java.
- Fournisseurs de services Java Naming and Directory Interface (JNDI) — Vue d’ensemble de JNDI.