我想创建一个可以与数据库交互的类,它具有以下所需的功能:
现在我想提取一个接口,或者更确切地说是一个我觉得可能更适用的抽象类,以确保所有类/数据字段都遵循相同的“接口”,并且能够将它们用作列表中的超类型等
数据类,在这种情况下是Account.java,应该代表一个存储{Username,Password}的数据库中的表,我现在省略了一个明确的唯一标识符,仍然不确定我是否会创建一个额外的ID字段或使用用户名字段的唯一性。
最好是抽象类本身会处理所有MySQL交互'乱'。
到目前为止Account.java:
package testthing;
import java.util.Map;
/**
*
* @author Frank
*/
public class Account {
private final static String ALL_QUERY = "SELECT * FROM accounts";
private final static String INSERT_QUERY = "INSERT INTO accounts (username, password) VALUES(?, ?)";
private final static String UPDATE_QUERY = "UPDATE accounts SET password=? WHERE username=?";
private String username;
private String password;
public Account(final String username, final String password) {
this.username = username;
this.password= password;
}
public String getUsername() {
return username;
}
public void setUsername(final String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(final String password) {
this.password = password;
}
public static Map<String, Account> getAll() {
//return a map using the ALL_QUERY string
}
public void insert() {
//insert this using INSERT_QUERY
}
public void update() {
//update this using UPDATE_QUERY
}
}
我知道我不是很清楚我害怕,但我希望这足以帮助我开始。
基本上我想始终在使用TableObject
时能够使用以下方法,Account
将是其中的一部分:
Account.getAll();
new Account("test", "test").insert();
currentAccount.setPassword("newPassword"); currentAccount.update();
所有令人讨厌的SQL内容都应隐藏在提议的抽象类中。在TableObject
类中唯一无法逃避的是SQL查询的定义。
问候。
编辑:在当前示例中,Account.getAll()
返回Map<String, Account>
,但实际上第一个泛型参数应该是数据库中键的类型。因此,如果您使用唯一ID,则需要返回Map<Integer, Account>
。我希望这一改变能让人们及时阅读它。
答案 0 :(得分:1)
在超类中使用连接代码和所有“讨厌”的东西是不是更合乎逻辑,但只是在超类中有一个更通用的方法,它由子类使用。例如:
public void executeUpdate(String query)
{
// Code to execute update.
}
public Map<String, Data> getData(String query)
{
// Code to get data.
return data;
}
这样,这些方法更为通用。这意味着您可以实现几个简单地传递查询数据的类,而不是每次想要添加新功能时不断更新超类。
显然我刚刚在这里假设了一个类型Data
,但这可能是值得研究的。这里的目的是尽可能地分离你的课程。这意味着您可以根据需要添加任意数量的新类,并且可以无限制地使用其超类型。
这也意味着像
这样的事情Account.getAll();
稍微复杂一点,因为如果您的超类中有getAll
,那么您想要获取所有accounts
的引用在哪里?如果代码实际上在Account
类中,您可以自定义查询,并将其发送到要执行的getData
方法。