什么是DAO工厂模式?

2022-09-01 04:37:42

我知道工厂和抽象工厂方法,但我想用Java创建一个DAO工厂模式。

  1. 我想知道它的重要性。
  2. 其用法

我已经检查了这个链接,但我很难理解。

任何人都可以借助示例来解释它吗?

编辑:以下是我所理解的DAO模式的一个例子:

public interface UserDAO {
    public void insert(User user);
    public void update(User user);
    public void delete(int userId);
}

实现:

public class UserDAOImpl implements UserDAO {
    @Override
    public void delete(int userId) {
        // delete user from user table
    }

    @Override
    public User[] findAll() {
        // get a list of all users from user table
        return null;
    }

    @Override
    public User findByKey(int userId) {
        // get a user information if we supply unique userid
        return null;
    }

    @Override
    public void insert(User user) {
        // insert user into user table
    }

    @Override
    public void update(User user) {
        // update user information in user table
    }
}

厂:

public class UserDAOFactory {
    public static UserDAO getUserDAO(String type) { 
        if (type.equalsIgnoreCase("jdbc")) {
            return new UserDAOImpl();
        } else {
            return new UserDAOImpl();
        }
    }
}

客户端代码:

User user=new User();
user.setName("Jinoy P George");
user.setDesignation("Programmer");
user.setAge(35);
//get a reference to UserDAO object
UserDAO userDAO=UserDAOFactory.getUserDAO("jdbc");
//call insert method by passing user object
userDAO.insert(user);

这种道模式正确吗?

我应该在哪里打开连接并关闭它?


答案 1

DAO 代表 “数据访问对象”。它是一个基于接口的类,它使用特定对象的关系数据库处理所有 CRUD 操作。下面是一个使用泛型的示例:

package persistence;

public interface GenericDao<K extends Serializable, T> 
{
    public T find(K id);
    public List<T> find();
    public K save(T value);
    public void update(T value);
    public void delete(T value);
}

将工厂视为“虚拟构造函数”:其创建方法返回接口类型,但您可以根据需要要求它创建任意数量的不同实现。


答案 2

您可能不了解的是代码的工作原理?似乎没问题。

仅供参考:

  • 如果您考虑将其命名为UserDAOMySQLImpl,并将另一个新名称命名为UserDAOMSSQLImpl,则可以更好地理解定义为UserDAOImpl的内容,对于您可能需要的每个数据库访问,依此类推。

  • 在每一个中,您都应该处理连接并添加其他内容,例如特定数据库服务器配置的私有函数,它可能需要并且不是强制需要在接口(UserDAO)中声明的,但至少必须始终实现接口中定义的所有方法,然后在工厂(UserDAOFactory)条件下,您可以拥有如下内容:

`

public class UserDAOFactory{

    public static UserDAO getUserDAO(String type){ 
        if (type.equalsIgnoreCase("mysql")){
            return new UserDAOMySQLImpl();
        }else{
            return new UserDAOMSSQLImpl();
        }
    }
}

更清晰一些?

然后,在客户端而不是硬编码行,如:

UserDAO userDAO=UserDAOFactory.getUserDAO("jdbc");

您可以有一个属性文件,以便能够在DAO之间动态切换,从属性文件中检索到该字符串后,您只需执行以下操作:

UserDAO userDAO=UserDAOFactory.getUserDAO(myStringFromPropertiesFile);

myStringFromPropertiesFile将根据属性文件中的定义包含“mysql”或“mssql”。

希望这有帮助!


推荐