比如:论坛的帖子类 Topic, 会关联一个用户类 User
public Class Topic //论坛帖子类
{
  private User postuser;
  .......................
}
在数据访问层里 TopicDAO  一个方法: GetTopicListByFroum(int forum)我觉的有两种方法从数据库获得 Topic 关联的 postuser 对象方法一:
如果调用 UserDAO 获取相应的 postuser对象的话 GetTopicList(int forumId) 
ResultSet rs = stmt.executeQuery("SELECT * FROM Topic where forum=forumId");
while(rs.next)
{
  Topic topic=New Topic();
  topic.setId(rs.getInt("id"))
  topic.setTitle(rs.getString("title"));
  int userid=rs.getInt("userId")
  topic.setPostUser(UserDAO.getUserById(userid)); //
  .............................
}方法二 :
ResultSet rs = stmt.executeQuery("Select * from topic join user on topic.postuser=user.id  where topic.id=id ");
while(rs.next)
{
  Topic topic=New Topic();
  topic.setId(rs.getInt("id"))
  topic.setTitle(rs.getString("title"));
  User postuser=New User()         //--查询关联着User表----
  postuser.setId(rs.getInt("userid"))
  postuser.setName(rs.getString("name"))
  topic.setPostUser(postuser); 
  .............................
}
请问你用哪种方法 还是有比这更好的方法

解决方案 »

  1.   

    肯定第二个呀
    本来就应该用表关系呀,关系型数据库嘛
    sql语句执行的会比较快呀!
      

  2.   

    第二种
    好得设计是压力交给database,而不是交给application,
      

  3.   

    第一种维护起来简单.很好的重用. 但是如果返回10个topic的话就的在查User表10次 用11次
    第二种维护起来就很麻烦了.但就查询数据库1次
      

  4.   

    第二种
    好得设计是压力交给database,而不是交给application,
      

  5.   

    方法二 :
    ResultSet rs = stmt.executeQuery("Select * from topic join user on topic.postuser=user.id  where topic.id=id ");
    while(rs.next)
    {
      Topic topic=New Topic();
      topic.setId(rs.getInt("id"))
      topic.setTitle(rs.getString("title"));
      User postuser=New User()         //--查询关联着User表----
      postuser.setId(rs.getInt("userid"))
      postuser.setName(rs.getString("name"))
      topic.setPostUser(postuser); 
      .............................
    }
      

  6.   

    第二种
    make up some users and messages and then test
      

  7.   

    从效率上说,当然是方法二,但是从架构上说,首选方法一。理由是方法二不符合开闭原则。开闭原则是设计的基本原则,其表述是:程序设计应该为修改而关闭,为扩展而开放。对于类的设计,更要遵守开闭原则。方法一将User对象的setter/getter方法的调用交给了UserDAO,是很好的设计;反观方法二,一旦User类需要扩展一个除了UserID和UserName外的第三个属性(不妨称为NewField),那么方法二的代码就必须更改如下:  
      User postuser=New User() ;       
      postuser.setId(rs.getInt("userid"));
      postuser.setName(rs.getString("name"));
      postuser.setNewField(rs.getString("newField"));//加入该行,且要修改前面的SQL语句,不符合开闭原则
      

  8.   

    第一种,如果在大型应用开发过程中,还是这样的好一些... 而join的语法和两次普通的查询比较 我更倾向于两次查询 因为双表关联查询在某些数据库上并不会获得很好的性能还会给数据库服务器造成很大的压力.
      

  9.   

    第二种。第一种在读取ResultSet的循环当中还要多次进行另外的查询,让人十分不爽,效率要低很多,稳定性也较差。