业务分析:
在开发管理系统时,遇到需要将 User 和 对应的 Organization 联表查询起来,找到用户所对应的组织信息
数据库
user表中字段有:user_id、user_name、user_age、user_org_id
organization表字段有:org_id、org_name
entity包下的User类
@Data
public class User{
private Integer userId;
private String userName;
private Integer userAge;
private Integer userOrgId;
}
entity包下的Organization类
@Data
public class Organization{
private Integer orgId;
private String orgName;
}
已有的user对象并不满足查询需求,我们需要得到这样一个包装的对象以便查询下列信息:
user_id、user_name、user_age、user_org_name
故,此业务场景下可以引入vo
创建 vo 包下 UserVo类
@Data
public class UserVo{
private Integer userId;
private String userName;
private Integer userAge;
private String userOrgName; //注意这里的数据类型和名称
}
在 service 包下的 UserService 接口定义查询方法
public interface UserService extends IService<User> {
public List<UserVo> voList(); //定义一个返回我们需要得到的包装对象方法 返回的是UserVo泛型的List集合
}
在 service\impl 包下的 UserServiceImpl 重写方法 编写业务逻辑
首先要明白:我们需要的 UserVo类中信息有两部分,一部分是来自于User类,另外一部分是来自于根据User类的organizationId查询到的对应的Organization的name信息。
因此我们需要首先将UserMapper注入,通过UserMapper类中的 selectList 方法(传入条件为空)查询出所有的User信息
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List<UserVo> voList() {
List<User> userList = this.userMapper.selectList(null); //封装的是一个User泛型的List集合
}
此时userList集合中有了所有的user信息(user_id,user_name,user_age,user_org_id),接下来我们对 userList 进行遍历,拿出user_org_id查询所有对应的组织名称 ==这一步操作=> userList.getUserOrgId(),这里就需要注入 OrganizationMapper ,通过this.organizationMapper.selectOne()方法进行条件查询
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private UserMapper userMapper;
@Resource
private OrganizationMapper organizationMapper;
@Override
public List<UserVo> voList() {
List<User> userList = this.userMapper.selectList(null); //封装的是一个User泛型的List集合
for (User user : userList) { //重命名了userList集合
QueryWrapper<Organization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("org_id",user.getUserOrgId()); //比较数据库中org_id与传入的用户所属组织ID
Organization org = this.organizationMapper.selectOne(queryWrapper); //将条件传入就能拿到一个组织信息
org.getOrgName() //通过get就能拿到这个组织信息中的名称信息
}
} //此时我们有了user信息,以及user对应的组织名称信息,接下来我们只需要封装就可以
封装UserVo
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private UserMapper userMapper;
@Resource
private OrganizationMapper organizationMapper;
@Override
public List<UserVo> voList() {
List<User> userList = this.userMapper.selectList(null);
UserVo userVo = null; //定义一个userVo对象
for (User user : userList) {
userVo = new UserVo(); //每次循环创建一个新的vo对象。下面就是给这个vo对象存值
BeanUtils.copyProperties(user,userVo); //复制属性
QueryWrapper<Organization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("org_id",user.getUserOrgId())
Organization org = this.organizationMapper.selectOne(queryWrapper);
userVo.setOrgName(org.getOrgName()); //将组织名称信息赋值给userVo中的OrgName
}
}
}
注意这里每次封装的是一条UserVo信息,因此我们还需要创建一个数组,存储每次封装好的UserVo
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private UserMapper userMapper;
@Resource
private OrganizationMapper organizationMapper;
@Override
public List<UserVo> voList() {
List<User> userList = this.userMapper.selectList(null);
UserVo userVo = null;
List<UserVo> result = new ArrayList<>(); //最终需要返回的结果集合
for (User user : userList) {
userVo = new UserVo();
BeanUtils.copyProperties(user,userVo);
QueryWrapper<Organization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("org_id",user.getUserOrgId())
Organization org = this.organizationMapper.selectOne(queryWrapper);
userVo.setOrgName(org.getOrgName());
result.add(userVo); //每次userVo封装好,就把它加到result集合中
}
return result; //将结果集返回
}
}
controller层调用
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService; //注入userService
@GetMapping("/list")
public List<UserVo> voList(){
return this.userService.voList();
}
}