0

Java (Web) アプリケーションでのデータベースの DAO 実装に取り​​組んでいます。ちょっとした問題に遭遇したのは私だけです。

私の現在のコード:

Account.java:

package beans;

public class Account {
    private int accountId;
    private String name;
    private String password;
    private String email;

    public Account() {

    }

    public Account(final String name, final String password, final String email) {
        this.name = name;
        this.password = password;
        this.email = email;
    }

    public int getAccountId() {
        return accountId;
    }

    public void setAccountId(int accountId) {
        this.accountId = accountId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

DAO.java:

package dao;

import java.util.Collection;

public interface DAO<T> {
    public int insert(T t);

    public boolean update(T t);

    public T get();

    public Collection<T> search();

    public boolean delete(T t);
}

AccountDAO.java:

package dao;

import beans.Account;
import java.util.Collection;

public class AccountDAO implements DAO<Account> { 
    @Override
    public int insert(Account t) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean update(Account t) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Account get() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Collection<Account> search() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean delete(Account t) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

DAO問題は、既にインターフェイスでSQL 文字列を使用したくないと確信しているということですが、どのようget()search()適切に実装するかという問題があります。

get()これは一般的なインターフェイスであるため、まだ列名を操作することはできません。インターフェイスからメソッドを削除する必要がない限り、それらが実装されるように、search()メソッドをインターフェイス内に保持したいと思います。

私の提案する提案は、クラス T の範囲または完全に入力されていないオブジェクトで検索することです。したがって、name=x のアカウントを取得する場合は、次のようなコードになります。

AccountDAO accountDAO = DAOFactory.getAccountDAO();
Account result = accountDAO.get(new Account(x, null, null));

しかし、これが最善の解決策であるかどうかはわかりません。助けてください。

よろしく。

4

1 に答える 1

0

これは私が私のものに取り組んだ方法です:

NativeQueryBasedDAOSQL クエリを受け入れる抽象クラスを作成しました。このようにして、NativeQueryBasedDAO各 RDBMS (MySQL、DB2、PostGres など) を表す拡張サブクラスを作成できます。

あなたの場合、次のような効果があります。

public abstract class NativeQueryBasedDAO<T> implements DAO<T> {

    private Connection connection;
    private String schemaName;
    private String tableName;

    protected NativeQueryBasedDAO(Connection connection, String tableName) {
        this(connection, null, tableName);
    }

    protected NativeQueryBasedDAO(Connection connection, String schemaName, String tableName) {
        if (schemaName == null) {
            this.schemaName = "";
        } else {
            this.schemaName = schemaName;
        }
        this.connection = connection;
        this.tableName = tableName;
    }

    protected final String getTableName() {
        return tableName;
    }

    protected final String getSchemaName() {
        return schemaName;
    }

    protected final Connection getConnection() {
        return connection;
    }
}

get()上記のフィールドは、に基づいてオブジェクトを取得する必要がある場合などのメソッドで役立ちますschemaName + tableName

次に、オブジェクト(あなたの場合はアカウント)を作成するFactory<T>を持つ があります。public T create()

Parameters, you can pass/generate aしたがって、オブジェクトを生成するいくつかの Factory`に基づいています。

次に、オブジェクトを作成するために設定するパラメーターを使用して を作成するように変更DAOできます。get(Criteria criteria)Factory

一言で言えば、これは単純なソリューションではありません (これは堅牢であり、要件に基づいて拡張する必要があるためです)。Hibernate や JPA 実装 (TopLink など) などの ORM がこれを処理します。

これが役立つことを願っています。

于 2013-06-28T12:24:34.310 に答える