我必须设计DAO层,从我调用视图的DAO对象,它返回给我所有的数据。下面是场景:
当我进行客户搜索时,它会向我返回他的联系方式,交易详情,地址详情。
最后我得到了所有数据,它指的是个别实体(addressvo,transactionvo和contectvo)。
如果我遍历结果集,这里如何分隔数据并将其分配给我的Value对象?
此致 Chaitu
答案 0 :(得分:0)
不要只在一个DAO中转储整个代码。有四个DAO。一个好的设计是每桌有一个DAO。因此,您有AddressDAO
,TrandactionDAO
,ContactDAO
和UserDAO
。如果你应该有四张桌子,
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
}
如您所见,您基本上从结果集中除去组件。并且 凌乱。我宁愿反对它。