java - 当我向变量分配函数时,如何让变量自行更新

标签 java sql jdbc

所以我尝试仅使用函数调用来更新变量而不更改它。所以我想要一个带有变量“名称”的对象,该对象将从数据库中获取它的值:

String name = fetchNameFromDB(); // Name is 'Jim'

然后,如果我更改数据库中的值,每当我引用“名称”值时,它都会返回更新后的值,例如:

String name = fetchNameFromDB(); // Assigns name as 'Jim'
changeNameTo("Steve"); // Changes the value in the database from 'Jim' to 'Steve'
System.out.println(name); // Will print 'Jim' but I want this to be printing 'Steve'

我目前唯一的解决方案是这个(我使用 JDBC 和 MySQL):

public  class GroundControlToMajorTom {
    static String theName;
    static String ID;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        //System.out.println(returnEmployeeSalary("ivy"));
        theName = returnEmployeeName("72913");
        changeName("Kass", "72913");
        System.out.println(theName);
    }

    public static void changeName(String name, String ID) throws ClassNotFoundException, SQLException{
        System.out.println(theName);
        changeEmployeeName(name, ID);
        theName = returnEmployeeName(ID);
        System.out.println(theName);
    }

    public static void changeEmployeeName(String name, String ID) throws ClassNotFoundException, SQLException {
        String url = "jdbc:mysql://localhost:3306/sql_hr";
        String uname = "root";
        String pass = "Culley1max1";
        String query = "UPDATE employees SET first_name = '" + name + "' WHERE employee_ID = '" + ID + "'";

        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, uname, pass);

        Statement st = con.createStatement();
        int rs = st.executeUpdate(query);

        st.close();
        con.close();
    }

    public static String returnEmployeeName(String ID) throws ClassNotFoundException {
        HashMap<String, String> infoHR = connectionInfoHR();

        String query = "SELECT first_name FROM employees WHERE employee_id = '" + ID + "'";

        Class.forName("com.mysql.cj.jdbc.Driver");

        try (Connection con = DriverManager.getConnection(infoHR.get("url"), infoHR.get("uname"), infoHR.get("pass"));
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery(query)) {

            rs.next();
            return rs.getString("first_name");

        } catch (Exception e) {
            return "ConnectionInfoHR credentials incorrect - Cannot connect to database";
        }
    }

这里我每次都通过单独的函数手动重新分配值,如何避免这种情况并让它从数据库中获取值并在每次调用变量名称时使用获取的值?

最佳答案

我不知道你为什么要这样做,正如其他人所说这可能确实是一个设计问题。

无论如何,您可能需要考虑为您的应用程序编写自定义事件。 onValueChange() (例如)您可以更新数据库内的值,为每个注册对象分配一个函数给事件处理程序。

您可以做的一件事是设计一个满足您需求的界面,将更改的目标和与更改相关的函数作为第一个参数。最后,每次触发更改时,您的数据都会在数据库中自动更新。

您可能需要查看一些设计模式,例如 ObserverEvent NotifierEventBus 来与此界面一起使用。

重要:
我不建议这样做,它会对您的应用程序性能产生负面影响,我强烈建议不要使用它。

关于java - 当我向变量分配函数时,如何让变量自行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62285143/

相关文章:

java - 是否有一种更简洁的方法来实例化 5 个对象 A、3 个对象 B、1 个对象 C、1 个对象 D,所有这些都在一个方法中?

java - 通过 SWIG 在 Java 中访问 uint8_t vector

java - 不能与 BufferedInputStream 和 BufferedReader 一起使用

mysql - 如何在 MySQL 中随机连接表?

带有连接的Java Mysql查询数据库

java - 按自定义顺序对 Arraylist 进行排序

sql - 使用 Google BigQuery 上的开始/结束日期优化活跃帐户查询

sql - 索引扫描不能与 LIMIT 一起正常工作

mysql - 带有十六进制文字的 JDBCPreparedStatement

java - 通过异常处理 : com. mysql.jdbc.MysqlDataTruncation