Java/SQL实验DAO实现

cu6pst1q  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(133)

我正在一个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));

但我不确定这是否是最好的解决方案,请帮助我。
问候。

50few1ms

50few1ms1#

这就是我如何处理我的:
我创建了一个接受SQL查询的抽象类NativeQueryBasedDAO。这样,我就可以拥有扩展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工厂,将生成一个对象。 然后,您可以修改DAO以执行get(Criteria criteria),该get(Criteria criteria)构建Factory`,并使用参数填充以创建对象。
简而言之,它不是一个简单的解决方案(因为它必须是健壮的,并且可以根据您的需求进行扩展)。ORM,如Hibernate或JPA实现(例如TopLink)处理这个。
希望这能帮上忙。

相关问题