Что такое фабричный шаблон DAO? - PullRequest
35 голосов
/ 19 июня 2011

Мне известны фабричные и абстрактные фабричные методы, но я хочу создать фабричный шаблон DAO в Java.

  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);

Является ли этот шаблон Дао правильным?

Где мне открыть соединение и закрыть его?

Ответы [ 2 ]

24 голосов
/ 19 июня 2011

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);
}

Думайте о фабрике как о «виртуальном конструкторе»: ее метод создания возвращает тип интерфейса, но вы можете попросить его создать любое количество различных реализаций по мере необходимости.

18 голосов
/ 27 февраля 2015

Возможно, вы не понимаете, как работает код?Кажется, хорошо.

Просто к вашему сведению:

  • То, что определено как UserDAOImpl, может быть лучше понято, если вы решите назвать его как UserDAOMySQLImpl, а другой новый - как UserDAOMSSQLImpl и т. Д.для каждого доступа к базе данных, который вам может понадобиться.

  • В каждом из них вы должны обрабатывать соединения и добавлять другие вещи, например, частные функции, для той конкретной конфигурации сервера базы данных, которая может понадобиться, а не принудительночтобы быть объявленным в интерфейсе (UserDAO), но как минимум вы должны всегда реализовывать все методы, определенные в интерфейсе, тогда в условиях Factory (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» в соответствии с определением в вашем файле свойств.

Надеюсь, это поможет!

...