Database
 sql >> база данни >  >> RDS >> Database

Работа с JavaFX UI и JDBC приложения

Тъй като JavaFX се налага като де-факто GUI рамка на Java, той рано или късно ще замени Swing. JavaFX UI и JDBC могат да бъдат ефективна комбинация при създаване на приложение, управлявано от база данни, особено в офлайн или вградена система. Тази статия по същество показва как това може да стане с примерен сценарий.

Общ преглед на JDBC приложение

Еволюцията на Java GUI рамката сега се основава на библиотеката JavaFX. Той предоставя мощна, но гъвкава алтернатива на разработката на GUI, за разлика от съществуващата си Swing и AWT рамка. JavaFX доставя голям масив или контроли и компоненти, които помагат за бързо и ефективно изграждане на GUI интерфейс. Много е лесно да се разработи настолно приложение, което взаимодейства с бек-енд базата данни. JDBC (свързаност с база данни на Java) приложението основно има система за бази данни от задния край като MySQL, Derby, Oracle или всяка друга база данни. Java кодът е написан за извличане на записи от една или повече таблици в базата данни. SQL (език за структурирани заявки) заявките се задействат от Java код и се изпращат до машината на базата данни за обработка. JDBC драйверът действа като посредник между Java програмата и базата данни и интерпретира потока от информация насам-натам, така че както несравнимата страна, като базата данни, така и Java програмата могат да се съгласуват с работещо решение. Базата данни няма абсолютно никаква представа за Java кода, неговите синтаксиси или нещо за него. Той просто разбира SQL и може да комуникира само с него. Java, от друга страна, е OOP (обектно-ориентирано програмиране) език и няма представа за SQL или неговите синтаксиси. За да направи комуникацията възможна, доставчикът на база данни доставя собствени драйвери заедно с базата данни. Това се нарича JDBC драйвер. Имайте предвид, че има четири вида драйвери. Те се наричат ​​разговорно драйвери Тип-1, Тип-2, Тип-3 и Тип-4. Родните драйвери са тип-4 драйвери и се използват най-често. Освен това са по-ефективни от другите видове. Java програма може да включва тези JDBC драйвери като външна библиотека в програмата на Java, тъй като те обикновено се предлагат в JAR архивни файлове.

JavaFX в сцената

Всяко приложение за база данни изисква интерфейс, така че потребителят да може да взаимодейства с информацията за базата данни. По-добре, ако това е GUI интерфейс, където не е нужно да се спускаме до ниско ниво, плашещ команден интерфейс, а да получим това, което искаме с едно щракване на бутон. В този аспект JavaFX с JDBC може да бъде убийствена комбинация, тъй като има доста голям брой визуално вълнуващи GUI компоненти, които могат да се използват за представяне на записи в базата данни по по-смислен начин. Например записите могат да се показват в табличен вид с TableView контрол. Или можем да създадем формуляр за добавяне на нови записи в таблицата на базата данни. Данните, въведени от потребителя, могат да бъдат проверени чрез Java код преди изпращане в базата данни. Двигателят на задната база данни получава почивка от валидиране на данни и спиране на обработката поради грешка при въвеждане. Освен това, крайният потребител може да бъде лаик с малко или никаква представа за ограниченията на входните данни. Това се прави идеално, когато се създава формуляр за въвеждане с TextField , Етикет , ComboBox и ListView контроли в JavaFX. Събитията, генерирани от Бутон и други контроли се обработват по такъв начин, че потребителят да е спокоен, докато взаимодейства с GUI интерфейса.

В примерен сценарий

В следващия илюстриран пример ще приложим ListView операция за търсене чрез въвеждане на текст в TextField . Избраният елемент в ListView се извлича съответно от задната база данни и се показва в TableView контрол. Така че това е предимно приложение за извличане и показване. Други операции с базата данни – като вмъкване, изтриване и актуализиране на записи – не се изпълняват поради ограничения на размера. Би било хубаво упражнение да ги приложите сами.

И така, преди да започнем, трябва да създадем таблица с база данни и Java проект. Ще използваме MySQL като back-end база данни; можете да изберете всеки друг, но не забравяйте да включите подходящи драйвери във вашия pom.xml файл. Ето част от SQL кода за създаване на таблицата, вмъкване на фиктивни данни и някои други операции.

СЪЗДАВАНЕ на адресна книга на БАЗА ДАННИ; ИЗПОЛЗВАНЕ НА БАЗА ДАННИ адресна книга; ИЗПУСКАНЕ НА ТАБЛИЦА, АКО СЪЩЕСТВУВА контакт; СЪЗДАВАНЕ НА ТАБЛИЦА контакт ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, име VARCHAR(100) NOT NULL, псевдоним VARCHAR(20), адрес VARCHAR дом(1 VARCHAR дом) (10), работен_телефон VARCHAR(10), мобилен_телефон VARCHAR(10), имейл VARCHAR(100), дата на рожден ден, уеб_сайт VARCHAR(100), професия VARCHAR(100), ОСНОВЕН КЛЮЧ (id)); псевдоним, адрес, домашен_телефон, работен_телефон, мобилен_телефон, имейл, рожден ден, уеб_сайт,професия) VALUES ('Bruce Wayne', 'batman', 'XYZ Batcave', '9876543210', '6278287326', '23163'23163' .com', '1976/02/03', 'batblog.com', 'Super Hero');...ВМЕСЕТЕ В контакт (...) СТОЙНОСТИ (...);Maven Project:pom. xml <project 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"> <modelVersion>4.0.0modelVersion> <groupId>org.mano.jdbc.examplesgroupId> <artifactId>JavaFXJDBCAppartifactId> <версия>1.0-SSNAPSHOTверсия> <опаковане>бурканопаковката> <име>JavaFXJDBCAppиме> <url>http://maven.apache.orgurl> <свойства> <project.build.sourceEncoding> UTF-8 project.build.sourceEncoding> свойства> <изграждане> <приставки> <приставка> <groupId> org.apache.maven.plugins groupId> <artifactId> maven-compiler-plugin artifactId> <версия>2.5.1версия> <конфигурация> <източник>1.8източник> <цел>1.8цела> конфигурация> приставка> приставки> изграждане> <зависимости> <зависимост> <groupId>junitgroupId> <artifactId>junitartifactId> <версия>3.8.1версията> <обхват>тестобхвата> зависимост>  <зависимост> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <версия>5.1.6версия> зависимост> зависимости>проект> 

Сега нека създадем обект на домейн, който ще използваме и в ListView и TableView защото и двете са свързани, както е посочено в нашия случай. Изглед на таблица ще съдържа видим списък с хора (ContactPerson ) въз основа на името на избрано лице от ListView контрол. Имаме и Текстово поле за бързо търсене на артикули (ContactPerson име), съдържащи се в ListView . При избор на конкретен елемент от ListView , се задейства SQL заявка и се извличат съответните записи за попълване на TableView контролирайте съответно.

Обект на домейн:ContactPerson

Лицето за контакт класът не е нищо друго освен POJO представяне на контакта атрибути на таблицата. Той съдържа конструктора и прост getter-setter методи.

пакет org.mano.jdbc.examples;импорт java.util.Date;публичен клас Контактно лице { частно int идентификатор; частен Низиме; частен Низ псевдоним; частен Низадрес; частен Низдомашен телефон; частен Низработен телефон; частен Низмобилен телефон; частен Низ имейл; частен ДатаДата на раждане; частен Низ уебсайт; частен Низна професия; обществено ContactPerson() { } public int getId() {return id; } публична недействителност setId(int id) {това .id =идентификатор; } обществено Низ getName() { връщане на име; } публична недействителност setName(Име на низ) { това .име =име; } обществено Низ getNickName() {връщане на псевдоним; } публична недействителност setNickName(String nickName) {това .псевдоним =псевдоним; } обществено Низ getAddress() { връщащ адрес; } публична недействителност setAddress(Стринг адрес) { това .адреса =адрес; } обществено String getHomePhone() {return homePhone; }<обществена недействителност setHomePhone(String homePhone) {това .домашен телефон =домашен телефон; } обществено String getWorkPhone() {return workPhone; } публична недействителност setWorkPhone(String workPhone) {това .работен телефон =работен телефон; } обществено String getCellPhone() {return cellPhone; } публична недействителност setCellPhone(String cellPhone) { това .мобилен телефон =мобилен телефон; } обществено Низ getEmail() { връщане на имейл; } публична недействителност setEmail(String email) { това .имейл =имейл; } обществено Дата getBirthDate() {return birthDate; } публична недействителност setBirthDate(Дата на раждане) { това .Дата на раждане =Дата на раждане; } обществено String getWebSite() { return webSite; } публична недействителност setWebSite(String webSite) { това .уебсайт =уеб сайт; } обществено Низ getProfession() {връщане на професия; } публична недействителност setProfession(String profession) {това .професията =професия; }}

Обект за достъп до данни:ContactDAO

ContactDAO е клас обект на достъп до данни, който включва предимно операция за достъп до база данни. Той прилага DAO интерфейс. Този интерфейс може да не е важен в нашия пример, но може да се използва добре, ако приложението бъде разширено с повече класове на обекти за достъп до данни. Тук DAO интерфейсът включва низ за връзка, драйвер и потребителско име и парола за достъп до базата данни MySQL.

DAO.java

пакет org.mano.jdbc.examples;публичен интерфейс DAO {public static final Низ DB_URL  ="jdbc:mysql://localhost:3306/" + "адресна книга?zeroDateTimeBehavior=convertToNull"; публичен статичен финал Низ ДРАЙВЕР  ="com.mysql.jdbc.Driver"; публичен статичен финал Низ USER  =„root“; публичен статичен финал Низ PASS  ="тайна";}

ContactDAO.java

пакет org.mano.jdbc.examples;импорт java.sql.*;импорт java.util.ArrayList;импорт java.util.List;публичен клас Свържете се с приложенията на DAO DAO {частен ontactPerson createContactPerson(ResultSet rs) { ContactPerson p =нов Лице за контакт(); опитайте { p.setId(rs.getInt("id" )); p.setName(rs.getString("name" )); p.setNickName(rs.getString("nick_name" )); p.setAddress(rs.getString("адрес" )); p.setHomePhone(rs.getString("home_phone" )); p.setWorkPhone(rs.getString("work_phone" )); p.setCellPhone(rs.getString("cell_phone" )); p.setEmail(rs.getString("имейл" )); p.setBirthDate(rs.getDate("рожден ден" )); p.setWebSite(rs.getString("web_site" )); p.setProfession(rs.getString("професия" )); } улов (SQLException ex) { } връщане p; } обществено List getContacts() { String sql ="Изберете * от поръчката за контакт по име"; List list =нов ArrayList<>(); опитайте { Class.forName (ШОФЬОР  ); Connection con =DriverManager.getConnection (DB_URL  , ПОЛЗВАТЕЛ  ,ПРОХОД  ); Изявление stmt =con.createStatement(); ResultSet rs =stmt.executeQuery(sql); докато (rs.next()) { ContactPerson p =createContactPerson(rs); списък.добави(p); } rs.close(); con.close(); } улов (ClassNotFoundException | SQLException ex) { } връщане списък; } обществено List getContactsForName(String name) { String sql ="Изберете * от контакт, където име е като "%" + име + "%'"; List list =нов ArrayList<>(); опитайте { Class.forName (ШОФЬОР  ); Connection con =DriverManager.getConnection (DB_URL  , ПОЛЗВАТЕЛ  ,ПРОХОД  ); Изявление stmt =con.createStatement(); ResultSet rs =stmt.executeQuery(sql); докато (rs.next()) { ContactPerson p =createContactPerson(rs); списък.добави(p); } rs.close(); con.close(); } улов (ClassNotFoundException | SQLException ex) { } връщане списък; }}

GUI интерфейс на JavaFX:ContactBrowser

В приложението JavaFX с име ContactBrowser , ние настроихме всички контроли програмно. Това също може да се настрои с помощта на FXML или помощни инструменти за изграждане, като Scene Builder. Но според мнението на писаря те могат да се използват, след като човек е натрупал достатъчно опит за това, което се случва зад кулисите в JavaFX. GUI е предимно взаимодействие на три контроли, като TextField (Поле за търсене ), Изглед на списък (listView ) и Изглед на таблица (contactTableView ). Кодът се обяснява сам, като коментарите са дадени на подходящи места. Ламбда изразът се използва навсякъде, където е приложимо, за да запази кода кратък. Направете справка с документацията на JavaFX API, където е необходимо.

пакет org.mano.jdbc.examples;импорт javafx.application.Application;импорт javafx.beans.value.*;импорт javafx.collections.*;импорт javafx.collections.transformation.*;импорт javafx.geometry.Insets;импорт javafx.scene.Scene;импорт javafx.scene.control.*;импорт javafx.scene.control.cell.PropertyValueFactory;импорт javafx.scene.layout.*;импорт javafx.scene.paint.Color;импорт javafx.stage.Stage;обществен клас ContactBrowser разширява Приложение {  // Списък със свойства на таблицата с контакти частен String[] propertyName ={"id" , „име“ , "псевдоним" , "адрес" , "домашен телефон" , "workPhone" , „мобилен телефон“ , „имейл“ , „Дата на раждане“ , „уебсайт“ , "професия" }; частен String[] propertyLabel ={"ID" , „Име“ , „Псевдоним“ , „Адрес“ , „Домашен телефон“ , „Работен телефон“ , „Мобилен телефон“ , „Имейл“ , „Дата на раждане“ , „Уебсайт“ , "Професия" }; частен Свържете се с контакт с DAO =нов Свържете се сDAO(); частен финал GridPane gridPane =нов GridPane(); частен финал Етикет lblName =нов Етикет („Търсене по име“ ); частен финал TextField searchField =нов Текстово поле(); частен ObservableList observableNames; частен FilteredList filteredData; частен SortedList sortedData; частен финал ListView listView; TableView contactTableView =нов TableView<>(); обществено ContactBrowser2() { lblName .setTextFill(Color.web („#0076a3“ )); naблюдаеми имена =FXCollections.observableArrayList (контакт .getContacts()); filteredData =нов FilteredList<> (observableNames , p -> вярно ); sortedData =нов SortedList<>(filteredData ); listView =нов ListView<>(sortedData ); } @Override public aid start(Stage primaryStage) { primaryStage.setTitle("Address Book" ); primaryStage.setMaximized(true ); BorderPane borderPane =нов BorderPane(); Сцена на сцена =нова Сцена(borderPane,650,400,true ); gridPane .setPadding(нов Вложки(10)); gridPane .setHgap(5); gridPane .setVgap(5); gridPane .add(lblName , 0, 0); gridPane .add(searchField , 0, 1); // Търсене на обработка на събития в TextField Поле за търсене .textProperty() .addListener((observable, oldValue, newValue) -> filteredData .setPredicate(str -> { if (нова стойност ==нула || newValue.isEmpty()) връща истина; ако (str.getName().toLowerCase().съдържа (newValue.toLowerCase())) връща истина; връщане на false; })); listView .getSelectionModel().setSelectionMode (Режим на избор.ЕДИНИЧЕН  ); listView .setPrefHeight(Цяло число.MAX_VALUE  ); // Задава нова фабрика за клетки, която да се използва в ListView. // Това изхвърля всички стари клетки от списък и нови ListCells // създадено с новата фабрика за клетки. listView .setCellFactory(listView-> { Tooltip tooltip =new Подсказка(); ListCell клетка =нова ListCell() { @Override public void updateItem(ContactPerson contactPerson, Boolean празно) {супер .updateItem(contactPerson, празно); ако (contactPerson !=null ) { setText(contactPerson.getName()); tooltip.setText(contactPerson.getNickName()); setTooltip(подсказка); } друго setText(null ); } }; връщане клетка; }); gridPane .add(listView , 0, 2); // Създаване и инициализиране на TableView ObservableList contactPeopleList =FXCollections.observableArrayList (); contactTableView .setItems(contactPeopleList); contactTableView .setColumnResizePolicy( TableView.CONSTRAINED_RESIZE_POLICY  ); за (int i =0; i propertyLabel .дължината; i++) { TableColumn col =нов TableColumn<>(propertyLabel [i]); col.setCellValueFactory(нов PropertyValueFactory<>(propertyName [i])); contactTableView .getColumns().add(col); } borderPane.setCenter(contactTableView ) borderPane.setLeft(gridPane ); // TableView ще се попълни от contactPeopleList // contactPeopleList ще има стойност според // елемент, избран в ListView listView .getSelectionModel() .selectedItemProperty() .addListener(нов ChangeListener() { @Override public void променен( ObservableValueразширява ContactPerson> видимо, ContactPerson oldValue, ContactPerson newValue) { if (забележимо !=null &&observable.getValue() !=null ) { contactPeopleList.clear(); contactPeopleList.addAll( контакт .getContactsForName (newValue.getName())); } } }); primarnoStage.setScene(сцена); първичен етап.покажи(); } обществена статична празнота main(String[] args) { стартиране (аргументи); }}

Изход


Фигура 1: Извеждане на код

Заключение

JDBC приложение с JavaFX по същество означава, че JavaFX GUI рамката е била използвана като двигател за разработка на преден край, а JDBC е бил използван за взаимодействието на базата данни в задния край. Те могат да бъдат от различни типове с N брой дефинирани в тях функционалности. Основното е приложението CRUD. Внедрихме част от операцията за търсене и показване. Ето какво можете да направите, за да го разширите:внедрете Създаване , Изтриване и Актуализиране операции; също така можете да добавяте имена с изображения в ListView . Приятно кодиране 😉


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 начина за избор на редове, които съответстват на всички елементи в списък (T-SQL)

  2. Прагове за оптимизиране – групиране и агрегиране на данни, част 5

  3. Проектиране на база данни 101

  4. SQL АКТУАЛИЗАЦИЯ за начинаещи

  5. Въведение в ключалките