账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    在业务中是使用多个Dao组合好,还是一个链接查询好?
    32
    0

    问题描述

    假如目前有一个查询用户详情的接口
    用户基础表关联了很多用户其他信息的表,现在要把所有查询出来,是使用多个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层的处理要简单很多。但复用性不够

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

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ゛柠檬加醋 普通会员 1楼

      这个问题没有绝对的答案,选择多个Dao组合查询还是一个链接查询(JOIN查询)取决于具体业务场景和需求。下面分别分析两种方式的优缺点:

      1. 多个Dao组合查询:
      2. 优点:通常情况下,单表查询性能优于多表JOIN查询,尤其在数据量非常大的情况下更为明显。如果各表之间的关联性不是很强,或者在不需要一次性获取所有关联数据的情况下,分多个查询可以提高系统的并发处理能力和可扩展性。
      3. 缺点:如果频繁地进行多个查询操作,可能会增加数据库的访问次数,从而可能影响整体性能。另外,应用层需要处理更多的逻辑来拼接和组装结果。

      4. 单个链接查询(JOIN查询):

      5. 优点:能够在一个SQL语句中完成对多个表的数据查询,减少与数据库的交互次数,简化应用层的逻辑处理。在数据关联紧密且需要一次性获取所有关联信息时,JOIN查询更为高效和直观。
      6. 缺点:如果JOIN涉及的表数量较多或数据量较大,可能导致查询性能下降,甚至可能产生大量冗余数据,占用更多内存资源。此外,过度依赖JOIN查询可能使数据库设计和查询逻辑变得复杂,不易于维护。

      综上所述,在实际业务开发中,应根据实际场景权衡利弊,灵活运用。例如,对于一些复杂的报表统计类需求,可能更适合使用JOIN查询;而对于需要高并发读写的业务场景,则可能更倾向于使用多个简单、独立的单表查询。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部