首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DAO实现:使DAO对象成为其他DAO的属性

DAO实现:使DAO对象成为其他DAO的属性
EN

Stack Overflow用户
提问于 2016-06-05 13:23:31
回答 1查看 975关注 0票数 0

如何使DAO对象成为其他DAO的属性?

假设我有一个带有Department属性的Employee对象

代码语言:javascript
复制
public class Employee {
     public Department;

      //setter and getters
  }

我有这个EmployeeDAO和DepartmentDAO接口以及相应的实现

我有DAOFactory

代码语言:javascript
复制
public abstract class DAOFactory {

// db connection instantiation here

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

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

}

我有一个servlet来实例化这个DAOfactory

代码语言:javascript
复制
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);

}

我的问题是,当我调用employeeDAO的findAll方法时,如何映射employeeDAO内部的Department或它的实现?

在我试图绘制结果的过程中,我遇到了这样的情况:

代码语言:javascript
复制
    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;
}

但我认为这是一个错误的方法。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-05 14:09:00

您的EmployeeDAOImpl依赖于IDepartmentDAO。与其直接实例化EmployeeDAOImpl,不如将其声明为依赖项,并让构造该的代码知道如何解决该问题。

假设

代码语言:javascript
复制
interface IEmployeeDAO {
    Employee load(long id);
}
interface IDepartmentDAO  {
    Department load(long id);
}

由于接口需要构造函数中所需的dao

代码语言:javascript
复制
class EmployeeDAOImpl implements IEmployeeDAO {

    private final DAOFactory factory;
    private final IDepartmentDAO departmentDAO;

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

现在你可以在任何地方使用它了。例如:

代码语言:javascript
复制
@Override
public Employee load(long id) {
    ...
    long departmentId = ....
    Department department = departmentDAO.load(departmentId);
    employee.department = department;
    return employee;
}

知道使用哪种实现的DAOFactory现在可以通过添加一个简单的参数来提供依赖关系。

代码语言:javascript
复制
public IEmployeeDAO getEmployeeDAO() {
    return new EmployeeDAOImpl(this, getDepartmentDAO());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37642413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档