javafxmysql连接示例

javafxmysql连接示例,mysql,javafx-2,Mysql,Javafx 2,有谁能给我举一个连接JavaFX和MySQL的类的例子,不需要主类,只需要一个连接任何应用程序到MySQL数据库并从该数据库获取一行到一个表的类的例子,搜索了整个互联网,我没有直接找到任何东西,我不想要任何花哨的东西,只是为了完成工作。 简洁明了。至少需要三个类:一个用于表示数据,一个用于用户界面,一个用于管理数据库连接。当然,在真正的应用程序中,你需要的不仅仅是这些。此示例遵循的基本示例与 假设您的数据库有一个包含三列的person表,first\u name,last\u name,emai

有谁能给我举一个连接JavaFX和MySQL的类的例子,不需要主类,只需要一个连接任何应用程序到MySQL数据库并从该数据库获取一行到一个表的类的例子,搜索了整个互联网,我没有直接找到任何东西,我不想要任何花哨的东西,只是为了完成工作。
简洁明了。

至少需要三个类:一个用于表示数据,一个用于用户界面,一个用于管理数据库连接。当然,在真正的应用程序中,你需要的不仅仅是这些。此示例遵循的基本示例与

假设您的数据库有一个包含三列的
person
表,
first\u name
last\u name
email\u address

然后您将编写一个
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);
    }

}
用于从数据库访问数据的类:

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
}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.sql.Statement;
导入java.sql.ResultSet;
导入java.util.List;
导入java.util.ArrayList;
公共类PersonDataAccessor{
//在现实生活中,使用连接池。。。。
专用连接;
公共PersonDataAccessor(字符串驱动程序ClassName、字符串dbURL、字符串用户、字符串密码)抛出SQLException、ClassNotFoundException{
Class.forName(driverClassName);
connection=DriverManager.getConnection(dbURL、用户、密码);
}
public void shutdown()引发SQLException{
if(连接!=null){
connection.close();
}
}
public List getPersonList()引发SQLException{
试一试(
语句stmnt=connection.createStatement();
ResultSet rs=stmnt.executeQuery(“选择*来自个人”);
){
List personList=新建ArrayList();
while(rs.next()){
String firstName=rs.getString(“first_name”);
String lastName=rs.getString(“last_name”);
String email=rs.getString(“电子邮件地址”);
Person-Person=新人(名字、姓氏、电子邮件);
personList.add(person);
}
回归人格;
} 
}
//其他方法,如addPerson(…)等
}
然后是一个UI类:

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);
    }
}
导入javafx.application.application;
导入javafx.scene.control.TableView;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.scene;
导入javafx.stage.stage;
公共类PersonTableApp扩展应用程序{
私有PersonDataAccessor数据访问器;
@凌驾
public void start(Stage primaryStage)引发异常{
dataAccessor=new PersonDataAccessor(…);//提供driverName、dbURL、用户、密码。。。
TableView personTable=新建TableView();
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
TableColumn lastNameCol=新的TableColumn(“姓氏”);
lastNameCol.setCellValueFactory(新属性ValueFactory(“lastName”));
TableColumn emailCol=新的TableColumn(“电子邮件”);
emailCol.setCellValueFactory(新属性ValueFactory(“电子邮件”);
personTable.getColumns().addAll(firstNameCol、lastNameCol、emailCol);
personTable.getItems().addAll(dataAccessor.getPersonList());
BorderPane根=新的BorderPane();
root.setCenter(personTable);
场景=新场景(root,600400);
初级阶段。场景(场景);
primaryStage.show();
}
@凌驾
public void stop()引发异常{
if(数据访问器!=null){
dataAccessor.shutdown();
}
}
公共静态void main(字符串[]args){
发射(args);
}
}

(我只是在没有测试的情况下输入,因此可能会有输入错误、缺少导入等,但这应该足以让您了解情况。)

除了以下答案之外:

我想连接到一个远程(MySQL)数据库,所以我更改了构造函数并仅通过url连接:

public UserAccessor(String dbURL, String user, String password) throws SQLException, ClassNotFoundException {
    connection = DriverManager.getConnection(dbURL, user, password);
}
初始化通过:

UserAccessor userAccessor = new UserAccessor(
   "jdbc:mysql://xxx.xxx.xxx.xxx:YOUR_PORT", "YOUR_DB_USER", "YOUR_PASSWORD")
请注意: 您还需要包括连接器库。我选择了IntelliJ附带的
mysql-connector-java-5.1.40-bin.jar
,它位于
/Users/martin/Library/Preferences/IntelliJIdea2017.1/jdbc-drivers/mysql-connector/J/5.1.40/mysql-connector-java-5.1.40-bin.jar


荣誉属于James_D。

你不应该在一个类中这样做:在一个地方混合这些不同的功能(一方面是数据库连接,另一方面是UI)是非常糟糕的做法。将它分成不同的组件。@James_D我并没有说要用一个类来实现它,我想要一个简单清晰的例子,一个将我的javaFX项目连接到MySQL数据库的类,以及一个如何将数据从数据库中获取到表中的例子。我在谷歌、youtube、facebook或stackoverflow等网站上都没有看到类似的例子,在
表格视图中显示数据的例子有数百个,从数据库检索数据的例子有数百个。我会把一些东西放在一起,但我不确定还有什么东西是其他地方不存在的。谢谢