【问题标题】:Writing data into MySQL table with JavaFX使用 JavaFX 将数据写入 MySQL 表
【发布时间】:2016-11-25 11:37:23
【问题描述】:

我已使用 Netbeans 中的 JDBC 将数据库链接到我的 Java 应用程序。 但是,每当我尝试从 TextField 向 MySQL 表中写入内容时,它都不起作用。

我有一个预制类来建立数据库连接。

这是我的数据库类:

        package testswitch; 

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Maarten 
 */

public class Database {


public final static String DB_DRIVER_URL = "com.mysql.jdbc.Driver";
public final static String DB_DRIVER_PREFIX = "jdbc:mysql://";

private Connection connection = null;

public Database(String dataBaseName, String serverURL, String userName, String passWord) {
    try {
        // verify that a proper JDBC driver has been installed and linked
        if (!selectDriver(DB_DRIVER_URL)) {
            return;
        }

        if (serverURL == null || serverURL.isEmpty()) {
            serverURL = "localhost:3306";
        }

        // establish a connection to a named Database on a specified server
        connection = DriverManager.getConnection(DB_DRIVER_PREFIX + serverURL + "/" + dataBaseName, userName, passWord);
    } catch (SQLException eSQL) {
        logException(eSQL);
    }
}

private static boolean selectDriver(String driverName) {
    // Selects proper loading of the named driver for Database connections.
    // This is relevant if there are multiple drivers installed that match the JDBC type.
    try {
        Class.forName(driverName);
        // Put all non-prefered drivers to the end, such that driver selection hits the first
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        while (drivers.hasMoreElements()) {
            Driver d = drivers.nextElement();
            if (!d.getClass().getName().equals(driverName)) {
                // move the driver to the end of the list
                DriverManager.deregisterDriver(d);
                DriverManager.registerDriver(d);
            }
        }
    } catch (ClassNotFoundException | SQLException ex) {
        logException(ex);
        return false;
    }
    return true;
}

public void executeNonQuery(String query) {
        try (Statement statement = connection.createStatement()) {
        statement.executeUpdate(query);
    } catch (SQLException eSQL) {
        logException(eSQL);
    }
}

public ResultSet executeQuery(String query) {
    Statement statement;
    try {
        statement = connection.createStatement();

        ResultSet result = statement.executeQuery(query);

        return result;
    } catch (SQLException eSQL) {
        logException(eSQL);
    }

    return null;
}

private static void logException(Exception e) {
    System.out.println(e.getClass().getName() + ": " + e.getMessage());

    e.printStackTrace();
}
}

这是我的 JavaFX 控制器。 我想要的是,当按下“句柄”按钮时,将 TextField 中填充的数据插入到数据库中。

package testswitch;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import testswitch.Database;

/**
 *
 * @author Maarten
 */
public class gebruikerToevoegenController {

    //TextFields
    @FXML
    private TextField FXVoornaam, FXTussenvoegsel, FXAchternaam, FXGebruikersnaam;
    @FXML
    private TextField FXWachtwoord, FXEmail, FXTelefoonnummer;

    //Boolean checkbox positie
    @FXML
    private CheckBox ManagerPosition;
    @FXML
    private Button gebruikerButton;

    public final String DB_NAME = "testDatabase";
    public final String DB_SERVER = "localhost:3306";
    public final String DB_ACCOUNT = "root";
    public final String DB_PASSWORD = "root";

    Database database = new Database(DB_NAME, DB_SERVER, DB_ACCOUNT, DB_PASSWORD);

    public void handle(ActionEvent event) throws SQLException {

        String query = "INSERT INTO testDatabase.Gebruikers (Voornaam) VALUES " + FXVoornaam.getText();
        try {
            database.executeQuery(query);

        } catch (Exception e) {

        }
    }
}

提前致谢

【问题讨论】:

  • “为什么这段代码不起作用”在这里是题外话。使用调试器找出或描述您遇到的错误以及您尝试修复的内容:stackoverflow.com/help/how-to-ask
  • 您是否尝试过直接在您的 DBMS 上运行“查询”字符串以查看语句本身是否确实有效?另外,您的“executeQuery”方法中的“结果”包含什么(有用吗?)?
  • 是的,我已经尝试运行查询,它可以工作。我认为 result 保持与数据库的连接并对其执行查询,如果我错了,请纠正我,正如我所提到的,它是一个预制类
  • 在调试时不要仅仅“吞下”异常。在 catch 块中添加类似e.printStackTrace(System.err) 的内容应该可以让您更好地了解发生了什么...顺便说一句:我怀疑该字符串在查询中是否被正确引用,并且值应该在括号内。更好地使用PreparedStatement

标签: java mysql sql javafx


【解决方案1】:

您的 SQL 查询中的字符串似乎没有被正确引用。对于这种情况,最好使用PreparedStatement

public class Database {

    public PreparedStatement prepareStatement(String query) throws SQLException {
         return connection.prepareStatement(query);
    }

    ...
public void handle(ActionEvent event) throws SQLException {

    String query = "INSERT INTO testDatabase.Gebruikers (Voornaam) VALUES (?);";
    PreparedStatement statement = database.prepareStatement(query);
    try {
        statement.setString(1, FXVoornaam.getText());
        statement.executeUpdate();
    } catch (Exception e) {
         // log info somewhere at least until it's properly tested/
         // you implement a better way of handling the error
         e.printStackTrace(System.err);
    }
}

【讨论】:

  • 非常感谢,这就是解决方案。
【解决方案2】:

你必须在 JavaFx 中这样添加:

String query = "INSERT INTO testDatabase.Gebruikers (Voornaam) VALUES ('{FXVoornaam.getText()}') ";

【讨论】:

  • 感谢您的回复,但遗憾的是它无法正常工作。
  • 我不知道你为什么要用java写这样的东西,但我很确定它不起作用......
  • 在JavaFx中你可以为一个文本框添加这个方法,例如:textbox.rawText()
【解决方案3】:
String query = "INSERT INTO testDatabase.Gebruikers(Voornaam) 
VALUES('" + FXVoornaam.getText() + "')";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多