2016-06-05 10 views
0

Wie kann ich ein DAO-Objekt zu einer Eigenschaft eines anderen DAO machen?DAO-Implementierung: Ein DAO-Objekt zu einer Eigenschaft eines anderen DAO machen

sagen, dass ich ein Objekt Employee mit einer Abteilung Eigenschaft haben

public class Employee { 
    public Department; 

     //setter and getters 
    } 

Ich hatte diese EmployeeDAO und DepartmentDAO Schnittstellen mit entsprechenden Implementierungen

Und ich hatte DAOFactory

public abstract class DAOFactory { 

// db connection instantiation here 

public IEmployeeDAO getEmployeeDAO() { 
    return new EmployeeDAOImpl(this); 
} 

public IDepartmentDAO getDepartmentDAO() { 
    return new DepartmentDAOImpl(this); 
} 

}

Ich hatte ein Servlet, wo dieses DAOfa instanziiert ctory

public class EmployeeController extends HttpServlet { 

public EmployeeController() { 
    super(); 
    DBUtils dbInstance = DBUtils.getInstance("mysql"); 
    System.out.println("DAOFactory successfully obtained: " + dbInstance); 

    // Obtain UserDAO. 
    employeeDAO = dbInstance.getEmployeeDAO(); 
    departmentDAO = dbInstance.getDepartmentDAO(); 
    jobDAO = dbInstance.getJobDAO(); 

} 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

      employees = employeeDAO.findAll(); 

      request.setAttribute("employees", employees); 

} 

meine Frage ist, wie kann ich die Abteilung Objekt innerhalb des employeeDAO oder ihre Durchführung Karte, wenn ich die findAll Methode des employeeDAO nennen?

Ich hatte in meinem Versuch, so etwas wie dies die Ergebnisse zur Karte:

private Employee map(ResultSet rs) throws SQLException { 
    Employee employee = new Employee(); 

    employee.setEmployeeID(rs.getInt("EMPLOYEE_ID")); 
    employee.setFirstName(rs.getString("FIRST_NAME")); 
    employee.setLastName(rs.getString("LAST_NAME")); 

    Department department = new DepartmentDAOImpl().getDepartmentByID(rs 
      .getInt("DEPARTMENT_ID")); 

    employee.setDepartment(department); 

    return employee; 
} 

Aber ich denke, das ist ein falscher Ansatz. Kann mir jemand dabei helfen?

+0

, warum dies der falsche Ansatz sein sollte? Funktioniert etwas nicht wie erwartet? (Obwohl ich JPA anstelle der manuellen Objekt-Mapping in Betracht ziehen würde, da es den ganzen dao für Sie tut. Und während es eine Abstraktion auf höherer Ebene als das Erweitern von HttpServlets findet) – zapl

+0

Weil ich direkt eine Instanz der DAO-Implementierung erstelle, die dies tun soll durch die DAO-Schnittstelle ausgeblendet werden Was ich wollte, ist dies zu ermöglichen, sobald ich den Mitarbeiter anrufeDAO.findAll(); Ich habe auch einige Artikel über JPA gesehen. Ich plane, es in meinen zukünftigen Projekten zu implementieren. –

Antwort

0

Sie EmployeeDAOImpl hat eine Abhängigkeit von IDepartmentDAO. Anstatt es direkt zu instantiieren, deklariere es als Abhängigkeit und lasse den Code, der das EmployeeDAOImpl konstruiert, herausfinden, wie man es löst.

Unter der Annahme,

interface IEmployeeDAO { 
    Employee load(long id); 
} 
interface IDepartmentDAO { 
    Department load(long id); 
} 

wie die Schnittstellen der benötigten dao im Konstruktor benötigen

class EmployeeDAOImpl implements IEmployeeDAO { 

    private final DAOFactory factory; 
    private final IDepartmentDAO departmentDAO; 

    public EmployeeDAOImpl(DAOFactory factory, IDepartmentDAO departmentDAO) { 
     this.factory = factory; 
     this.departmentDAO = departmentDAO; 
    } 
    ... 

und jetzt können Sie es überall benutzen. z.B.

@Override 
public Employee load(long id) { 
    ... 
    long departmentId = .... 
    Department department = departmentDAO.load(departmentId); 
    employee.department = department; 
    return employee; 
} 

Ihre DAOFactory, die sowieso, welche Art von Implementierungen Sie kennt verwenden können jetzt die Abhängigkeiten schaffen, durch einen einfachen Parameter hinzufügen

public IEmployeeDAO getEmployeeDAO() { 
    return new EmployeeDAOImpl(this, getDepartmentDAO()); 
} 
+0

Vielen Dank, dass Sie mir geholfen haben, Sir. –

+0

Oh, eine andere Frage, wie kann ich die Abteilung DAO instanziieren, wenn ich ein Manager-Objekt hatte, das die Mitarbeiterklasse als seine Eigenschaft erweitert? –

+0

@GmChill Der gleiche Weg vielleicht (machen Sie es zu einem Argument des Konstruktors). Aber ich bin mir auch nicht sicher, wie du das meinst. Ein Manager sollte normalerweise nicht das, was er verwaltet, 'erweitern', es braucht lediglich einen Hinweis auf das Ding: ["Was ist das Liskow-Substitutionsprinzip?"] (Http: // stackoverflow.com/questions/56860/was-ist-das-liskov-ersatz-prinzip) – zapl

Verwandte Themen