- 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查询)取决于具体业务场景和需求。下面分别分析两种方式的优缺点:
- 多个Dao组合查询:
- 优点:通常情况下,单表查询性能优于多表JOIN查询,尤其在数据量非常大的情况下更为明显。如果各表之间的关联性不是很强,或者在不需要一次性获取所有关联数据的情况下,分多个查询可以提高系统的并发处理能力和可扩展性。
-
缺点:如果频繁地进行多个查询操作,可能会增加数据库的访问次数,从而可能影响整体性能。另外,应用层需要处理更多的逻辑来拼接和组装结果。
-
单个链接查询(JOIN查询):
- 优点:能够在一个SQL语句中完成对多个表的数据查询,减少与数据库的交互次数,简化应用层的逻辑处理。在数据关联紧密且需要一次性获取所有关联信息时,JOIN查询更为高效和直观。
- 缺点:如果JOIN涉及的表数量较多或数据量较大,可能导致查询性能下降,甚至可能产生大量冗余数据,占用更多内存资源。此外,过度依赖JOIN查询可能使数据库设计和查询逻辑变得复杂,不易于维护。
综上所述,在实际业务开发中,应根据实际场景权衡利弊,灵活运用。例如,对于一些复杂的报表统计类需求,可能更适合使用JOIN查询;而对于需要高并发读写的业务场景,则可能更倾向于使用多个简单、独立的单表查询。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

