Database
 sql >> Base de données >  >> RDS >> Database

Utilisation de l'interface utilisateur JavaFX et des applications JDBC

Parce que JavaFX gagne du terrain en tant que framework d'interface graphique de facto de Java, il remplacera Swing tôt ou tard. L'interface utilisateur JavaFX et JDBC peuvent constituer une combinaison efficace lors de la création d'une application basée sur une base de données, en particulier dans un système hors ligne ou intégré. Cet article montre essentiellement comment cela peut être fait avec un exemple de scénario.

Un aperçu de l'application JDBC

L'évolution du framework Java GUI repose désormais sur la bibliothèque JavaFX. Il fournit une alternative puissante mais flexible au développement d'interface graphique, contrairement à son cadre Swing et AWT existant. JavaFX fournit un large éventail de contrôles et de composants qui aident à créer rapidement et efficacement une interface graphique. Il est très facile de développer une application de bureau qui interagit avec la base de données principale. Un JDBC (Java Database Connectivity) L'application dispose principalement d'un système de base de données principal tel que MySQL, Derby, Oracle ou toute autre base de données. Le code Java est écrit pour extraire des enregistrements d'une ou plusieurs tables de la base de données. Le SQL (Structured Query Language) les requêtes sont déclenchées à partir du code Java et envoyées au moteur de base de données pour traitement. Le pilote JDBC agit comme un intermédiaire entre le programme Java et la base de données et interprète la volée d'informations dans les deux sens, de sorte que la partie inégalée, telle que la base de données, et le programme Java puissent se réconcilier avec une solution viable. La base de données n'a absolument aucune idée du code Java, de ses syntaxes ou de quoi que ce soit à ce sujet. Il comprend simplement SQL et ne peut communiquer qu'avec lui. Java, en revanche, est une POO (Programmation Orientée Objet) langage et n'a aucune idée de SQL ou de ses syntaxes non plus. Pour rendre la communication possible, le fournisseur de la base de données fournit des pilotes natifs avec la base de données. C'est ce qu'on appelle le pilote JDBC. Notez qu'il existe quatre types de pilotes disponibles. Ils sont familièrement appelés pilotes de type 1, type 2, type 3 et type 4. Les pilotes natifs sont des pilotes de type 4 et sont les plus couramment utilisés. Ils sont également plus efficaces que les autres types. Un programme Java peut inclure ces pilotes JDBC en tant que bibliothèque externe dans le programme Java, car ils se trouvent généralement dans des fichiers d'archive JAR.

JavaFX dans la scène

Chaque application de base de données nécessite une interface afin que l'utilisateur puisse interagir avec les informations de la base de données. Mieux, s'il s'agit d'une interface graphique où nous n'avons pas besoin de nous baisser vers une interface de commande intimidante de bas niveau, mais d'obtenir ce que nous voulons en un clic. Dans cet aspect, JavaFX avec JDBC peut être une combinaison tueuse car il possède un certain nombre de composants d'interface graphique visuellement passionnants qui peuvent être utilisés pour représenter les enregistrements de base de données de manière plus significative. Par exemple, les enregistrements peuvent être affichés sous forme de tableau avec le TableView contrôler. Ou, nous pouvons créer un formulaire pour ajouter de nouveaux enregistrements dans la table de base de données. Les données saisies par l'utilisateur peuvent être vérifiées via le code Java avant d'être envoyées à la base de données. Le moteur de base de données principal bénéficie d'un répit après la validation des données et le blocage du traitement en raison d'une erreur de saisie. De plus, l'utilisateur final peut être un profane avec peu ou pas d'idée sur les contraintes des données d'entrée. Ceci est idéalement fait lorsqu'un formulaire de saisie est créé avec TextField , Libellé , ComboBox , et ListView contrôles dans JavaFX. Les événements générés par Button et d'autres commandes sont gérées de manière à ce que l'utilisateur soit à l'aise lorsqu'il interagit avec l'interface graphique.

Dans un exemple de scénario

Dans l'exemple illustré suivant, nous allons implémenter un ListView opération de recherche par saisie de texte dans un TextField . L'élément sélectionné dans le ListView est récupéré en conséquence à partir de la base de données principale et affiché dans le TableView contrôler. Il s'agit donc principalement d'une application de récupération et d'affichage. D'autres opérations de base de données, telles que l'insertion, la suppression et la mise à jour d'enregistrements, ne sont pas implémentées en raison de contraintes de taille. Ce serait un bel exercice de les mettre en œuvre vous-même.

Donc, avant de commencer, nous devons créer une table de base de données et un projet Java. Nous utiliserons MySQL comme base de données principale ; vous pouvez en choisir un autre mais assurez-vous d'inclure les pilotes appropriés dans votre pom.xml dossier. Voici une partie du code SQL pour créer la table, insérer des données factices et d'autres opérations.

CREATE DATABASE addressbook;USE DATABASE addressbook;DROP TABLE IF EXISTS contact;CREATE TABLE contact( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, nick_name VARCHAR(20), address VARCHAR(128), home_phone VARCHAR (10), work_phone VARCHAR(10), cell_phone VARCHAR(10), email VARCHAR(100), date d'anniversaire, web_site VARCHAR(100), profession VARCHAR(100), PRIMARY KEY (id));INSERT INTO contact (name, nick_name, address, home_phone, work_phone, cell_phone, email, birthday, web_site,profession) VALUES ('Bruce Wayne', 'batman', 'XYZ Batcave', '9876543210', '6278287326', '9182872363', 'example@sqldat .com', '1976/02/03', 'batblog.com', 'Super Hero');...INSERT INTO contact (...) VALUES (...);Maven Project :pom. xml <projet xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modèleVersion>4.0.0Version du modèle> <identifiant de groupe>org.mano.jdbc.examplesgroupId> <ID d'artefact>JavaFXJDBCAppID d'artefact> <version>Version 1.0-SNAPSHOT> <emballage>bocalemballage> <nom>JavaFXJDBCAppnom> <URL>http://maven.apache.orgurl> <propriétés> <project.build.sourceEncoding> UTF-8 project.build.sourceEncoding> propriétés> <construire> <plugins> <plugin> <identifiant de groupe> org.apache.maven.plugins groupId> <ID d'artefact> maven-compiler-plugin artifactId> <version>2.5.1version> <configuration> <source>1.8source> <cible>1,8cible> paramétrage> plugin> plugins> construire> <dépendances> <dépendance> <identifiant de groupe>junitgroupId> <ID d'artefact>junitID d'artefact> <version>3.8.1version> <portée>testerportée> dépendance>  <dépendance> <identifiant de groupe> mysqlgroupId> <ID d'artefact>mysql-connector-javaID d'artefact> <version>5.1.6version> dépendance> dépendances>projet> 

Maintenant, créons un objet de domaine que nous utiliserons à la fois dans ListView et TableView car ils sont tous deux liés, comme indiqué dans notre cas. La TableView contiendra une liste observable de personnes (ContactPerson ) basé sur le nom de la personne sélectionnée dans la ListView contrôler. Nous avons aussi un TextField pour effectuer une recherche rapide d'éléments (ContactPerson name) contenu dans la ListView . Lors de la sélection d'un élément spécifique dans la ListView , une requête SQL est lancée et les enregistrements pertinents sont récupérés pour remplir le TableView contrôler en conséquence.

Objet de domaine :ContactPerson

La personne de contact la classe n'est rien d'autre que la représentation POJO du contact attributs du tableau. Il contient le constructeur et le simple getter-setter méthodes.

forfait org.mano.jdbc.examples ;importer java.util.Date;classe publique ContactPerson { privé identifiant int ; privé Chaîne nom; privé Chaîne surnom; privé Chaîne adresse; privé Chaîne homePhone; privé Chaîne workPhone; privé Chaîne cellPhone; privé Chaîne e-mail; privé Date birthDate; privé Chaîne webSite; privé Chaîne profession; public ContactPerson() { } public int getId() { renvoyer l'identifiant; } vide public setId(entier id) { ceci .identifiant =identifiant ; } public String getName() { retourner le nom; } vide public setName(String name) { this .nom =nom ; } public String getNickName() { return nickName; } vide public setNickName(String nickName) { ceci .surnom =surnom; } public Chaîne getAddress() { adresse de retour; } vide public setAddress (chaîne d'adresse) { ceci .adresse =adresse ; } public Chaîne getHomePhone() { retourner le téléphone de la maison; }<vide public setHomePhone(String homePhone) { this .homePhone =tél.domicile ; } public Chaîne getWorkPhone() { retourne workPhone; } vide public setWorkPhone(String workPhone) { this .workPhone =Téléphonetravail ; } public String getCellPhone() { retourner le téléphone portable; } vide public setCellPhone(String cellPhone) { this .téléphone portable =Téléphone portable ; } public String getEmail() { retourner l'email; } vide public setEmail(String email) { ceci .courriel =e-mail ; } public Date getBirthDate() { renvoie la date de naissance; } vide public setBirthDate(Date birthDate) { ceci .datedenaissance =date de naissance ; } public Chaîne getWebSite() { retourne le site Web; } vide public setWebSite(String webSite) { ceci .Site Web =Site Web ; } public String getProfession() { retourne profession; } vide public setProfession(String profession) { ceci .métier =métier ; }}

Objet d'accès aux données :ContactDAO

Le ContactDAO est une classe d'objets d'accès aux données qui inclut principalement l'opération d'accès à la base de données. Il implémente le DAO interface. Cette interface peut ne pas être importante dans notre exemple mais peut être utile si l'application est étendue avec plus de classes d'objets d'accès aux données. Ici, le DAO L'interface comprend une chaîne de connexion, un pilote, un nom d'utilisateur et un mot de passe pour accéder à la base de données MySQL.

DAO.java

forfait org.mano.jdbc.examples ;interface publique DAO { finale statique publique Chaîne DB_URL  ="jdbc:mysql://localhost:3306/" + "addressbook?zeroDateTimeBehavior=convertToNull"; finale statique publique Chaîne DRIVER  ="com.mysql.jdbc.Driver"; finale statique publique Chaîne USER  ="racine"; finale statique publique Chaîne PASS  ="secrète";}

ContactDAO.java

forfait org.mano.jdbc.examples ;importer java.sql.*;importer java.util.ArrayList ;importer java.util.List;classe publique ContactDAO implémente DAO { privé ontactPerson createContactPerson(ResultSet rs) { ContactPerson p =nouveau Personne de contact(); essayez { p.setId(rs.getInt("id" )); p.setName(rs.getString("nom" )); p.setNickName(rs.getString("nick_name" )); p.setAddress(rs.getString("adresse" )); p.setHomePhone(rs.getString("home_phone" )); p.setWorkPhone(rs.getString("work_phone" )); p.setCellPhone(rs.getString("cell_phone" )); p.setEmail(rs.getString("email" )); p.setBirthDate(rs.getDate("anniversaire" )); p.setWebSite(rs.getString("web_site" )); p.setProfession(rs.getString("profession" )); } attraper (SQLException ex) { } retour p; } public List getContacts() { String sql ="Sélectionnez * dans l'ordre des contacts par nom"; List list =nouveau TableauListe<>(); essayez { Classe.forName (CONDUCTEUR  ); Connexion con =DriverManager.getConnection (DB_URL  , UTILISATEUR  , PASS  ); Instruction stmt =con.createStatement(); ResultSet rs =stmt.executeQuery(sql); pendant (rs.next()) { ContactPerson p =createContactPerson(rs); liste.add(p); } rs.close(); con.close(); } attraper (ClassNotFoundException | SQLException ex) { } retour liste; } public List getContactsForName(String name) { String sql ="Select * from contact where name like '%" + nom + "%'"; List list =nouveau TableauListe<>(); essayez { Classe.forName (CONDUCTEUR  ); Connexion con =DriverManager.getConnection (DB_URL  , UTILISATEUR  , PASS  ); Instruction stmt =con.createStatement(); ResultSet rs =stmt.executeQuery(sql); pendant (rs.next()) { ContactPerson p =createContactPerson(rs); liste.add(p); } rs.close(); con.close(); } attraper (ClassNotFoundException | SQLException ex) { } retour liste; }}

Interface graphique JavaFX :ContactBrowser

Dans l'application JavaFX nommée ContactBrowser , nous configurons tous les contrôles par programmation. Cela peut également être défini à l'aide de FXML ou d'outils utilitaires de création tels que Scene Builder. Mais, de l'avis du scribe, ils peuvent être utilisés une fois que l'on a acquis suffisamment d'expérience sur ce qui se passe dans les coulisses de JavaFX. L'interface graphique est principalement une interaction de trois contrôles, tels qu'un TextField (champ de recherche ), un ListView (listView ), et TableView (contactTableView ). Le code est explicite, avec des commentaires donnés aux endroits appropriés. L'expression Lambda est utilisée le cas échéant pour garder le code concis. Reportez-vous à la documentation de l'API JavaFX si nécessaire.

forfait org.mano.jdbc.examples ;importer javafx.application.Application ;importer javafx.beans.value.*;importer javafx.collections.*;importer javafx.collections.transformation.*;importer javafx.geometry.Insets ;importer javafx.scene.Scene ;importer javafx.scene.control.*;importer javafx.scene.control.cell.PropertyValueFactory ;importer javafx.scene.layout.*;importer javafx.scene.paint.Color;importer javafx.stage.Stage;classe publique ContactBrowser étend Application {  // Liste des propriétés de la table des contacts privé Chaîne[] Nompropriété ={"identifiant" , "nom" , "nickName" , "adresse" , "homePhone" , "workPhone" , "téléphone portable" , "e-mail" , "naissance" , "Site Web" , "métier" } ; privé Chaîne[] propertyLabel ={"ID" , "Nom" , "Pseudo" , "Adresse" , "Téléphone personnel" , "Téléphone professionnel" , "Téléphone portable" , "E-mail" , "Date de naissance" , "Site Web" , "Métier" } ; privé ContactDAO contact =nouveau ContactDAO(); finale privée GridPane gridPane =nouveau GridPane(); finale privée Libellé lblName =nouveau Libellé("Rechercher par nom" ); finale privée Champ de texte champ de recherche =nouveau Champ de texte(); privé ObservableList noms observables; privé FilteredList filteredData; privé SortedList sortedData; finale privée ListView listView; TableView contactTableView =nouveau TableView<>(); public ContactBrowser2() { lblName .setTextFill(Couleur.web ("#0076a3" )); noms observables =FXCollections.observableArrayList (contacter .getContacts()); données filtrées =nouveau FilteredList<> (noms observables , p -> vrai ); données triées =nouveau SortedList<>(filteredData ); listView =nouveau ListView<>(sortedData ); } @Override vide public start(Stage primaryStage) { primaryStage.setTitle("Carnet d'adresses" ); primaryStage.setMaximized(vrai ); BorderPane borderPane =nouveau BorderPane(); Scène scène =nouveau Scène(borderPane,650,400,vrai ); gridPane .setPadding(nouveau Encarts (10) ); gridPane .setHgap(5); gridPane .setVgap(5); gridPane .add(lblName , 0, 0); gridPane .add(champ de recherche , 0, 1); // Gestion des événements Search TextField champ de recherche .textProperty() .addListener((observable, oldValue, newValue) -> filteredData .setPredicate(str -> { si (nouvelleValeur ==null || newValue.isEmpty()) renvoie vrai; si (str.getName().toLowerCase().contains (newValue.toLowerCase())) retourner vrai; retourner faux; })); listView .getSelectionModel().setSelectionMode (SelectionMode.SINGLE  ); listView .setPrefHeight(Entier.MAX_VALUE  ); // Définit une nouvelle fabrique de cellules à utiliser dans ListView. // Cela supprime toutes les anciennes cellules de liste et les nouvelles ListCells // créé avec la nouvelle fabrique de cellules. listView .setCellFactory(listView-> { Tooltip tooltip =nouveau Info-bulle(); Cellule ListCell =nouveau ListCell() { @Override vide public updateItem(ContactPerson contactPerson, Booléen vide) { super .updateItem(contactPerson, vide); si (contactPerson !=null ) { setText(contactPerson.getName()); info-bulle.setText(contactPerson.getNickName()); setTooltip(tooltip); } autrement setText(null ); } } ; retour cellule; }); gridPane .add(listView , 0, 2); // Créer et initialiser TableView ObservableList contactPeopleList =FXCollections.observableArrayList (); contactTableView .setItems(contactPeopleList); contactTableView .setColumnResizePolicy( TableView.CONSTRAINED_RESIZE_POLICY  ); pour (entier je =0 ; i <PropertyLabel .longueur; i++) { TableColumn col =nouveau TableColumn<>(propertyLabel [je]); col.setCellValueFactory(nouveau PropertyValueFactory<>(nompropriété [je])); contactTableView .getColumns().add(col); } borderPane.setCenter(contactTableView ) borderPane.setLeft(gridPane ); // TableView se remplira à partir de la contactPeopleList // contactPeopleList aura une valeur selon le // élément sélectionné dans le ListView listView .getSelectionModel() .selectedItemProperty() .addListener(nouveau ChangeListener() { @Override vide public modifié( ObservableValues'étend ContactPerson> observable, ContactPerson oldValue, ContactPerson newValue) { if (observable !=null &&observable.getValue() !=null ) { contactPeopleList.clear(); contactPeopleList.addAll( contact .getContactsForName (nouvelleValeur.getName())); } } }); primaryStage.setScene(scene); primaryStage.show(); } vide statique public main(String[] args) { lancer (arguments); }}

Sortie


Figure 1 : Sortie de code

Conclusion

Une application JDBC avec JavaFX signifie essentiellement que le framework d'interface graphique JavaFX a été utilisé comme moteur de développement frontal et JDBC a été utilisé pour l'interaction avec la base de données principale. Ils peuvent être de variétés de types avec N nombre de fonctionnalités qui y sont définies. La base est l'application CRUD. Nous avons mis en place une partie de l'opération de recherche et d'affichage. Voici ce que vous pouvez faire pour l'étendre :implémentez Create , Supprimer , et Mettre à jour opérations ; aussi, vous pouvez ajouter des noms avec des images dans la ListView . Bon codage 😉