2012-07-01 2 views
0

В эту пятницу я должен присутствовать на экзамене по «разработке программного обеспечения», но есть небольшая вещь, которую я не могу понять, и мой учитель недоступен для объяснения.BCED pattern - метод загрузчика объекта

Я должен сделать проект на основе шаблона Boundary-Controller-Entity (BCE) с сохранением (база данных или последовательный файл, но я буду использовать SQLite). Я должен реализовать классы сущностей с помощью методов save/load, которые помещают/извлекают данные в/из уровня сохранения. Они используют DAO.

Например:

public class someEntity 
{ 
    private int someData; 

    public void set_someData (int _someData) {this.someData = _someData;} 
    public int get_someData()    {return this.someData;} 

    public void save() 
    { 
     DAO dao = new DAO(); 

     dao.openConnection(); 
     dao.insert (this.someData); 
     dao.closeConnection(); 
    } 

До сих пор, это все понятно.

Когда я реализую метод «load», я хочу «заполнить» экземпляр объекта данными из базы данных, используя параметры поиска (первичный ключ в БД). Но, если, например, я хочу, чтобы все люди родились до 1980 года, что я могу сделать?

Единственное решение, на мой взгляд, реализовать следующее, в контроллер класса

ArrayList <people> pList= new ArrayList(); 
people p; 

for (int i = 1900 ; i < 1980 ; i++) 
{ 
    p = new people(); 

    if (p.load (i) == true); //returns true if has found corresponding entry in db 
    { 
    pList.add(i); 
    } 
} 

Это совершенно безумен, разве не так?

Итак, мне нужен метод «loader», который возвращает коллекцию, поэтому я могу реализовать в DAO метод, который возвращает всех людей, родившихся до 1980 года, с простым SQL-запросом. Это можно сделать только в том случае, если класс управления говорит напрямую с DAO, игнорируя правила шаблона BCE.

Как решить проблему, если это настоящая проблема?

ответ

0

Просто создайте метод в DAO для выполнения SQL-запрос типа:

SELECT * FROM people p WHERE p.born < '1980-01-01'; 

Не забудьте создать индекс на рожденного колонке.

Плюс в кафе, где родился один человек, который родился до 1980 года и работал в конкретной компании.

Вы можете использовать лимит.

SELECT p.* FROM people p p.company = c.id WHERE p.born < '1980-01-01' and p.company_id = 'thatcompany' LIMIT 1 

(предположим, что p.company_id является ФК Column)

+0

спасибо за ответ :) .........ok, но когда я это сделаю, я получаю resultSet с более чем одной записью, когда мне нужно только одно. если я выбрал первую запись resultSet и загрузил ее в свой экземпляр объекта, тогда мне может понадобиться повторить операцию: я создаю объект, метод загрузки вызова и метод загрузки делает этот запрос. у меня бы был такой же набор результатов, я бы выбрал вторую запись, но я просто не могу это сделать ..... или нет? PS: извините за мой английский, я знаю, иногда я делаю ужасные ошибки: D – sscnapoli1926

+0

Мне очень жаль, но я не могу понять, что именно вы хотите сделать. Да, вы можете получить несколько строк. Вы пытаетесь получить одного человека, который родился до 1980 года и работал в конкретной компании? – dgregory

+0

Да, потому что у меня должен быть один экземпляр объекта для каждой записи таблицы, это не так? Метод «load» относится к классу сущности, а не к коллекции ...... но если я могу использовать код ниже (это поиск в контейнере empolyees, а не сами сотрудники), я думаю, проблема решена. – sscnapoli1926

0

Я thinked о решении:

т.е. я получил «работника» лица, и «работник» работает в "Компания".

это может быть представлено как:

public class company 
{ 
    private String name; 
    private int employee_amount; 
    private ArrayList <employee> works; 

    //setter, getters and save methods... 

    public void load (String _name) 
    { 
    DAO dao = new DAO(); 
    employee e; 

    dao.openConnection(); 
    works = dao.searchByCompany (_name);  
    dao.closeConnection(); 

    this.name = _name; 
    this.employee_amount = e.length(); 
    } 

в DAO, будет implmented метод searchByCompany

public ArrayList <employee> searchByCompany (String name) 
{ 
    ArrayList <employee> to_return = new ArrayList(); 

    //stuff.... 

    rs = stmt.executeQuery ("SELECT * FROM Employees WHERE Company = '" + name + "'"); 

    //get rs fields and put everything into to_return 

    return to_return; 
} 

Так что, когда мне нужно будет искать famouses сотрудников, родившихся до '80, я поставил следующий код в класс контроллера

Company c = new Company; 

c.load ("thatCompany"); 

for (int i = 0 ; i < c.getEmployee_amount() ; i++) 
{ 
    // get ith employee from list 
    // test if was born before '80 
    //do something, else do other thing 
} 

Правильно ли он работает?