Quelqu'un peut-il me donner un exemple de classe qui connecte JavaFX à MySQL, ne veut pas de classe principale, en avoir un, veut juste un exemple de classe qui connecte une application à une base de données MySQL et obtient une ligne de cette base de données dans une table, Tout Internet et je n'ai rien trouvé directement au point, je ne veux rien d'extraordinaire, juste quelque chose pour que le travail soit fait, s'il vous plaît . Quelque chose de propre et simple.
Au minimum, vous avez besoin de trois classes: une pour représenter vos données, une pour votre interface utilisateur et une pour gérer la connexion à la base de données. Dans une vraie application, vous auriez besoin de plus que cela, bien sûr. Cet exemple suit le même exemple de base que le tutoriel TableView
Supposons que votre base de données comporte une table person
à trois colonnes, first_name
, last_name
, email_address
.
Ensuite, vous écririez une classe Person
:
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);
}
}
Une classe pour accéder aux données de la base de données:
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
}
Et puis une classe d'interface utilisateur:
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);
}
}
(Je viens de taper cela sans test, il peut donc y avoir des fautes de frappe, des importations manquantes, etc., mais cela devrait suffire pour vous donner l’idée.)
En plus de la réponse de James_D :
Je voulais me connecter à une base de données distante (MySQL), alors j'ai changé de constructeur et je me suis connecté en url uniquement:
public UserAccessor(String dbURL, String user, String password) throws SQLException, ClassNotFoundException {
connection = DriverManager.getConnection(dbURL, user, password);
}
Init via:
UserAccessor userAccessor = new UserAccessor(
"jdbc:mysql://xxx.xxx.xxx.xxx:YOUR_PORT", "YOUR_DB_USER", "YOUR_PASSWORD")
Remarque: Vous devrez également inclure le connecteur lib. J'ai choisi mysql-connector-Java-5.1.40-bin.jar
qui était fourni avec IntelliJ et qui se trouvait sous /Users/martin/Library/Preferences/IntelliJIdea2017.1/jdbc-drivers/MySQL Connector/J/5.1.40/mysql-connector-Java-5.1.40-bin.jar
Les Kudos appartiennent à James_D.