所以我想通过函数调用来更新一个变量,而不改变它。所以我想有一个对象,它有一个变量'name',它将从数据库中获取它的值。
String name = fetchNameFromDB(); // Name is 'Jim'
然后如果我改变了数据库中的值 每当我引用'name'的值时,它就会返回更新后的值,比如。
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()
(例如)你可以在你的数据库中更新你的值,为每个注册的对象分配一个函数到事件处理程序中。
你可以做的一件事是设计一个满足你需求的接口,它的第一个参数是变化的目标和与变化相关的函数。最后,在每个变化被触发时,你的数据将在数据库中自动更新。
你可以看看一些设计模式,例如 观察家, 事件通知器 或 EventBus 与此接口一起使用。
重要的是: 我不建议这样做,它对你的应用程序性能有负面影响,我强烈建议不要使用。