0

我想创建一个可以与数据库交互的类,它具有以下所需的功能:

  • 它有一个从数据库中返回所有字段的方法,以后可以更改,这样它也可以限制它的返回。
  • 它有一个插入此类特定实例的方法。
  • 它有一个方法来更新这个类的特定实例。在进一步解释之后,我将在稍后展示代码。

现在我想提取一个接口,或者我认为可能更合适的抽象类,以确保所有类/数据字段都遵循相同的“接口”,并能够将它们用作列表等中的超类型。

数据类,在本例中为 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
    }
}

我知道我并没有那么清楚,但我希望这足以帮助我继续前进。

基本上,我希望在使用 a 时始终能够使用以下方法TableObject,这Account将是以下方法的子集:

  • Account.getAll();
  • new Account("test", "test").insert();
  • currentAccount.setPassword("newPassword"); currentAccount.update();

所有讨厌的 SQL 东西都应该隐藏在提议的抽象类中。唯一不能在TableObject类中转义的是 SQL 查询的定义。

问候。

编辑:在当前示例中Account.getAll()返回 a Map<String, Account>,但实际上第一个通用参数应该是数据库中键的类型。因此,如果您要使用唯一 ID,那么它需要返回一个Map<Integer, Account>. 我希望这种变化能让人们及时阅读它。

4

1 回答 1

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到要执行的方法。

于 2013-05-13T19:23:43.283 回答