在业务中是使用多个Dao组合好,还是一个链接查询好?

问题描述

假如目前有一个查询用户详情的接口
用户基础表关联了很多用户其他信息的表,现在要把所有查询出来,是使用多个dao在service中组合,还是直接链接查询好

示例代码

用户表(user_base)
用户信息表1(user_info_1)
用户信息表2(user_info_2)
用户信息表3(user_info_3)
...
用户信息表n(user_info_n)

多个dao查询返回

@Service
public class UserDetailServiceImpl implements UserService{
    
    @Autowired
    private UserBaseDao userBaseDao;
    @Autowired
    private UserInfoDao1 userInfoDao1;
    @Autowired
    private UserInfoDao2 userInfoDao2;
    
    @Override
    public UserInfoVo getDetail(String userId){
        UserInfoVo userInfoVo = new UserInfoVo ();
        
        // 多个dao获取相关要返回的信息
        UserBase userBase = userBaseDao.getByUserId(userId);
        UserInfo1 userInfo1 = userInfoDao1.getByUserId(userId);
        UserInfo2 userInfo2 = userInfoDao2.getByUserId(userId);
        
        // 最后返回的VO类各种set信息返回给前台
        userInfoVo.set(dao1返回结果);
        ...
        ... 
        userInfoVo.set(daoN返回结果);
         
        return userInfoVo ;
    }
    
}

链接查询

@Service
public class UserDetailServiceImpl implements UserService{
    
    @Autowired
    private UserBaseDao userBaseDao;
    
    @Override
    public UserInfoVo getDetail(String userId){
        
        // 单个dao内用链接查询返回一个VO类
        UserInfoVo userInfoVo = userBaseDao.getDetail(userId);    
        
        // 查询的sql伪代码
        String sql = 
        "select '要返回字段' from user_base
        left join user_info_1 on user_base.user_id = user_info_1.user_id
        left join user_info_2 on user_base.user_id = user_info_2.user_id
        ...
        left join user_info_n on user_base.user_id = user_info_n.user_id
        where user_base.user_id = :userId";
        
        // 这里就可以省略各种set
    
        return userInfoVo ;
    }
    
}

相关疑问

使用第一种多个Dao组合返回数据,在Service层各种set虽然要复杂一些,但感觉上,耦合性没有那么高,各个部分dao都很独立,也可以在其他地方复用

使用第二种方法,除了要自己手写很长的sql语句,Service层的处理要简单很多。但复用性不够

希望能基于相关程序设计思想上,对这两种方式的选择给予相关的解答,或者有其他设计实现方法。不胜感激

阅读 6.4k
3 个回答

都会用吧,具体情况具体分析。

第一种方式dao层代码可以复用,但是由于拆分成多个sql,会发送多个sql让mysql去执行。
第二种方式一次发送,对于连接表少的情况下可以选择这种方式,连接表多的情况下还是选择第一种方式。

很多数据不需要完全从数据库中获取,比如从数据库查询出一些数据,然后根据查询出来的数据再到缓存中去取其他数据。

我现在所在的公司数据库军规中有一条明确表示:
禁止使用三个表以上的关联查询

两种都要有,各有使用场景,具体到你说的这种情况,适合用sql链接查询。
因为sql链接查询只需要一次数据库IO,而多个dao,需要多次数据库IO,要知道数据库IO是很耗时的。
所以,sql链接查询,把计算交给数据库,相对来说,性能更高一些。

数据量大用第一种,网速不行用第二种

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题