具有多个值对象的DAO层

时间:2011-02-24 20:27:07

标签: java

我必须设计DAO层,从我调用视图的DAO对象,它返回给我所有的数据。下面是场景:

当我进行客户搜索时,它会向我返回他的联系方式,交易详情,地址详情。

最后我得到了所有数据,它指的是个别实体(addressvo,transactionvo和contectvo)。

如果我遍历结果集,这里如何分隔数据并将其分配给我的Value对象?

此致 Chaitu

1 个答案:

答案 0 :(得分:0)

不要只在一个DAO中转储整个代码。有四个DAO。一个好的设计是每桌有一个DAO。因此,您有AddressDAOTrandactionDAOContactDAOUserDAO。如果你应该有四张桌子,

addresses
  a_id
  user_id (FK)
transactions
  t_id
  user_id (FK)
contacts
  c_id
  user_id (FK)
users
  user_id (PK)

现在,您编写UserDAO.searchUsers(...)此方法会将UserVO与其他VO一起返回为其属性:

 List<UserVO> UserDAO.searchUsers(...){

     //search query returns user_ids
     //populate the UserVOs

     //for each user_id
        userList.add(UserDAO.getUserById(user_id));

     //return userList
}

UserVO getUserById(...){
     //get UserVO from users tables
     UserVO uvo = ...;

     //populate rest of the attributes
     uvo.setAddress(AddressDAO.getAddress(user_id));
     uvo.setTransactions(TransactionDAO.getTransactions(user_id));
     uvo.setContacts(ContactDAO.getContacts(user_id));

     return uvo;
}

评论后更新

  

但是我在一个结果集对象中获取所有信息。这里有一个视图,它返回给我整个对象

是的,这是将关系数据库映射到对象时的标准困境。一方面,您在一个查询中拥有所有数据,但是创建了混乱的对象(您想要的那个);另一方面,你有更清晰的Java代码,但需要多次数据库命中(我上面建议的那个)。

如果您只想填充对象,那么它很简单(但很麻烦)。我想你可能在用户和内容之间有一对多的映射;用户和交易。在这种情况下,每个用户ID将有多个行。请按照以下步骤操作:

while(resultSet.next()){
  long userId = resultSet.getLong("user_id");
  UserVO uvo = //populate the userVO with users table data
  do{
    //create List of *unique* contactVO, transactionVO and addressVO set them to userVO
  }while(resultSet.next() && resultSet.getLong("user_id") == userId);

  //check if resultSet is over? else user_id changes move back one row
  if(!resultSet.isAfterLast())
    resultSet.previous();
  else
    break; //resultset exhausted
}

如您所见,您基本上从结果集中除去组件。并且 凌乱。我宁愿反对它。