Kann mir jemand ein Beispiel für eine Klasse geben, die JavaFX mit MySQL verbindet, möchte keine Hauptklasse haben, möchte nur ein Beispiel für eine Klasse, die jede Anwendung mit einer MySQL Datenbank verbindet und eine Zeile bekommt aus dieser Datenbank in eine Tabelle, suchte das gesamte Internet und ich fand nichts direkt auf den Punkt, ich möchte nichts Besonderes nur etwas, um die Arbeit zu erledigen, bitte. Etwas sauber und einfach.JavaFX MySQL Verbindungsbeispiel bitte
Antwort
Sie benötigen mindestens drei Klassen: eine für Ihre Daten, eine für Ihre Benutzeroberfläche und eine für die Verwaltung der Datenbankverbindung. In einer echten App braucht man natürlich mehr als das. Dieses Beispiel folgt dem gleichen Grund Beispiel als TableView
tutorial
Angenommen, Ihre Datenbank eine person
Tabelle mit drei Spalten, first_name
, last_name
, email_address
.
Dann würden Sie eine Person
Klasse schreiben:
import javafx.beans.property.StringProperty ;
import javafx.beans.property.SimpleStringProperty ;
public class Person {
private final StringProperty firstName = new SimpleStringProperty(this, "firstName");
public StringProperty firstNameProperty() {
return firstName ;
}
public final String getFirstName() {
return firstNameProperty().get();
}
public final void setFirstName(String firstName) {
firstNameProperty().set(firstName);
}
private final StringProperty lastName = new SimpleStringProperty(this, "lastName");
public StringProperty lastNameProperty() {
return lastName ;
}
public final String getLastName() {
return lastNameProperty().get();
}
public final void setLastName(String lastName) {
lastNameProperty().set(lastName);
}
private final StringProperty email = new SimpleStringProperty(this, "email");
public StringProperty emailProperty() {
return email ;
}
public final String getEmail() {
return emailProperty().get();
}
public final void setEmail(String email) {
emailProperty().set(email);
}
public Person() {}
public Person(String firstName, String lastName, String email) {
setFirstName(firstName);
setLastName(lastName);
setEmail(email);
}
}
A-Klasse, die Daten aus der Datenbank zuzugreifen:
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.Statement ;
import java.sql.ResultSet ;
import java.util.List ;
import java.util.ArrayList ;
public class PersonDataAccessor {
// in real life, use a connection pool....
private Connection connection ;
public PersonDataAccessor(String driverClassName, String dbURL, String user, String password) throws SQLException, ClassNotFoundException {
Class.forName(driverClassName);
connection = DriverManager.getConnection(dbURL, user, password);
}
public void shutdown() throws SQLException {
if (connection != null) {
connection.close();
}
}
public List<Person> getPersonList() throws SQLException {
try (
Statement stmnt = connection.createStatement();
ResultSet rs = stmnt.executeQuery("select * from person");
){
List<Person> personList = new ArrayList<>();
while (rs.next()) {
String firstName = rs.getString("first_name");
String lastName = rs.getString("last_name");
String email = rs.getString("email_address");
Person person = new Person(firstName, lastName, email);
personList.add(person);
}
return personList ;
}
}
// other methods, eg. addPerson(...) etc
}
Und dann ein UI-Klasse:
import javafx.application.Application ;
import javafx.scene.control.TableView ;
import javafx.scene.control.TableColumn ;
import javafx.scene.control.cell.PropertyValueFactory ;
import javafx.scene.layout.BorderPane ;
import javafx.scene.Scene ;
import javafx.stage.Stage ;
public class PersonTableApp extends Application {
private PersonDataAccessor dataAccessor ;
@Override
public void start(Stage primaryStage) throws Exception {
dataAccessor = new PersonDataAccessor(...); // provide driverName, dbURL, user, password...
TableView<Person> personTable = new TableView<>();
TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
TableColumn<Person, String> emailCol = new TableColumn<>("Email");
emailCol.setCellValueFactory(new PropertyValueFactory<>("email"));
personTable.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
personTable.getItems().addAll(dataAccessor.getPersonList());
BorderPane root = new BorderPane();
root.setCenter(personTable);
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
@Override
public void stop() throws Exception {
if (dataAccessor != null) {
dataAccessor.shutdown();
}
}
public static void main(String[] args) {
launch(args);
}
}
(Ich habe das einfach eingegeben, ohne es zu testen, also könnte es Tippfehler, fehlende Importe usw. geben, aber es ist sho ULD genug sein, um Sie auf die Idee zu geben)
ich danke Ihnen so sehr – marcS
Super Antwort. Vielen Dank! –
Neben der Antwort von James_D.
ich an einen entfernten (MySQL) Datenbank verbinden wollte, also habe ich den Konstruktor und verbunden durch URL-only:
public UserAccessor(String dbURL, String user, String password) throws SQLException, ClassNotFoundException {
connection = DriverManager.getConnection(dbURL, user, password);
}
Init über:
UserAccessor userAccessor = new UserAccessor(
"jdbc:mysql://xxx.xxx.xxx.xxx:YOUR_PORT", "YOUR_DB_USER", "YOUR_PASSWORD")
Bitte beachten Sie: Sie müssen auch Schließen Sie die Connector-Bibliothek ein. Ich wählte mysql-connector-java-5.1.40-bin.jar
die kam mit IntelliJ und war unter /Users/martin/Library/Preferences/IntelliJIdea2017.1/jdbc-drivers/MySQL Connector/J/5.1.40/mysql-connector-java-5.1.40-bin.jar
Kudos gehören zu James_D.
Das sollte man nicht mit einer Klasse machen: Es ist sehr schlecht, so unterschiedliche Funktionen (Datenbankverbindung einerseits, UI andererseits) an einem Ort zu mischen. Trennen Sie es in verschiedene Komponenten. –
@James_D Ich habe nicht gesagt, es mit einer Klasse zu tun, ich möchte ein gutes, einfaches, sauberes und klares Beispiel einer Klasse, die mein JavaFX-Projekt mit einer MySQL-Datenbank verbindet und ein Beispiel dafür, wie man die Daten aus der Datenbank bekommt in eine Tabelle. Ich habe so etwas noch nicht auf google oder youtube oder facebook oder stackoverflow etc gesehen. – marcS
Nun, es gibt Hunderte von Beispielen für die Anzeige von Daten in einem 'TableView' und Hunderte von Beispielen für das Abrufen von Daten aus einer Datenbank. Ich werde etwas zusammensetzen, aber ich bin mir nicht sicher, was es woanders nicht gibt. –