【发布时间】:2020-06-09 14:37:22
【问题描述】:
所以我试图通过仅使用函数调用而不更改它来更新变量。所以我想要一个带有变量“名称”的对象,它将通过从数据库中获取它来接收它的值:
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";
}
}
这里我每次都通过一个单独的函数手动重新分配值,我怎样才能避免这种情况并让它从数据库中获取值并在每次调用变量名时使用获取的值?
【问题讨论】:
-
你不能,因为 Java 不是这样工作的。如果要更新变量,则需要显式地为变量分配一个新值。
-
您可以将变量设为
Supplier<String>而不是String,并为其分配一个调用 fetch 方法的 lambda。那是你能来的最接近的地方。我认为你应该重新考虑你的设计。 -
它永远不会以这种方式工作。这是一个您可以使用任何 ORM 或将您的类映射到表来处理的问题,可能就是这样。