问题描述
假如目前有一个查询用户详情的接口
用户基础表关联了很多用户其他信息的表,现在要把所有查询出来,是使用多个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层的处理要简单很多。但复用性不够
希望能基于相关程序设计思想上,对这两种方式的选择给予相关的解答,或者有其他设计实现方法。不胜感激
都会用吧,具体情况具体分析。
第一种方式dao层代码可以复用,但是由于拆分成多个sql,会发送多个sql让mysql去执行。
第二种方式一次发送,对于连接表少的情况下可以选择这种方式,连接表多的情况下还是选择第一种方式。
很多数据不需要完全从数据库中获取,比如从数据库查询出一些数据,然后根据查询出来的数据再到缓存中去取其他数据。
我现在所在的公司数据库军规中有一条明确表示:
禁止使用三个表以上的关联查询