次の機能を備えたデータベースと対話できるクラスを作成したいと考えています。
- データベースからすべてのフィールドを返すメソッドがあり、後でそれを返すことで制限できるように変更できます。
- このクラスの特定のインスタンスを挿入するメソッドがあります。
- このクラスの特定のインスタンスを更新するメソッドがあります。さらに説明した後、すぐにコードを示します。
ここで、すべてのクラス/データフィールドが同じ「インターフェイス」に従っていることを確認し、それらをリストなどのスーパータイプとして使用できるようにするために、インターフェイス、またはより適切であると思われる抽象クラスを抽出したいと考えています。
この場合、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()
は a を返しますMap<String, Account>
が、実際には最初のジェネリック引数はデータベース内のキーの型である必要があります。したがって、一意の ID を使用する場合は、Map<Integer, Account>
. この変更により、人々がそれを読むのに間に合うことを願っています.