【问题标题】:use one sql connection object in whole program in java在java的整个程序中使用一个sql连接对象
【发布时间】:2020-10-07 05:22:57
【问题描述】:

我想使用 SQL 用户名和密码登录,因为很容易授予数据库权限。连接成功,但我想在整个程序中使用相同的 URL 和凭据,但不知道如何使用。我在两个不同的类中有以下代码

这是我的登录页面,可以正常工作

public class login {
    static String connectionUrl;
    @FXML
    private TextField loginusername_txt;
    @FXML
    private TextField loginpassword_txt;
    public final String url() throws SQLException {
        return connectionUrl = "jdbc:sqlserver://WIN\\SQLEXPRESS:1433;database=itinventory;" + "user=" + loginusername_txt.getText() + ";" + "password=" + loginpassword_txt.getText() + ";";

    }
    public final Connection conn() throws SQLException {
        Connection connect = DriverManager.getConnection(url());
        return connect;
    }
    public void connection(ActionEvent Event) throws Exception {


        try (Connection connect = DriverManager.getConnection(url());) {
            // Code here.
            Stage main = new Stage();
            Parent root = FXMLLoader.load(getClass().getResource("/application/main.fxml"));

            Scene scene = new Scene(root, 500, 500);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            main.setScene(scene);
            main.show();

            loginusername_txt.clear();
            loginpassword_txt.clear();

        }
        // Handle any errors that may have occurred.
        catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

//another class coding is
//full code for controller class is                                                                                                        public class controller {
login log = new login();
Stage main = new Stage();                                                                                                                 @FXML
private MenuItem mainip_menuitem;
public void laptop(ActionEvent Event) throws Exception
{
    AnchorPane root = FXMLLoader.load(getClass().getResource("/application/laptop.fxml"));
    samewindow(root);
}
@FXML
AnchorPane main_pain;
public void samewindow(AnchorPane samepane)
{
    main_pain.getChildren().setAll(samepane);
}
@FXML
private ComboBox laptopos_combo;
public void filloscombo() throws SQLException
{
    String query="Select * from operatingsystem";
    PreparedStatement pst = log.conn().prepareStatement(query);
            //.prepareStatement(query);
    ResultSet os = pst.executeQuery();
    while(os.next())
    {
        System.out.println(os);
    }
}

在运行第二个代码时显示此错误:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: 
    java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException


Caused by: java.lang.NullPointerException
    at application.login.url(login.java:24)
    at application.login.conn(login.java:29)
    at application.controller.filloscombo(controller.java:61)

【问题讨论】:

  • 第 24 行是哪一行?
  • 第 24 行返回 connectionUrl ="jdbc:sqlserver://WIN\\SQLEXPRESS:1433;database=itinventory;" + "user="+loginusername_txt.getText() +";"+ "password="+loginpassword_txt.getText()+";";
  • Spring有很多选择,这里有一些教程baeldung.com/the-persistence-layer-with-spring-data-jpa
  • 这看起来像一个 FXML 文件的控制器类(因为你有 @FXML-annotated 字段)。 @FXML-annotated 字段将仅在控制器实例中初始化(加载 FXML 文件时)。它们不会以某种方式在您创建的类的任意实例(使用new login())中被神奇地初始化(它们将被初始化为什么?)。您需要访问实际控制器。 OT:请使用正确的 Java 命名约定。当我们不能轻易看到什么是类名、什么是变量名等时,阅读您的代码非常困难。

标签: java sql javafx


【解决方案1】:

loginusername_txtloginpassword_txt 字段尚未初始化,正在被构造函数访问。您需要对其进行初始化,而不仅仅是声明它。

【讨论】:

  • loginusername_txt 是输入登录凭据的文本框
  • 这很好,但它可能为空。使用调试工具确定是否是,或者在第 24 行之前进行简单的 SOUT 调用。
  • 我认为登录后它会清除 loginusername_txt 的内容,因为我最后使用了 loginusername_txt.clear()。你能告诉我文本框值如何永久保存在变量中,即使它在登录后清除
  • 但是,初始化带有@FXML 注释的字段总是错误,因为它们打算由FXMLLoader 初始化。
  • 请提供上面 cod3 的一些例子
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多